关键词:
在实际的工作中,单片机的头文件和功能函数不可能同全部放在同一个文件夹下面,我们把单片机成长之路(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的区别 从... 查看详情