单片机成长之路(51基础篇)-015关于sdcc的多文件编译范例二(代码片段)

jikexianfeng jikexianfeng     2022-12-29     412

关键词:

  在实际的工作中,单片机的头文件和功能函数不可能同全部放在同一个文件夹下面,我们把单片机成长之路(51基础篇) - 009 关于sdcc的多文件编译范例的代码进行从新拆分,然后把头文件归类到一个文件夹(include/)下面,便于管理。

拆分前文件目录结构:

├── delay.c
├── delay.h
├── main.c
└── makefile

拆分侯生成以下文件:

├── include      //头文件文件夹
│   ├── delay.c    //延时文件的头文件
│   ├── delay.h
│   ├── led.c     //led灯头文件
│   ├── led.h
│   └── macro.h    //宏定义头文件
├── main.bin      //编译结果
├── main.c        //主函数
└── makefile      //make文件

文件内容如下:

main.c

#include "include/delay.h"
#include "include/macro.h"
#include "include/led.h"

void main(void)
    while(1)
        led_0_7(100);
    

makefile(本文件做了改动,增加个头文件路径的变量include)

# CC 编译工具声明
# stc 烧录工具位置
# 功能是编译并完成下载
CC    =sdcc
stc =sudo python /home/jikexianfeng/51-demo/.stcflash/stcflash.py
include = ./include/

all : main.bin 

download: main.bin
    $(stc) main.bin

#main.bin : main.hex
#    ~/51-demo/.Hex2bin-2.5/hex2bin main.hex

main.bin : main.hex
    objcopy -I ihex -O binary main.hex main.bin
    
main.hex : main.ihx
    packihx main.ihx > main.hex

main.ihx : main.rel delay.rel led.rel
    $(CC) main.rel led.rel delay.rel

main.rel : main.c $(include)delay.c $(include)macro.h
    $(CC) -c main.c
    
led.rel : $(include)led.c $(include)delay.c $(include)macro.h
    $(CC) -c $(include)led.c
    
delay.rel : $(include)delay.c $(include)macro.h
    $(CC) -c $(include)delay.c

cleanall:
    rm -rf *.lk *.bin *.asm *.lst *.mem *.rst *.lnk *.rel *.sym *.ihx *.hex *.map
clean:
    rm -rf *.asm *.lst *.mem *.rst *.lnk *.rel *.sym *.ihx *.hex *.map *.lk

include/macro.h

1 #ifndef MACRO_H
2 #define MACRO_H
3 
4 #include "8051.h"
5 
6 #define uint unsigned int 
7 #define uchar unsigned char
8 
9 #endif

include/macro.h

1 #ifndef LED_H
2 #define LED_H
3 #include"macro.h"
4 
5 void led_0_7(uint xms);
6 
7 #endif

include/led.h

#include "delay.h"
#include "macro.h"

uchar tab[8] = 0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80;

void led_0_7(uint xms)
    uchar i;
    for(i=0;i<8;i++)
        P1 = tab[i];
        Delay(xms);
    

include/delay.c

1 #include "delay.h"
2 #include"macro.h"
3 
4 void Delay(uint xms)
5         uint i,j;
6         for(i=xms;i>0;i--)
7         for(j=110;j>0;j--);
8 

include/delay.h

1 #ifndef DELAY_H
2 #define DELAY_H
3 
4 #include"macro.h"
5 
6 void Delay(uint xms);
7 
8 #endif

 

单片机成长之路(51基础篇)-016常见总线类型(代码片段)

1、首先看看它名字真正的含义: SPI(SerialPeripheralInterface:串行外设接口); I2C(INTERICBUS:意为IC之间总线) UART(UniversalAsynchronousReceiverTransmitter:通用异步收发器) USART:通用同步异步收发器 USB:UniversalSerialBUS(通 查看详情

单片机成长之路(51基础篇)-018keil51的startup.a51(代码片段)

STARTUP.A51原始文件:1$NOMOD51;Ax51宏汇编器控制命令,禁止预定义的8051。使编译器不使能预定义的;8051符号,避免产生重复定义的错误。2;------------------------------------------------------------------------------3;ThisfileispartoftheC51Compilerpackage4;Copy... 查看详情

单片机成长之路(51基础篇)-007ch340ch341最全说明

pmargin-bottom:0.25cm;direction:ltr;line-height:120%;text-align:justify;orphans:0;widows:0比较全的CH340,CH341应用说明CH340以前用USB转串口时图方便一般也都是直接买现成的USB转串口模块,但是后面设计需要,不等不将CH340这个模块集成到电路板中,... 查看详情

单片机成长之路(51基础篇)-002stc单片机冷启动和复位有什么区别

  STC单片机简介  STC单片机是一款增强型51单片机,完全兼容MCS-51,还增加了新的功能,比如新增两级中断优先级,多一个外中断,内置EEPROM,硬件看门狗,具有掉电模式,512B内存等。还支持ISP下载,不用编程器,只要一个... 查看详情

单片机成长之路(51基础篇)-023n76e003系统时钟切换到外部时钟(代码片段)

   N76e003切换到外部时钟的资料很少(因为N76e003的片子是不支持无源晶振的,有源晶振的成本又很高,所以网上很少有对N76e003的介绍)。有图有真相:代码如下:main.c1#include<N76E003.H>2#include<SFR_Macro.h>3#include<Function_... 查看详情

单片机成长之路(51基础篇)-017c51中data,idata,xdata,pdata的区别(转)

从数据存储类型来说,8051系列有片内、片外程序存储器,片内、片外数据存储器,片内程序存储器还分直接寻址区和间接寻址类型,分别对应code、data、xdata、idata以及根据51系列特点而设定的pdata类型,使用不同的存储器,将使... 查看详情

单片机成长之路(51基础篇)-022n76e003aprom模拟eeprom驱动(代码片段)

  N76e003单片机内部没有EEPROM,但是可以使用 APROM模拟EEPROM功能,代码如下:eeprom.h1#ifndef_EEPROM_H_2#define_EEPROM_H_34//EEPROM指令5#defineBYTE_PROGRAM_AP0x21//APROM字节编程(数据写入)6#definePAGE_ERASE_AP0x22//APROM页擦除(128字节)7#defineBYTE_Read_AP... 查看详情

单片机成长之路(avr基础篇)-003avr单片机的boot区

  BOOT区的由来基于一个简单的道理,即单片机的程序是保存在FLASH中的,要运行程序就必须不停的访问FLASH存储器。对于一般的FLASH存储器,数据的写入需要一定的时间来完成,在数据写入完成之前,存储器中所有的数据都是... 查看详情

单片机成长之路(51基础篇)-02051单片机寄存器功能一览表

...介绍一个技巧:其地址能被8整除的都可以位寻址)。在51单片机内部有一个CPU用来运算、控制,有四个并行I/O口,分别是P0、P1、P2、P3,有ROM,用来存放程序,有RAM,用来存放中间结果,此外还有定时/计数器,串行I/O口,中断系... 查看详情

我的大学成长之路(cust)

       总得写一写大学吧,毕竟,这是四年的青春,磨练与蜕变…目录篇一:关于生活篇二:关于竞赛篇三:关于考研篇四:关于保研篇五:关于学习篇六:关于圈子篇七:关于爱好篇... 查看详情

基于免费的sdcc开发51单片机

intel的51系列单片机一直都作为电子爱好者的入门首选,它有着编程简单易于理解的特点。虽然目前16位、32位,甚至多核MCU早已大行其道,但C51因其寄存器数量少,结构简单,入门方便被广大爱好者所喜爱。过... 查看详情

基于免费的sdcc开发51单片机

intel的51系列单片机一直都作为电子爱好者的入门首选,它有着编程简单易于理解的特点。虽然目前16位、32位,甚至多核MCU早已大行其道,但C51因其寄存器数量少,结构简单,入门方便被广大爱好者所喜爱。过... 查看详情

sdcc和keil之stc89c52资料(纪念51单片机40周年)(代码片段)

使用Linux环境进行单片机教学已经3年了,反馈一般,部分学生给出差评,也在情理之中。为何选择SDCC,一开始就明确说明了,不是keil不好,但是很贵啊,课程尊重知识产权,不鼓励x行为。关于代... 查看详情

51单片机入门-sdcc/keil_c51会让没有调用的函数参与编译吗?(代码片段)

...ndows10STC89C52RCSDCC(构建HEX文件)stcgal1.6(向STC单片机烧录)修改代码中的数值会改变编译后的结果显然,在我们修改一些C语言代码的时候,编译后的二进制文件也可能发生改变,尤其是一些关键的数值... 查看详情

基于免费的sdcc开发51单片机

intel的51系列单片机一直都作为电子爱好者的入门首选,它有着编程简单易于理解的特点。虽然目前16位、32位,甚至多核MCU早已大行其道,但C51因其寄存器数量少,结构简单,入门方便被广大爱好者所喜爱。过... 查看详情

sdcc和keil之stc89c52资料(纪念51单片机40周年)(代码片段)

使用Linux环境进行单片机教学已经3年了,反馈一般,部分学生给出差评,也在情理之中。为何选择SDCC,一开始就明确说明了,不是keil不好,但是很贵啊,课程尊重知识产权,不鼓励x行为。关于代... 查看详情

51cto学院四周年-成长之路

...         51CTO学院四周年-成长之路  时间飞逝!蓦然回首2014,却感觉昨天才步入学院,眼下已过去四年。认识学院,是一个美丽的开始,或者说领我来到这知识殿堂的是一位老师-王佩丰老... 查看详情

程序员的成长之路jquery篇

很久没写JS了,或者说自从工作以来都没怎么写过JS,最近在开发要用到JS,瞬间懵逼了.立即去菜鸟找入门教材来看,磕磕碰碰的总算搞定了。以下是学习过程中碰到的问题以及自己的理解。一:jquery.js和jquery.min.js的区别  从... 查看详情