版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、单片机程序设计基础单片机程序设计基础 在简单了解单片机原理的基础上,我们就可以在简单了解单片机原理的基础上,我们就可以试着编一些简单的程序,以便提高单片机系统的认试着编一些简单的程序,以便提高单片机系统的认识,同时培养单片机的编程能力。本章以项目和任识,同时培养单片机的编程能力。本章以项目和任务为内容,由浅入深、循序渐进,介绍单片机资源务为内容,由浅入深、循序渐进,介绍单片机资源的利用以及简单系统程序设计的思想,达到培养单的利用以及简单系统程序设计的思想,达到培养单片机程序设计能力目标。另外,每一个项目的程序片机程序设计能力目标。另外,每一个项目的程序可以在可以在KileKile软件中编写,也
2、可以通过软件仿真和硬软件中编写,也可以通过软件仿真和硬件仿真观察程序运行的结果。件仿真观察程序运行的结果。3.1 单片机驱动一个单片机驱动一个LED闪闪烁烁 单片机的单片机的I/OI/O口可以直接驱动一些器件,通口可以直接驱动一些器件,通过单片机运行程序,达到单片机对一些器件的过单片机运行程序,达到单片机对一些器件的控制。控制。LEDLED是一种常用的显示器件,单片机的是一种常用的显示器件,单片机的I/OI/O可以直接驱动。本节任务是利用单片机的一可以直接驱动。本节任务是利用单片机的一个个I/OI/O口驱动口驱动LEDLED电路,设计程序使其闪烁。在电路,设计程序使其闪烁。在了实现了实现P0.
3、0P0.0口驱动负载特点基础上掌握程序设口驱动负载特点基础上掌握程序设计一般方法,同时还要掌握单片机系统仿真、计一般方法,同时还要掌握单片机系统仿真、程序下载的一般过程。程序下载的一般过程。 3.1.1 电路原理电路原理 STC-89C51STC-89C51单片机的单片机的P0P0口采用为口采用为ODOD门输出,高门输出,高电平输出时不存在拉出电流,但电平输出时不存在拉出电流,但P0P0口输出低电平口输出低电平时,时,P0P0口灌入电流达到口灌入电流达到2020毫安,因此毫安,因此P0P0只具有较只具有较强的低电平驱动能力。如果利用强的低电平驱动能力。如果利用P0P0驱动门电路以驱动门电路以及
4、如及如LEDLED这样的小功率负载,必须加上拉电阻,这样的小功率负载,必须加上拉电阻,否则,即使编程让否则,即使编程让P0P0输出高电平,但是实际只能输出高电平,但是实际只能输出低电平。输出低电平。 图图3-1-13-1-1是单片机驱动是单片机驱动LEDLED电路,图中电路,图中 P0.0 P0.0 端端口与电源之间接有一个电阻口与电源之间接有一个电阻R2R2,当,当P0.0P0.0口输出低电口输出低电平时,从电源正极出发经过电阻的电流通过平时,从电源正极出发经过电阻的电流通过P0.0P0.0口口进入单片机,进入单片机,LEDLED的正极为低电平,此时的正极为低电平,此时LEDLED不亮,不亮
5、,当此时当此时P0P0口输出高电平时,经过电阻的电流无法进口输出高电平时,经过电阻的电流无法进入入P0.0P0.0端口,只能通过端口,只能通过LEDLED,此时,此时LEDLED亮。这种亮。这种LEDLED驱驱动方式为高电平有效方式。动方式为高电平有效方式。P0.7P0.7驱动驱动LEDLED采用的是低采用的是低电平有效方式,直接了利用了电平有效方式,直接了利用了P0P0口的低电平驱动能口的低电平驱动能力。当力。当P0.7P0.7端口输出高电平时,端口输出高电平时,LEDLED不亮,只有当不亮,只有当P0.7P0.7端口输出低电平时,端口输出低电平时,LEDLED才亮。才亮。 图图3-1-1
6、单片机驱动单片机驱动LED电路原理电路原理3.1.2 程序设计与编译程序设计与编译一、程序设计一、程序设计 单片机内部的单片机内部的P0P3寄存寄存器都可以进行位操器都可以进行位操 作,作,P0P3对应的端口即单对应的端口即单片机的片机的32个个I/O口会输出口会输出P0P3的结果。本例实的结果。本例实现现LED闪烁,只要让闪烁,只要让P0.0电平周期性变化即电平周期性变化即可。程序流程见图可。程序流程见图3-1-2所示所示。图图3-1-2 LED闪闪烁程序流程烁程序流程 在在KielKiel程序设计软件中,程序设计软件中,P0.0P0.0口定义为口定义为P00P00,因此在利用因此在利用C
7、C语言程序设计时,要想让语言程序设计时,要想让P0.0P0.0为低电平,为低电平,只要编写只要编写P00 = 0P00 = 0一条语句即可。为了是程序简单一条语句即可。为了是程序简单明了,也可以利用明了,也可以利用sbitsbit LED1 = P00 LED1 = P00语句,让语句,让LED1LED1代替代替P00P00。本案例的程序清单如下:。本案例的程序清单如下:/*/#include /包含头文件包含头文件sbit LED1 = P00; / LED接接P0.0。在。在kell C51软件中,软件中, /定义定义P0.0为为sbit sbit LED2 = P07; void del
8、ay(unsigned char x) /延时函数延时函数unsigned char i,j;for(i = 0;i x;i+)for(j = 0;j 200;j+);void main(void) /主函数主函数while(1) /程序死循环程序死循环 LED1 = 0; /P0.0输出低电平,输出低电平,LED1灭灭 delay(100); /调用延时函数,延时一段时间,约调用延时函数,延时一段时间,约0.3秒,秒,/不精确不精确 LED1 = 1; /P0.0输出高电平,输出高电平,LED1亮亮 delay(100); /*/二、程序说明二、程序说明 (1)因为使用的单片机芯片为)因为使
9、用的单片机芯片为STC89C51,因此,因此程序包含程序包含reg51.h文件,文件,reg51.h文件定义了文件定义了51单片机单片机所有特殊功能寄存器的名称定义和相对应的地址值;所有特殊功能寄存器的名称定义和相对应的地址值; (2)单片机程序顺序执行程序,先执行主函数,)单片机程序顺序执行程序,先执行主函数,在主函数内可以调用分函数,分函数可以调用分函在主函数内可以调用分函数,分函数可以调用分函数,但分函数不能调用主函数,程序执行一条命令数,但分函数不能调用主函数,程序执行一条命令再执行下一条,执行完毕后返回到主函数入口进行再执行下一条,执行完毕后返回到主函数入口进行下次循环。延时的过程是
10、单片机执行了一个下次循环。延时的过程是单片机执行了一个delay(100)函数而浪费一段时间。在执行)函数而浪费一段时间。在执行delay()的过()的过程中,如果没有中断单片机只能忙这一件事,程中,如果没有中断单片机只能忙这一件事, 单片机在执行此函数相关指令时浪费和占用的时间单片机在执行此函数相关指令时浪费和占用的时间就是执行延时函数获得的时间,但利用就是执行延时函数获得的时间,但利用delay()()不不能得到精确的延时。延时函数还可以利用带有形参能得到精确的延时。延时函数还可以利用带有形参的函数实现,例如:的函数实现,例如:/*/void delay(unsigned int x)wh
11、ile (x)x-;/*/ (3)利用位定义命令让)利用位定义命令让LED等价于等价于P0.0,程序执,程序执行行LED1 = 1后,后,P0.0对以的单片机内部位寄存器就对以的单片机内部位寄存器就设置为高电平,设置为高电平,P0.0端口输出高电平,单片机的所有端口输出高电平,单片机的所有I/O口都可位位定义,也可以字节定义。口都可位位定义,也可以字节定义。 (4)单片机)单片机C语言程序设计需要的语言程序设计需要的C语言关键字不语言关键字不多,并且在多,并且在keil C 中用到的关键字是独有的,因此对中用到的关键字是独有的,因此对于没有学习过于没有学习过C语言的人学习单片机语言的人学习单片
12、机C语言程序设计语言程序设计困难并不是很大,重点掌握单片机困难并不是很大,重点掌握单片机C语言书写格式和语言书写格式和怎样用怎样用C语言控制单片机的硬件资源皆可;另外,在语言控制单片机的硬件资源皆可;另外,在编程时,还要有清晰的逻辑思维头脑和认真实践,编程时,还要有清晰的逻辑思维头脑和认真实践,由浅逐步深入学习,当你坚持到最后时,单片机由浅逐步深入学习,当你坚持到最后时,单片机C语语言程序设计会让你感觉很简单。言程序设计会让你感觉很简单。 (5)每个人在利用)每个人在利用C语言编写单片机程序时都有自己语言编写单片机程序时都有自己的风格。一般情况下,函数的字符左行距为的风格。一般情况下,函数的字
13、符左行距为0,其下每条,其下每条语句前留一个语句前留一个“tab”键空。算数逻辑符号的左右各留一个键空。算数逻辑符号的左右各留一个空格,关键语句要有中文或英文说明,每一个函数有时也空格,关键语句要有中文或英文说明,每一个函数有时也可以用可以用“/*.*/”上下隔开,这样有助于提高程序的层上下隔开,这样有助于提高程序的层次感和可读性。次感和可读性。三、程序编译三、程序编译 程程序设计采用第二章介绍的序设计采用第二章介绍的KielKiel软件。针对本节软件。针对本节例子,在电脑上运行例子,在电脑上运行KielKiel,首先新建一个项目,项,首先新建一个项目,项目使用的单片机为目使用的单片机为AT8
14、9C51AT89C51,这个项目暂且命名为,这个项目暂且命名为LEDLED;然后新建一个文件,并保存为;然后新建一个文件,并保存为”LED.cLED.c”文件,文件,并添加到工程项目中。由于本案例程序比较简单,并添加到工程项目中。由于本案例程序比较简单,可以直接在可以直接在KeilKeil软件界面中编写,也可以先把程序软件界面中编写,也可以先把程序清单形成一个清单形成一个TXTTXT文件,然后剪切到文件,然后剪切到KeilKeil的程序编辑的程序编辑界面中。当程序设计完成后,通过界面中。当程序设计完成后,通过KielKiel编译并创建编译并创建LED.HEXLED.HEX目标文件,见图目标文件
15、,见图3-1-33-1-3所示。所示。 在在KeilKeil的应用过程中,由于编译过程成产生的应用过程中,由于编译过程成产生很多文件很多文件, ,因此新建一个项目需在一个目录中建因此新建一个项目需在一个目录中建立。立。KeilKeil软件创建的软件创建的HEXHEX文件可以下载到单片机文件可以下载到单片机的程序存储器中运行,也可以被仿真软件调用。的程序存储器中运行,也可以被仿真软件调用。 图图3-1-3 Keil软件目标文件创建软件目标文件创建3.1.3 汇编语言嵌入汇编语言嵌入 在使用在使用C语言所开发的项目中,有时需要写一语言所开发的项目中,有时需要写一些汇编语言的程序,以提高程序的精炼和
16、精确度。些汇编语言的程序,以提高程序的精炼和精确度。如本例中的如本例中的delay()函数延时不够精确,可以使()函数延时不够精确,可以使用汇编语言实现时间延迟,提高延时的精确程度。用汇编语言实现时间延迟,提高延时的精确程度。在一个项目中要加入汇编语言程序时,有两种方法,在一个项目中要加入汇编语言程序时,有两种方法,第一种方法是使用第一种方法是使用Inline assembly,也就是在程序中也就是在程序中直接加入汇编语言码,如以下的程序所示:直接加入汇编语言码,如以下的程序所示:/*延时函数延时函数*/ void delay100us() #pragra endasm more: mov R
17、3,#48 djnz R3,$ djnz R7,more #pragma endasm /*/ 在上面的程序中,直接加入汇编语言码时是使用在上面的程序中,直接加入汇编语言码时是使用编译指令编译指令#pragma asm 和和#pragma endasm。编译指。编译指令令#pragma asm 和和#pragma endasm 之间则加入您需之间则加入您需要的汇编语言代码。这一段程序主要是实现要的汇编语言代码。这一段程序主要是实现100微秒微秒时间延迟,使用汇编语言我们可以通过如表时间延迟,使用汇编语言我们可以通过如表3-1-1所所示的计算方法估计出延迟时间大约是示的计算方法估计出延迟时间大约
18、是0.1ms。最后还最后还有一条返回指令有一条返回指令ret,所以总共需要,所以总共需要100条指令,如果条指令,如果外接外接12MHz的石英晶体时,每执行一条指令需要的石英晶体时,每执行一条指令需要1s,所以执行这一个子程序总共需要所以执行这一个子程序总共需要100s,也就是也就是0.1s.但是这只是一个估计值,因为执行子程序时如果有但是这只是一个估计值,因为执行子程序时如果有中断发生,就会造成执行时间增加。中断发生,就会造成执行时间增加。执行的指令执行的指令 执行次数执行次数 指令执行周指令执行周期期 计算结果计算结果 More:mov R3,#48 111djnz R3,$ 148 29
19、6djnz R7,more 122表表3-1-1 计算方法计算方法 第二种做法是将汇编语言的程序写在一个文件中,第二种做法是将汇编语言的程序写在一个文件中,然后再从主程序中调用这些使用汇编语言写的子程序。然后再从主程序中调用这些使用汇编语言写的子程序。 C语言主程序调用汇编语言子程序时,必须注意到,语言主程序调用汇编语言子程序时,必须注意到,累加器(累加器(accumulator)和寄存器给的内容都必须自行)和寄存器给的内容都必须自行维护,如果维护不当,可能会造成不可预期的结果。一维护,如果维护不当,可能会造成不可预期的结果。一般而言,可以在进入汇编语言程序之后,马上将累加器般而言,可以在进入汇编语言程序之后,马上将累加器A和寄存器和寄存器R0R7推入堆栈当中,等到要离开汇编语推入堆栈当中,等到要离开汇编语言程序之前再使用言程序之前再使用POP指令,将累加器指令,将累加器A和寄存器和寄存器R0R7从堆栈中取出,但是要特别注意,堆栈推入与取从堆栈中取出,但是要特别注意,堆栈推入与取出的顺序是相反的,也就是先进者后出,后进者先出。出的顺序是相反的,也就是先进者后出,后进者先出。 3.1.4 软件仿真软件仿真 在安装过在安装过ProteusProteus软件的软件的PCPC上运行上运行ISISISIS文件,即文件,即可进入可进入ProteusP
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 分裂情感性精神病
- 防震疏散演练主题班会
- 2024年非公路矿用车项目投资申请报告代可行性研究报告
- 3.3.2盐类的水解影响因素及应用 课件 高二上学期化学人教版(2019)选择性必修1
- 智慧航安培训方案
- 吉林省2024七年级数学上册第1章有理数阶段综合训练范围1.9~1.14课件新版华东师大版
- 生命安全教育我的烦恼
- 草原上教案及教学反思
- 食堂食品安全培训
- 水利资源利用审批管理办法
- 中小学-消防安全知识教育-课件
- 2023年中国人民银行清算总中心招聘考试真题
- 职业院校“金课”建设方案
- 新质生产力-讲解课件
- 组织行为与领导力智慧树知到期末考试答案2024年
- 30道计量员岗位常见面试问题含HR问题考察点及参考回答
- 医保基金监管知识考试题库300题(含答案)
- 校园欺凌谈话记录表
- 220千伏变电站现场运行通用规程
- 海绵城市建设难点与对策
- 幼儿园《交通工具(火车篇)家长代课》PPT课件
评论
0/150
提交评论