本帖最后由 dgdz2013 于 2016-6-21 21:08 编辑
本文以STC89系列单片机为例,重点训练读者的C语言基础和单片机的程序设计能力。
项目1 P0.0接口驱动LED闪烁
闪烁控制是安全灯、高层建筑、高空飞行器、警示灯等设备灯光闪烁控制的原理基础,也是单片机项目学习过程中最简单的项目。这里我们做为一个项目设计,详细叙述项目实现的基本过程。
1.电路设计
电路硬件是单片机项目实现的基础,在项目设计过程中必须先设计项目的电路原理。为了提高程序和电路的联调效果,我们采用Proteus软件设计单片机项目的仿真电路,当程序设计完成后,可在仿真系统中直接加载程序验证程序设计的完整性。
(a)低电平驱动 (b)高电平驱动图1 P0接口驱动LED电路
LED闪烁电路参考图1b低电平直接驱动方式。项目设计时,应先根据项目的原理图利用Proteus软件设计仿真电路图,下面重新说明Proteus使用过程。
(1)打开Proteus软件的ISIS程序并保存文件
一个项目包含程序和电路两部分,因此在使用Proteus软件的设计电路时,应首先考虑仿真电路文件的目录。在学习项目设计过程中,建立科学的项目目录结构对于养成良好的项目开发习惯有很多益处,因为真正进行单片机项目开发时,你所做的一切都很重要。项目1所在的目录结构见图2所示。
图2 项目1目录结构
操作过程中,首先打开Proteus ISIS程序,鼠标左键点击File→Save Design As,在弹出的窗口中选择合适路径,然后点击“创建新文件夹”并命名为“项目1-LED闪烁”;然后进入这个文件夹后,再创建一个新文件夹命名为“电路”。再一次进入“电路”文件夹中,这时才对要保存电路文件命名,比如“LED闪烁”。
(2)Proteus ISIS设计电路
使用Proteus进行原理图设计主要操作为放置元器件和连线。本项目所使用的单片机型号虽然为STC89C51,但在Proteus中是51内核的单片机都可以使用。这里选择Micropocessor Ics-8051 Family中的80C51。Proteus原理图中的单片机电路符号,含有完整的单片机最小系统模型,并且电源默认连接完好。仿真电路设计见图3所示,为了使LED达到显示效果,上拉电阻R1取值为470欧姆,实际应用要取值大一些。电路设计完成后,再次保存设计,下面就可以设计程序了。
图3 项目1的仿真电路图
2.程序设计
本项目采用Keil软件进行设计,基本操作共4个步骤,分别是创建一个项目、新建C文件、程序设计、生成HEX文件。创建项目和新建C文件比较简单,这里不再详细说明,但要注意,在打开Keil软件时,新建的工程必须保存在项目1目录下的程序中,新建一个C文件,应保存为main.c,并加载到工程中。
(1)程序设计
由于单片机内部的P0~P3寄存器都可以进行位操作,程序设计过程中,可以利用程序对P0.0位直接操作即可控制LED的闪烁。
C51定义P0.0为P0^0,因此在利用C语言程序设计时,可使P0.0输出高、低电平,如P0.0输出低电平,程序中编写P0^0 为0即可。为了使程序简单明了,可以利用sbit LED = P0^0语句,让LED代替P0^0。
在程序编写过程中,项目程序设计的一般顺序是先写#include<reg51.h>,然后编写主函数,用到LED时,才在程序的预处理区写“sbit LED = P0^0;”,用到延时函数时才在主函数前面写void delay(unsigned int x)函数。千万不要按照提供的程序一步一步地照抄,因为这样等于自己没有一个完整的编程思路。本项目的具体程序为
#include<reg51.h> //包含头文件 sbit LED = P0^0; // LED接P0.0。在kell C51软件中,定义P0.0为P0^0, void delay(unsigned int x) //延时函数 { while(x--); } void main(void) //主函数 { LED =0; //P0.0输出低电平,LED1灭 delay(50000); //调用延时函数,延时一段时间,约0.3秒,不精确 LED ==1; //P0.0输出高电平,LED1亮 delay(50000); }
(2)程序说明
1)本项目中,单片机型号为STC89C51,因此程序包含reg51.h文件,reg51.h文件定义了51单片机所有特殊功能寄存器的名称定义和相对应的地址值。
2)单片机程序顺序执行,先执行主函数,在主函数内可以调用子函数,子函数可以调用子函数,但子函数不能调用主函数。单片机程序从主函数入口依次执行每一条指令,执行完毕后返回到主函数入口进行下次循环。
3)延时函数。延时的过程是程序执行了一个延时函数delay()。在主函数调用延时的过程中,如果单片机没有中断发生,单片机只能忙于执行这个延时函数。
单片机在执行延时函数相关指令时,每一条指令都会占用一定数量的机器周期,执行完延时函数的所有指令,浪费或占用的时间就是调用延时函数所获得的延时时间,但执行延时函数不能得到精确的延时时间。
4)利用位定义命令让LED等价于P0.0位,程序执行LED1=1后,单片机内部位寄存器P0.0位就设置为高电平,同时P0.0端口就会输出高电平。单片机的所有I/O接口都可以进行位操作,也可以字节操作。
5)利用C语言编写单片机程序时,每个人都有自己的风格。虽然C语言格式自由,但作为单片机的程序语言,具有严格的书写格式。为了提高单片机C语言程序的可读性,增加程序页的层次感,一般情况下,函数的字符左边距为0,函数体每条语句前留一个“tab”键空;算数逻辑符号的左右各留一个空格,关键语句要有中文或英文注释,关键函数有时需要用“/**...**/”说明,并把主函数所在的程序命名为main.c。
6)实际应用中,把LED换成继电器或其它驱动电路,就可以让单片机间接驱动一个大功率的负载,如额定电压为交流220V、200W的红色的灯泡闪烁。图4电路为安全灯闪烁驱动电路,双向光电晶闸管型号为MOC3061,再加上一级晶闸管VTH,可以实现更大功率的负载驱动。
图4 单片机大功率交流负载驱动
3.程序编译并创建HEX文件
程序编译是检验程序设计格式或代码错误的过程。如果程序在编译过程中出错,会在Keil的编译结果栏中进行提示。程序的调试修改过程一般先用鼠标左键双击最上面的错误提示进行修改,然后再编译,一直到无错误、无警告为止。
HEX文件是单片机可以执行的二进制文件,程序编译无误后可以通过Keil软件创建一个HEX文件。在工具栏中Project→Options For Target ‘target 1’→Output窗口中选中“Create HEX Fi”,再编译时,Keil即可创建一个HEX文件,这个文件自动保存在项目程序的目录下。 可将Keil软件创建的HEX文件直接下载到实验开发板上的单片机中运行,也可以加载到仿真电路中的单片机内运行。
4.软件仿真
软件仿真是一种单片机系统测试,在没有硬件的条件下,利用Protuse进行软件仿真可以快速检验单片机程序设计的正确性。本项目在仿真时,需要利用Protuse先画出项目的参考电路,然后把本项目程序创建的HEX文件加载到单片机中,最后单击运行即可可以看到本项目LED闪烁的效果。
Proteus是单片机程序设计的重要仿真工具,但软件仿真不能测试软件的安全性和可靠性,也不能测试电路电气特性的完整性。单片机的程序设计或相关产品开发必须有相关的软件和硬件实验支撑。本项目中,为了进一步验证程序的可靠性,可以把程序下载到实验开发板或实验箱中的单片机内进行实际运行。
因为本项目比较简单,初学者在了解项目的设计过程后可亲自动手设计电路并编写程序,实现项目的功能和要求。如果能看到成功的仿真结果,一定会有成就感,这就是项目设计的兴趣所在。
在完成了P0.0驱动LED闪烁项目程序设计后,我们就可以在此基础上增加一些器件,如利用P0驱动8只LED按照一定顺序闪烁,进一步学习单片机I/O口的输出控制原理。
由于篇幅所限,后续10个经典项目将不在此贴出,如果大家需要,小编将在以后陆续为大家补上。它们分别是:
流水灯程序设计(项目2) 数码管0~9显示程序设计(项目3) 单片机系统的按键(项目4) 利用外部中断实现按键的输入(项目5) 单只数码管秒显示(项目6) 6位数码管动态显示(项目7) PC与MCS-51系列单片机的串行通信(项目8) 电子表程序设计(项目9) 单片机片内看门狗定时器的使用(项目10) 单片机片内A-D转换器的使用(项目11)
**选自《单片机开发从入门到精通》白林峰等编著
小编特意拿出该书全部25个项目的实例资料提供给大家。
获取方式:关注公众号(机械工业出版社E视界),回复“52034”
|