版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1 单片机程序设计基础单片机程序设计基础 在简单了解单片机原理的基础上,我们就可以在简单了解单片机原理的基础上,我们就可以 试着编一些简单的程序,以便提高单片机系统的认试着编一些简单的程序,以便提高单片机系统的认 识,同时培养单片机的编程能力。本章以项目和任识,同时培养单片机的编程能力。本章以项目和任 务为内容,由浅入深、循序渐进,介绍单片机资源务为内容,由浅入深、循序渐进,介绍单片机资源 的利用以及简单系统程序设计的思想,达到培养单的利用以及简单系统程序设计的思想,达到培养单 片机程序设计能力目标。另外,每一个项目的程序片机程序设计能力目标。另外,每一个项目的程序 可以在可以在KileKil
2、e软件中编写,也可以通过软件仿真和硬软件中编写,也可以通过软件仿真和硬 件仿真观察程序运行的结果。件仿真观察程序运行的结果。 2 3.1 单片机驱动一个单片机驱动一个LED闪闪 烁烁 单片机的单片机的I/OI/O口可以直接驱动一些器件,通口可以直接驱动一些器件,通 过单片机运行程序,达到单片机对一些器件的过单片机运行程序,达到单片机对一些器件的 控制。控制。LEDLED是一种常用的显示器件,单片机的是一种常用的显示器件,单片机的 I/OI/O可以直接驱动。本节任务是利用单片机的一可以直接驱动。本节任务是利用单片机的一 个个I/OI/O口驱动口驱动LEDLED电路,设计程序使其闪烁。在电路,设计
3、程序使其闪烁。在 了实现了实现P0.0P0.0口驱动负载特点基础上掌握程序设口驱动负载特点基础上掌握程序设 计一般方法,同时还要掌握单片机系统仿真、计一般方法,同时还要掌握单片机系统仿真、 程序下载的一般过程。程序下载的一般过程。 3 3.1.1 电路原理电路原理 STC-89C51STC-89C51单片机的单片机的P0P0口采用为口采用为ODOD门输出,高门输出,高 电平输出时不存在拉出电流,但电平输出时不存在拉出电流,但P0P0口输出低电平口输出低电平 时,时,P0P0口灌入电流达到口灌入电流达到2020毫安,因此毫安,因此P0P0只具有较只具有较 强的低电平驱动能力。如果利用强的低电平驱
4、动能力。如果利用P0P0驱动门电路以驱动门电路以 及如及如LEDLED这样的小功率负载,必须加上拉电阻,这样的小功率负载,必须加上拉电阻, 否则,即使编程让否则,即使编程让P0P0输出高电平,但是实际只能输出高电平,但是实际只能 输出低电平。输出低电平。 4 图图3-1-13-1-1是单片机驱动是单片机驱动LEDLED电路,图中电路,图中 P0.0 P0.0 端端 口与电源之间接有一个电阻口与电源之间接有一个电阻R2R2,当,当P0.0P0.0口输出低电口输出低电 平时,从电源正极出发经过电阻的电流通过平时,从电源正极出发经过电阻的电流通过P0.0P0.0口口 进入单片机,进入单片机,LEDL
5、ED的正极为低电平,此时的正极为低电平,此时LEDLED不亮,不亮, 当此时当此时P0P0口输出高电平时,经过电阻的电流无法进口输出高电平时,经过电阻的电流无法进 入入P0.0P0.0端口,只能通过端口,只能通过LEDLED,此时,此时LEDLED亮。这种亮。这种LEDLED驱驱 动方式为高电平有效方式。动方式为高电平有效方式。P0.7P0.7驱动驱动LEDLED采用的是低采用的是低 电平有效方式,直接了利用了电平有效方式,直接了利用了P0P0口的低电平驱动能口的低电平驱动能 力。当力。当P0.7P0.7端口输出高电平时,端口输出高电平时,LEDLED不亮,只有当不亮,只有当 P0.7P0.7
6、端口输出低电平时,端口输出低电平时,LEDLED才亮。才亮。 5 图图3-1-1 单片机驱动单片机驱动LED电路原理电路原理 6 3.1.2 程序设计与编译程序设计与编译 一、程序设计一、程序设计 单片机内部的单片机内部的P0P3寄存寄存 器都可以进行位操器都可以进行位操 作,作, P0P3对应的端口即单对应的端口即单 片机的片机的32个个I/O口会输出口会输出 P0P3的结果。本例实的结果。本例实 现现LED闪烁,只要让闪烁,只要让 P0.0电平周期性变化即电平周期性变化即 可。程序流程见图可。程序流程见图3-1-2 所示所示。 图图3-1-2 LED闪闪烁程序流程烁程序流程 7 在在Kie
7、lKiel程序设计软件中,程序设计软件中,P0.0P0.0口定义为口定义为P00P00, 因此在利用因此在利用C C语言程序设计时,要想让语言程序设计时,要想让P0.0P0.0为低电平,为低电平, 只要编写只要编写P00 = 0P00 = 0一条语句即可。为了是程序简单一条语句即可。为了是程序简单 明了,也可以利用明了,也可以利用sbit LED1 = P00sbit LED1 = P00语句,让语句,让LED1LED1 代替代替P00P00。本案例的程序清单如下:。本案例的程序清单如下: 8 /*/ #include /包含头文件包含头文件 sbit LED1 = P00; / LED接接P
8、0.0。在。在kell C51软件中,软件中, /定义定义P0.0为为sbit sbit LED2 = P07; void delay(unsigned char x) /延时函数延时函数 unsigned char i,j; for(i = 0;i x;i+) for(j = 0;j 200;j+); 9 void main(void) /主函数主函数 while(1) /程序死循环程序死循环 LED1 = 0; /P0.0输出低电平,输出低电平,LED1灭灭 delay(100); /调用延时函数,延时一段时间,约调用延时函数,延时一段时间,约0.3秒,秒, /不精确不精确 LED1 =
9、1; /P0.0输出高电平,输出高电平,LED1亮亮 delay(100); /*/ 10 二、程序说明二、程序说明 (1)因为使用的单片机芯片为)因为使用的单片机芯片为STC89C51,因此,因此 程序包含程序包含reg51.h文件,文件,reg51.h文件定义了文件定义了51单片机单片机 所有特殊功能寄存器的名称定义和相对应的地址值;所有特殊功能寄存器的名称定义和相对应的地址值; (2)单片机程序顺序执行程序,先执行主函数,)单片机程序顺序执行程序,先执行主函数, 在主函数内可以调用分函数,分函数可以调用分函在主函数内可以调用分函数,分函数可以调用分函 数,但分函数不能调用主函数,程序执行
10、一条命令数,但分函数不能调用主函数,程序执行一条命令 再执行下一条,执行完毕后返回到主函数入口进行再执行下一条,执行完毕后返回到主函数入口进行 下次循环。延时的过程是单片机执行了一个下次循环。延时的过程是单片机执行了一个delay (100)函数而浪费一段时间。在执行)函数而浪费一段时间。在执行delay()的过()的过 程中,如果没有中断单片机只能忙这一件事,程中,如果没有中断单片机只能忙这一件事, 11 单片机在执行此函数相关指令时浪费和占用的时间 单片机在执行此函数相关指令时浪费和占用的时间 就是执行延时函数获得的时间,但利用就是执行延时函数获得的时间,但利用delay()()不不 能得
11、到精确的延时。延时函数还可以利用带有形参能得到精确的延时。延时函数还可以利用带有形参 的函数实现,例如:的函数实现,例如: /*/ void delay(unsigned int x) while (x) x-; /*/ 12 (3)利用位定义命令让)利用位定义命令让LED等价于等价于P0.0,程序执,程序执 行行LED1 = 1后,后,P0.0对以的单片机内部位寄存器就对以的单片机内部位寄存器就 设置为高电平,设置为高电平,P0.0端口输出高电平,单片机的所有端口输出高电平,单片机的所有 I/O口都可位位定义,也可以字节定义。口都可位位定义,也可以字节定义。 (4)单片机)单片机C语言程序设
12、计需要的语言程序设计需要的C语言关键字不语言关键字不 多,并且在多,并且在keil C 中用到的关键字是独有的,因此对中用到的关键字是独有的,因此对 于没有学习过于没有学习过C语言的人学习单片机语言的人学习单片机C语言程序设计语言程序设计 困难并不是很大,重点掌握单片机困难并不是很大,重点掌握单片机C语言书写格式和语言书写格式和 怎样用怎样用C语言控制单片机的硬件资源皆可;另外,在语言控制单片机的硬件资源皆可;另外,在 编程时,还要有清晰的逻辑思维头脑和认真实践,编程时,还要有清晰的逻辑思维头脑和认真实践, 由浅逐步深入学习,当你坚持到最后时,单片机由浅逐步深入学习,当你坚持到最后时,单片机C
13、语语 言程序设计会让你感觉很简单。言程序设计会让你感觉很简单。 13 (5)每个人在利用)每个人在利用C语言编写单片机程序时都有自己语言编写单片机程序时都有自己 的风格。一般情况下,函数的字符左行距为的风格。一般情况下,函数的字符左行距为0,其下每条,其下每条 语句前留一个语句前留一个“tab”键空。算数逻辑符号的左右各留一个键空。算数逻辑符号的左右各留一个 空格,关键语句要有中文或英文说明,每一个函数有时也空格,关键语句要有中文或英文说明,每一个函数有时也 可以用可以用“/*.*/”上下隔开,这样有助于提高程序的层上下隔开,这样有助于提高程序的层 次感和可读性。次感和可读性。 14 三、程序
14、编译三、程序编译 程程序设计采用第二章介绍的序设计采用第二章介绍的KielKiel软件。针对本节软件。针对本节 例子,在电脑上运行例子,在电脑上运行KielKiel,首先新建一个项目,项,首先新建一个项目,项 目使用的单片机为目使用的单片机为AT89C51AT89C51,这个项目暂且命名为,这个项目暂且命名为 LEDLED;然后新建一个文件,并保存为;然后新建一个文件,并保存为”LED.c”LED.c”文件,文件, 并添加到工程项目中。由于本案例程序比较简单,并添加到工程项目中。由于本案例程序比较简单, 可以直接在可以直接在KeilKeil软件界面中编写,也可以先把程序软件界面中编写,也可以先
15、把程序 清单形成一个清单形成一个TXTTXT文件,然后剪切到文件,然后剪切到KeilKeil的程序编辑的程序编辑 界面中。当程序设计完成后,通过界面中。当程序设计完成后,通过KielKiel编译并创建编译并创建 LED.HEXLED.HEX目标文件,见图目标文件,见图3-1-33-1-3所示。所示。 15 在在KeilKeil的应用过程中,由于编译过程成产生的应用过程中,由于编译过程成产生 很多文件很多文件, ,因此新建一个项目需在一个目录中建因此新建一个项目需在一个目录中建 立。立。KeilKeil软件创建的软件创建的HEXHEX文件可以下载到单片机文件可以下载到单片机 的程序存储器中运行,
16、也可以被仿真软件调用。的程序存储器中运行,也可以被仿真软件调用。 图图3-1-3 Keil软件目标文件创建软件目标文件创建 17 3.1.3 汇编语言嵌入汇编语言嵌入 在使用在使用C语言所开发的项目中,有时需要写一语言所开发的项目中,有时需要写一 些汇编语言的程序,以提高程序的精炼和精确度。些汇编语言的程序,以提高程序的精炼和精确度。 如本例中的如本例中的delay()函数延时不够精确,可以使()函数延时不够精确,可以使 用汇编语言实现时间延迟,提高延时的精确程度。用汇编语言实现时间延迟,提高延时的精确程度。 在一个项目中要加入汇编语言程序时,有两种方法,在一个项目中要加入汇编语言程序时,有两
17、种方法, 第一种方法是使用第一种方法是使用Inline assembly,也就是在程序中也就是在程序中 直接加入汇编语言码,如以下的程序所示:直接加入汇编语言码,如以下的程序所示: 18 /*延时函数延时函数*/ void delay100us() #pragra endasm more: mov R3,#48 djnz R3,$ djnz R7,more #pragma endasm /*/ 19 在上面的程序中,直接加入汇编语言码时是使用在上面的程序中,直接加入汇编语言码时是使用 编译指令编译指令#pragma asm 和和#pragma endasm。编译指。编译指 令令#pragma
18、asm 和和#pragma endasm 之间则加入您需之间则加入您需 要的汇编语言代码。这一段程序主要是实现要的汇编语言代码。这一段程序主要是实现100微秒微秒 时间延迟,使用汇编语言我们可以通过如表时间延迟,使用汇编语言我们可以通过如表3-1-1所所 示的计算方法估计出延迟时间大约是示的计算方法估计出延迟时间大约是0.1ms。最后还最后还 有一条返回指令有一条返回指令ret,所以总共需要,所以总共需要100条指令,如果条指令,如果 外接外接12MHz的石英晶体时,每执行一条指令需要的石英晶体时,每执行一条指令需要1s, 所以执行这一个子程序总共需要所以执行这一个子程序总共需要100s,也就
19、是也就是0.1s. 但是这只是一个估计值,因为执行子程序时如果有但是这只是一个估计值,因为执行子程序时如果有 中断发生,就会造成执行时间增加。中断发生,就会造成执行时间增加。 20 执行的指令执行的指令 执行次数执行次数 指令执行周指令执行周 期期 计算结果计算结果 More:mov R3,#48 111 djnz R3,$ 148 296 djnz R7,more 122 表表3-1-1 计算方法计算方法 21 第二种做法是将汇编语言的程序写在一个文件中,第二种做法是将汇编语言的程序写在一个文件中, 然后再从主程序中调用这些使用汇编语言写的子程序。然后再从主程序中调用这些使用汇编语言写的子程
20、序。 C语言主程序调用汇编语言子程序时,必须注意到,语言主程序调用汇编语言子程序时,必须注意到, 累加器(累加器(accumulator)和寄存器给的内容都必须自行)和寄存器给的内容都必须自行 维护,如果维护不当,可能会造成不可预期的结果。一维护,如果维护不当,可能会造成不可预期的结果。一 般而言,可以在进入汇编语言程序之后,马上将累加器般而言,可以在进入汇编语言程序之后,马上将累加器 A和寄存器和寄存器R0R7推入堆栈当中,等到要离开汇编语推入堆栈当中,等到要离开汇编语 言程序之前再使用言程序之前再使用POP指令,将累加器指令,将累加器A和寄存器和寄存器 R0R7从堆栈中取出,但是要特别注意,堆栈推入与取从堆栈中取出,但是要特别注意,堆栈推入与取 出的顺序是相反的,也就是先进者后出,后进者先出。出的顺序是相反的,也就是先进者后出,后进者先出。 22 3.1.4 软件仿真软件仿真 在安装过在安装过ProteusProteus软件的软件的PCPC上运行上运行ISISISIS文件,即文件,即 可进入可进入Proteus
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024简单家具维修合同范本
- 2024年加工承揽合同标的与质量标准
- 2024建筑材料采购合同范本下载
- 2024年度公园绿化树苗采购合同
- 2024年山东潍坊物业委托管理合同
- 迷雾解说课件教学课件
- 2024年度互联网金融产品研发与推广合同
- 04版智能家居系统研发与销售合同
- 2024年度云服务提供商合同
- 2024年店铺投资合作协议
- 护理质量安全与风险管理的案例分析
- 工程流体力学课后习题答案-(杜广生)
- AI智能客服应用实践
- 《止吐药临床应用》课件
- 幕墙工程检验批质量验收记录
- 危险化学品经营企业安全生产奖惩制度范本
- 报价单模板完
- 30题药品质量检测岗位常见面试问题含HR问题考察点及参考回答
- 《婴幼儿行为观察、记录与评价》期末试卷及答案 卷3
- 企业战略管理概述
- 消防安全概述
评论
0/150
提交评论