收藏 分享(赏)

单片机C语言编程(定时器计数器)ppt课件.ppt

上传人:顺腾 文档编号:3151569 上传时间:2020-12-05 格式:PPT 页数:101 大小:1.79MB
下载 相关 举报
单片机C语言编程(定时器计数器)ppt课件.ppt_第1页
第1页 / 共101页
单片机C语言编程(定时器计数器)ppt课件.ppt_第2页
第2页 / 共101页
单片机C语言编程(定时器计数器)ppt课件.ppt_第3页
第3页 / 共101页
单片机C语言编程(定时器计数器)ppt课件.ppt_第4页
第4页 / 共101页
单片机C语言编程(定时器计数器)ppt课件.ppt_第5页
第5页 / 共101页
亲,该文档总共101页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

1、单片机单片机C C语言案例教程电子教案语言案例教程电子教案 第1章 单片机基础 第3章 用数码管模拟的循环灯 第4章 中断资源的应用编程 第5章 日历时钟DS1302的应用编程 第6章 AT24C02的应用编程 第7章 DS18B20的应用编程 第8章 有时控功能和温度显示的电子钟项目设计 第9章 1616点阵LED汉字显示屏项目设计 第10章 使用片内EEPROM存储器 第11章 单片机与PC的串行通信 第12章 单片机片外数据存储器的扩充 第13章 A/D转换与D/A转换简介 1 1 第第1 1章章 单片机基础单片机基础 1 我们所说的单片机,是一块集成电路芯片。下面的三个型号的单片机 芯

2、片,都属于8051系列,其品牌为STC。它们的内部组成可认为完全相 同,都能直接用在本书单片机学习板的MCU插座上,但性能有所差异。 左上为STC89C52的实物图,其片内 存储器容量大于STC89C51。 左中为STC90C52的实物图,可替代 STC89C52,且性能更好。 1.1 单片机是块集成电路芯片 左下为STC12C5A32的实物图,是所谓的 1T单片机,其工作速度比上面两个型号快得多 。 2 2 2 512 51系列单片机的内部结构示意图系列单片机的内部结构示意图 3 3 3 513 51系列单片机引脚功能图系列单片机引脚功能图 左图为8051系列单片机的 引脚功能图,它采用双列

3、直插 40引脚封装,它所有引脚的功 能我们要全部记住。 4 4 1.21.2用单片机芯片组成单片机应用系统用单片机芯片组成单片机应用系统 1 本书单片机学习板电原理路图 5 5 2 2 本书单片机学习板印刷电路图本书单片机学习板印刷电路图 6 6 3 3 本书单片机学习板四位数码管电原理图本书单片机学习板四位数码管电原理图 7 7 1.31.3对单片机编程以实现单片机系统的功能对单片机编程以实现单片机系统的功能 案例1:编程实现,在4位数码管的最左位上显示“8。” 案例源程序 #include reg51.h sbit qw= P20; main() P0=0; qw=0 ; 程序的第1行称为

4、预处理命令 。 第2行是定义位寻址变量。 第3行第7行是程序的主函数。C程序是由若干个C函 数组成,其中必须有一个也只能有一个名为“main”的函数 。main函数就是主函数。第3行称为函数头,第4行第7行 称为函数体,第4行的大括号“”称为函数体的开始标志,第 7行的“”称为函数体的结束标志,开始标志与结束标志之间 是若干语句。语句以分号“;”为结束标志。 这个程序运行时的所有功能,是由两个赋值语句具体实现:赋值语句 “P0=0;”使口0的8个引脚,即单片机芯片的第39、38、37、36、35、34 、33、32全部输出低电平,从而使四位数码管的所有(32只)发光二极管 的负极均为低电平;赋

5、值语句“qw=0”使口2的最低位引脚,即单片机芯片 的第21脚为低电平,这就使单片机学习板上的PNP管Q3的基极为低电平而 导通,从而使最左边位数码管的8只发光二极管正极为高电平。 8 8 1.41.4把程序写入单片机芯片的操作平台和操作步骤把程序写入单片机芯片的操作平台和操作步骤 1 首先,在桌面上双击Keil的图标,如下图箭头所指。 一 建立工程文件 9 9 2 2 系统进入该软件的初始界面,如下图系统进入该软件的初始界面,如下图 1010 3 3 在上一图中,须单击菜单栏中的在上一图中,须单击菜单栏中的ProjectProject菜单及其子菜单菜单及其子菜单 New Project ,N

6、ew Project ,如下图所示。如下图所示。 1111 4 4 于是弹出建立新于是弹出建立新nVisionznVisionz工程项目对话框工程项目对话框, ,如下图:如下图: 在上图的“保存在(I)”下拉列表框中选择D盘下的“stc89c52” 文件夹,在文件名文本框中,输入工程名“stc89c52”,然后单击“ 保存”。此时,系统将弹出CPU选择窗口,如下页图。 1212 5 5 在列表框中选择并展开在列表框中选择并展开“ “Atmel”Atmel”,如下图箭头所指,如下图箭头所指 1313 6 6 展开展开“ “Atmel”Atmel”项后如下图项后如下图 在上图中往下拉滚动条,选中“

7、AT89C52”,如下页图 。 1414 7 7 如下图,选中后单击确定。随后,在弹出的询问框中,如下图,选中后单击确定。随后,在弹出的询问框中, 选择选择“ “是(是(Y Y)” ”即可。即可。 1515 二二 建立程序文件建立程序文件 1 在菜单栏中单击“File”菜单及其子菜单“New”子菜单, 此时在工作界面中会弹出一文本编辑窗口,如下图。 说明:单片机程序的编写,就是在上面这一窗口中进行 。 1616 2 2 把在四位数码管左边显示把在四位数码管左边显示“8 8。”的的C C源程序,从键盘上照源程序,从键盘上照 敲进去。如下图。敲进去。如下图。 1717 3 3 程序敲完后,单击程序

8、敲完后,单击“ “File”File”菜单及其子菜单菜单及其子菜单“ “Save”Save”,如下图,如下图 1818 4 4 在其弹出的对话框中的文件名文本框中输入相应的文件名在其弹出的对话框中的文件名文本框中输入相应的文件名 “ “stc89c52.c”stc89c52.c”,如下图,如下图 注意:这里必须输入C51源程序的扩展名“.c”来保存。 1919 第三步,把程序文件加载到工程项目中。第三步,把程序文件加载到工程项目中。 1 1 在在Project WindowsProject Windows窗口内,展开窗口内,展开Tageget 1Tageget 1,右击,右击 Source G

9、roup1Source Group1,如下图。,如下图。 2020 4 右击后出现如下界面 在上图菜单中单击“Add Files to Group Source Group1”, 则弹出如下页对话框。 2121 5 5 选中选中“ “stc89c52”stc89c52”文件后单击文件后单击“ “Add”Add”按钮,再单击按钮,再单击 “ “Clese”Clese”按钮,则加载工作结束。如下图按钮,则加载工作结束。如下图。 2222 此时若展开此时若展开Source Group1Source Group1,就能看到,就能看到stc89c52.cstc89c52.c已经已经 加入其中。如下图。加

10、入其中。如下图。 2323 第四步,设置编译和链接环境。第四步,设置编译和链接环境。 1 1 单击单击ProjectAProjectA菜单及其子菜单菜单及其子菜单option for target Target1,option for target Target1, 如下图。如下图。 2424 将弹出编译链接设置界面将弹出编译链接设置界面, ,如下图。如下图。 2525 在上图中,单击在上图中,单击OutputOutput标签后,在复选框标签后,在复选框Great HEX FiGreat HEX Fi:上:上 打打 ,其余可用默认值,然后确定,其余可用默认值,然后确定, ,如下图如下图。 26

11、26 第五步,编译成第五步,编译成HEXHEX文件。单击文件。单击ProjectProject菜单及其子菜单菜单及其子菜单Ruild all Ruild all target filestarget files,系统就将,系统就将.C.C源程序文件编译成指定格式的源程序文件编译成指定格式的.HEX.HEX文件文件. . 如下图。如下图。 上图编译信息窗中最后一行告诉我们,源程序有0个错误和0个警告。这是最好 结论。有1个错误都不能通过编译,必须针对错误提示信息进行修改。对警告 则可改可不改。 2727 第六步第六步, ,将第五步产生将第五步产生.HEX.HEX文件下载到单片机芯片中。把单文件下

12、载到单片机芯片中。把单 片机学习板上的电源和串口连线与片机学习板上的电源和串口连线与PCPC机接通机接通, ,用鼠标依次单用鼠标依次单 击击“ “开始开始”“”“程序程序”“”“STC_ISP_V4.80” STC_ISP_V4.80”,STC_ISP_V4.80” STC_ISP_V4.80”,就进就进 入如下界面入如下界面. . 2828 在在MCUMCU类型的下拉列表框中选择类型的下拉列表框中选择” ”STC89C52RC”,STC89C52RC”,再单再单 击击” ”打开程序文件打开程序文件” ”按钮按钮, ,弹出弹出” ”Open file(*.hex or *.bin)Open f

13、ile(*.hex or *.bin)对话对话 框框. .如下图如下图. . 2929 先在上图的下拉列表框中打开先在上图的下拉列表框中打开“ “D:STC89C52”D:STC89C52”文件夹,随之文件夹,随之 就出现就出现“ “STC8051.hex”STC8051.hex”文件,单击该文件后再单击文件,单击该文件后再单击“ “打开打开” ”按按 钮,就返回到下载界面,如下图。钮,就返回到下载界面,如下图。 按下载软件的提示,关闭一下单片机电源再打开,就可看到下载过程 和进度,下载完成后,就可看到单片机四位数码管左边显示的”8。”。 3030 案例案例1 1下载过程与运行效果下载过程与运

14、行效果 3131 1.5 1.5 从数码管显示学单片机编程从数码管显示学单片机编程 1.5.1 案例2:数码管上的“8。8。”显示 1 源程序 #include reg51.h sbit qw= P20; sbit bw= P21;/增加的一个位寻址变量定义 main() P0=0; qw=0; bw=0; /增加的一个赋值语句 2 源程序分析:本程序用三个赋值语句实现了它的功能。第一 个赋值语句使P0代表的口0的8条I/O引脚输出低电平,从而使四 位数码管共32个发光二极管的负极为低电平;第二个赋值语句 、第三个赋值语句分别使口2的最低两位引脚输出低电平,从而 使PNP管Q2、Q3导通,进而

15、使左边两位数码管的共阳极上为高 电平。于是,左边两位数码管上的发光二极管全亮。也就是, 在四位数码管的左边显示出“8。8。”。 3232 3 3 用流程图表示算法用流程图表示算法 案例2程序的流程图案例1程序的流程图 用自然语言描述操作步骤用C 语句描术操作步骤 3333 4 4 仿案例仿案例1 1程序的上机操作全过程,完成案例程序的上机操作全过程,完成案例2 2程序的下载和运行程序的下载和运行 5 案例2程序的下载操作与运行效果 3434 1.5.2 1.5.2 案例案例3 3:被动形式的:被动形式的“ “8051”8051”显示显示 #include reg51.h sbit qw=P20

16、;/定义MCU管脚P2.0位寻址变量名 sbit bw=P21;/定义MCU管脚P2.1位寻址变量名 sbit sw=P22;/定义MCU管脚P2.2位寻址变量名 sbit gw=P23;/定义MCU管脚P2.3位寻址变量名 void main() qw=1;/这四个语句的作用是关断四位数码管 bw=1; sw=1; gw=1; P0=0 x80;/赋8的笔段码 qw=0; /接通千位上的数码管 qw=1; /关断千位上的数码管 P0=0 xc0;/赋0的笔段码 bw=0; bw=1; P0=0 x92;/赋5的笔段码 sw=0; sw=1; P0=0 xf9;/赋1的笔段码 gw=0; gw

17、=1; 1 源程序 3535 2 2 案例源程序要点分析:案例源程序要点分析: 本案例中对四位数码管的每一位都要进行控制,因此要定义四个位寻址 变量:qw、bw、sw和gw。主函数由五个执行段组成。第一执行段有四个赋 值语句,作用是关断四个数码管的显示;第二段有三个赋值语句,作用是在 数码管的第1位(从左数到右,下同)上显示“8”后关断;第三段是在数码管 的第2位上显示“0”后关断;第四段是在数码管的第3位上显示“5”后关断;第 五段是在数码管的第4位上显示“1”后关断。 3 案例3程序的流程图 3636 4 4 案例案例3 3程序的下载过程与运行效果程序的下载过程与运行效果 3737 15.

18、315.3案例案例4 4:主动形式的:主动形式的“ “8051”8051”显示显示 3 物理现象解惑:案例3中本应一闪而过的“8051”变成了显 示长在的“8051”,其原因在于编译系统。单片机程序是在 编译系统的迫使下,被动地重复运行,“8051”的显示才永 不休止。下面的程序,是程序自己主动地进行“8051”的重 复显示。从视觉效果上看,被动形式的“8051”,比主动形 式的“8051”亮度要小。 1 对案例3程序的基本分析:在案例3中,main函数中的最后 一个操作是“gw=1;”,这就是关掉第4位数码管的显示,按此程序 设计的本来效果,数码管上显示的“8051”应是一闪而过,此后 数码

19、管因全部被关断而无任何显示。 2 案例3程序的一个推论:编译系统有个特殊处理,即在 main函数结束而返回的指令处,加了一条跳转指令,迫使单 片机程序重新运行。 3838 4 源程序 #include reg51.h sbit qw=P20;/定义MCU管脚P2.0位寻址变量名 sbit bw=P21;/定义MCU管脚P2.1位寻址变量名 sbit sw=P22;/定义MCU管脚P2.2位寻址变量名 sbit gw=P23;/定义MCU管脚P2.3位寻址变量名 void main() while(1) /循环结构 qw=1; /这四个语句的作用是关断四位数码管 bw=1; sw=1; gw=1

20、; P0=0 x80; /赋8的笔段码 qw=0; /接通千位上的数码管 qw=1; /关断千位上的数码管 P0=0 xc0; /赋0的笔段码 bw=0; bw=1; P0=0 x92; /赋5的笔段码 sw=0; sw=1; P0=0 xf9; /赋1的笔段码 gw=0; gw=1; 3939 案例源程序要点分析: 与案例3的源程序相比,案例4 源程序中的5个执行段,被一 个while循环架构所管辖。在此 ,先简单地说明一个要点,当 while后面的小括号中是整数1 是,它大括号中的所有语句, 将被无数轮重复执行。因此, 在案例4程序中,while下面大 括号中的那16个赋值语句,从 上到下

21、依次执行一轮后,又将 回到上面,又从上到下依次执 行一轮,再回到上面,如此永 无休止地循环下去,从而实现 “8051”的正常显示 5 案例程序分析及流程图 流程图 4040 6 6 案例案例4 4的下载操作运行效果的下载操作运行效果 4141 15.415.4案例案例5 5:模块化的:模块化的“ “8051”8051”显示显示 #include reg51.h sbit qw=P20;/定义MCU管脚P2.0位寻址变量名 sbit bw=P21;/定义MCU管脚P2.1位寻址变量名 sbit sw=P22;/定义MCU管脚P2.2位寻址变量名 sbit gw=P23;/定义MCU管脚P2.3位

22、寻址变量名 Disp_led() qw=1; /这四个语句的作用是关断四位数码管 bw=1; sw=1; gw=1; P0=0 x80; /赋8的笔段码 qw=0; /接通千位上的数码管 qw=1; /关断千位上的数码管 P0=0 xc0; /赋0的笔段码 bw=0; bw=1; P0=0 x92; /赋5的笔段码 sw=0; sw=1; P0=0 xf9; /赋1的笔段码 gw=0; gw=1; 1 源程序 4242 void main() while(1) Disp_led(); 4343 案例5这个程序的运行特点是,执行流程从主函数 进入后,就进入其中的while循环,while循环的循

23、环体中 ,只有一个函数调用语句“Disp_led();”,执行这一函数 调用语句,程序执行流程就跳转到Disp_led函数中继续 执行,即从上到下依次执行那16个赋值语句,第16个赋 值语句执行完就是Disp_led函数的结束标志“”,被调函 数运行到其结束标志时,程序执行流程就从被调函数返 回到主调函数原调用处继续往下执行,原调用语句下面 就是循环体的结束标志“”,因此又进入下一次 “Disp_led();”调用,程序执行流程又跳转到Disp_led函 数上执行,Disp_led()执行完毕后又返回到主调函数的循 环结构中,从而形成无数次的 “Disp_led();”函数调用。 4444 5

24、 5 案例案例5 5的下载过程及运行效果的下载过程及运行效果 4545 1.5.51.5.5案例案例6 6:实用型的:实用型的“ “8051”8051”显示显示 1 案例源程序: #include reg51.h sbit qw=P20; /定义MCU管脚P2.0位寻址变量名 sbit bw=P21; /定义MCU管脚P2.1位寻址变量名 sbit sw=P22; /定义MCU管脚P2.2位寻址变量名 sbit gw=P23; /定义MCU管脚P2.3位寻址变量名 Delay() unsigned int i; for(i=1;i500;i=i+1) ; 4646 Disp_led() qw=

25、1; bw=1; sw=1; gw=1; P0=0 x80; qw=0; /接通千位上的数码管 Delay(); /延时 qw=1; /关断千位上的数码管 P0=0 xc0; bw=0; Delay(); bw=1; P0=0 x92; sw=0; Delay(); sw=1; P0=0 xf9; gw=0; Delay(); gw=1; 4747 main() while(1) Disp_led(); 2 案例6程序的流程图 4848 3 3 案例案例6 6程序的下载操作及运行效果程序的下载操作及运行效果 4949 1.6 1.6 案例案例6 6源程序的阅读要点源程序的阅读要点 1 程序的组

26、成 案例6的源程序由三部分组成。 第一部分是预处理部分,预处理命令都是用“#”号打头, 本程序中只有一个文件包含的预处理命令。 第二部分是全局变量定义部分。本程序中有四个定义位 寻址变量的语句。 第三部分是函数定义部分。本程序中定义了三个函数。 2 文件包含命令的作用 文件包含的作用,是将系统或别人的编程文档直 接添进我们的程序中,以提高编程的效率和程序的通 用性。在“REG51.h”这个头文件中,定义了代表单片 机诸多硬件的很多符号,例如P0、P1等等。用文件 包含的手段加进我们的程序中,就省去了自己去定义 的麻烦。文件包含命令具体的操作,就是在编译时把 该文件的全部内容放在该文件包含命令的

27、位置上。 5050 3 定义位寻址变量的作用 用符号来代表单片机的某I/O引脚,从而用对这些符号的赋 值来使对应的I/O脚,输出所指定的高电平或低电平。进而用这 些I/O引脚去控制单片机外围电路。 4 函数的作用 用函数来实现程序的功能,用函数的调用来提高编程的效 率。单片机C程序中,必须有一个且只能有一个名为main的主 函数,还可以有若干其它函数。 5 函数定义的格式要求和组成说明 定义函数的基本格式如下: 函数名() 语句序列 5151 组成说明:函数名可用英文字符标识,函数名后面 的小括号对是函数的标记。函数名及其后的小括号 对组成函数的函数头。函数头后的大括号对表示函 数体,函数体内

28、是若干语句。注意,函数头后面不 能有分号。 6 函数调用语句 C程序中,主函数main可以调用其它函数,而其它 函数都不能调用main函数,但其它函数间可以相互调 用。函数调用可以用函数调用语句来实现。main函数 中的while循环的循环体语句“Disp_led(); ”, Disp_led 函数中的四个“Delay();”语句,都是函数调用语句。 5252 7 案例6源程序的程序架构和函数调用层次图 程序中共有三个函数:main、Disp_led、Delay,其 程序架构见图1-26。当main函数调用Disp_led函数时, main是主调函数,Disp_led是被调函数;当Disp_l

29、ed函 数调用Delay函数时,Disp_led是主调函数,Delay是被 调函数。程序架构和函数调用层次图如下。 5353 8 函数调用时程序执行的流程转移 在案例6中,当程序从main函数运行而执行到函数 调用语句“Disp_led(); ”时,程序执行流程就从main函数 中,跳转到Disp_led函数,就是从其函数头进入 Disp_led函数,并在Disp_led函数中,从上至下依次执 行所有语句。当程序在Disp_led函数中运行而执行到 “Delay();”语句时,执行流程就从Disp_led函数跳转到 Delay函数,也就是从函数头进入Delay函数,当程序执 行流程在Delay

30、函数中执行到Delay函数的结束标志“”时 ,执行流程就从Delay函数返回到Disp_led函数中,具 体就是去执行其调用语句“Delay();”的下一语句。当执行 到Disp_led函数的结束标志“”时,执行流程就从 Disp_led函数,返回到调用它的main函数中,具体位置 就是while循环语句的循环体。 5454 9赋值语句的一般形式和作用 赋值语句的一般形式如下: 变量名=表达式; 其中,变量名用英文字母标识,表达式在本章中 暂时用整数。赋值语句的作用就是把赋值号“=”右边 的数据赋给左边的变量。因此,赋值号“=”不是表示 其左右两边相等的符号,而是表示一种装入操作, 这就是把“

31、=”号右边的数据,装入“=”号左边的“仓库” (变量就是仓库)中。如“i=1;”,就是把数据1装入 变量i中。又如“i=i+1;”,就是把变量i中的数据取出来 加上1后再装入变量i中。 5555 10 对数码管的编程 首先要明确,四位数码管中不能同时有两位以上的数 码管被打开显示。只能一位一位地进行显示。要让数码 管的某一位显示一位数,只需两个赋值语句。一个赋值 语句用来将那个数的笔段码赋给P0,另一个赋值语句用 来将相应的位寻址变量置0。 11 while(1) 语句序列的作用 语句while(1) 语句序列 是语句while(表达式) 语句序 列的特殊形式。 while(1) 语句序列的作

32、用就是让大括号 中的所有子语句永无休止地执行下去。关于while语句的 一般形式和执行规则,见第2章相应内容。 5656 12 for语句号的作用和执行规律 语句for的作用就是让其子句重复执行若干次。例如 ,有下面的程序段: int s,n; s=0; for(n=1;n11;n=n+1) s=s+n; 从循环头for(n+1;n11;n=n+1),可推知,其循环体 要执行10次,循环结束后,变量s的值是55。关于for语 句的一般形式和执行规则,见第2章相应内容。 5757 1.7 REG51.h1.7 REG51.h头文件简介头文件简介 系统中自带的头文件“REG51.h”的全部内容如下

33、: /*- REG51.H Header file for generic 80C51 and 80C31 microcontroller. Copyright (c) 1988-2002 Keil Elektronik GmbH and Keil Software, Inc. All rights reserved. -*/ #ifndef _REG51_H_ #define _REG51_H_ /* BYTE Register */ sfr P0 = 0 x80; sfr P1 = 0 x90; sfr P2 = 0 xA0; sfr P3 = 0 xB0; sfr PSW = 0 xD0

34、; sfr ACC = 0 xE0; sfr B = 0 xF0; sfr SP = 0 x81; sfr DPL = 0 x82; sfr DPH = 0 x83; sfr PCON = 0 x87; sfr TCON = 0 x88; sfr TMOD = 0 x89; 5858 sfr TL0 = 0 x8A; sfr TL1 = 0 x8B; sfr TH0 = 0 x8C; sfr TH1 = 0 x8D; sfr IE = 0 xA8; sfr IP = 0 xB8; sfr SCON = 0 x98; sfr SBUF = 0 x99; /* BIT Register */ /*

35、 PSW */ sbit CY = 0 xD7; sbit AC = 0 xD6; sbit F0 = 0 xD5; sbit RS1 = 0 xD4; sbit RS0 = 0 xD3; sbit OV = 0 xD2; sbit P = 0 xD0; 5959 /* TCON */ sbit TF1 = 0 x8F; sbit TR1 = 0 x8E; sbit TF0 = 0 x8D; sbit TR0 = 0 x8C; sbit IE1 = 0 x8B; sbit IT1 = 0 x8A; sbit IE0 = 0 x89; sbit IT0 = 0 x88; /* IE */ sbi

36、t EA = 0 xAF; sbit ES = 0 xAC; sbit ET1 = 0 xAB; sbit EX1 = 0 xAA; sbit ET0 = 0 xA9; sbit EX0 = 0 xA8; /* IP */ sbit PS = 0 xBC; sbit PT1 = 0 xBB; sbit PX1 = 0 xBA; sbit PT0 = 0 xB9; sbit PX0 = 0 xB8; 6060 /* P3 */ sbit RD = 0 xB7; sbit WR = 0 xB6; sbit T1 = 0 xB5; sbit T0 = 0 xB4; sbit INT1 = 0 xB3

37、; sbit INT0 = 0 xB2; sbit TXD = 0 xB1; sbit RXD = 0 xB0; /* SCON */ sbit SM0 = 0 x9F; sbit SM1 = 0 x9E; sbit SM2 = 0 x9D; sbit REN = 0 x9C; sbit TB8 = 0 x9B; sbit RB8 = 0 x9A; sbit TI = 0 x99; sbit RI = 0 x98; #endif 6161 从上面的代码中,我们看到,该头文件主要是用了 sfr和sbit这两个关键字,去定义了51系列单片机内部所 有寄存器硬件的符号名。如“sfr P0=0 x80

38、”,就用“P0”来 表示单片机内部地址为0X80的特殊功能寄存器。因此 ,我们在程序中就可直接用P0表示地址为0X80处的寄 存器,进而用语句来操作这个寄存器。如果没有用文件 包含的方法包含进来,就只能让我们自己来定义,就要 多做很多工作。基于这个道理,我们要在程序中的第一 行,放上包含这个文件的预处理命令。这样,就能在程 序中,直接使用诸如“P1”,“TH1”“SBUF”等“符号硬件” ,省去了用“0X?”去访问单片机的有关硬件,或自己去 亲自定义这些符号的麻烦 这就是我们总是在程序的开头,写上一条包含 REG51.h文件命令的原因。 6262 3.13.1并驾齐驱的跑马灯并驾齐驱的跑马灯

39、1 案例效果说明:并驾齐驱的跑马灯显示效果由六场显示组成,并字的含义是四 个数码管同步显示同名笔画,即第一场四个数码管都显示笔画a,第二场四个数码 管都显示笔画b,第三场四个数码管都显示笔画c,第四场都显示笔画d、第五场都 显示笔画e,第六场都显示笔画f。程序整个运行过程如下图。 6363 2 案例7源程序 /* - 案例7:并驾齐驱的跑马灯 -*/ #include reg51.h sbit qw = P20;/定义MCU管脚P2.0位寻址变量名 sbit bw = P21; /定义MCU管脚P2.1位寻址变量名 sbit sw = P22; /定义MCU管脚P2.2位寻址变量名 sbit

40、gw = P23; /定义MCU管脚P2.3位寻址变量名 /*-延时子函数-*/ Delay() unsigned int i; for( i =1;i 25000;i+ ) ; 6464 /*- 数码管显示函数 -*/ Disp_led( ) /做准备工作 qw=0; /*开通千位(左边第一位)上的数码管显示*/ bw=0; / 开通百位上的数码管显示 sw=0; / 开通十位上的数码管显示 gw=0; / 开通个位上的数码管显示 /第一场 P0 = 0 xfe; / 把笔划a码赋给P0口 Delay(); / 延时 /第二场 P0 = 0 xfd; / 把单笔划b码赋给P0口 Delay(

41、); / 延时 /第三场 P0 = 0 xfb; / 把单笔划c码赋给P0口 Delay(); / 延时 /第四场 P0 = 0 xf7; / 把单笔划d码赋给P0口 Delay(); / 延时 6565 /第五场 P0 = 0 xef; / 把单笔划e码赋给P0口 Delay(); / 延时 /第六场 P0 = 0 xdf; / 把单笔划f码赋给P0口 Delay(); /延时 /*- 主函数 重复调用显示函数来实现程序功能 -*/ void main() while(1) Disp_led(); 6666 3 案例7程序的流程图 6767 4 案例7程序的下载操作与运行效果 6868 3.

42、23.2迈步边关的巡逻灯迈步边关的巡逻灯 1 案例效果说明: 边关迈步的巡逻灯显示效果由十二场显示组成。第一场显示千位数码管上的 a笔画;第二场显示百位数码管上的a笔画;第三场显示十位数码管上的a笔画; 第四场显示个位数码管上的a笔画;第五场显示个位数码管上的b笔画;第六场 显示个位数码管上的c笔画;第七场显示个位数码管上的d笔画;第八场显示十 位数码管上的d笔画;第九场显示百位数码管上的d笔画;第十场显示千位数码 管上的d笔画;第十一场显示千位数码管上的e笔画;第十二场显示千位数码管 上的f笔画。示意图如下。 6969 2 案例源程序 /* - 案例8:迈步边关的巡逻灯 -*/ #include reg51.h sbit qw = P20;/定义MCU管脚P2.0位寻址变量名 sbit bw = P21; /定义MCU管脚P2.1位寻址变量名 sbit sw = P22; /定义MCU管脚P2.2位寻址变量名 sbit gw = P23; /定义MCU管脚P2.3位寻址变量名 void Delay(); /声明函数Delay() void Disp_led( ); /声明函数Disp_led /*- 主函数 重复调用数码管显示函数以显示巡逻灯 -*/ void main() while(1) Disp_led();

展开阅读全文
相关资源
相关搜索
资源标签

当前位置:首页 > 应用文书 > PPT文档

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:文库网官方知乎号:文库网

经营许可证编号: 粤ICP备2021046453号世界地图

文库网官网©版权所有2025营业执照举报