单片机C语言案例教程电子教案课件

上传人:风*** 文档编号:252662114 上传时间:2024-11-19 格式:PPT 页数:357 大小:15.70MB
收藏 版权申诉 举报 下载
单片机C语言案例教程电子教案课件_第1页
第1页 / 共357页
单片机C语言案例教程电子教案课件_第2页
第2页 / 共357页
单片机C语言案例教程电子教案课件_第3页
第3页 / 共357页
资源描述:

《单片机C语言案例教程电子教案课件》由会员分享,可在线阅读,更多相关《单片机C语言案例教程电子教案课件(357页珍藏版)》请在装配图网上搜索。

1、,,,,,,,,,,,,,,,,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,,,*,单片机C语言案例教程电子教案,第1章 单片机基础,第3章 用数码管模拟的循环灯,第4章 中断资源的应用编程,第5章 日历时钟DS1302的应用编程,第6章 AT24C02的应用编程,第7章 DS18B20的应用编程,第8章 有时控功能和温度显示的电子钟项目设计,第9章 16×16点阵LED汉字显示屏项目设计,第10章 使用片内EEPROM存储器,第11章 单片机与PC的串行通信,第12章 单片机片外数据存储器的扩充,第13章 A/D转换与D/A转换简介,,,单片机C语言

2、案例教程电子教案第1章 单片机基础第3章 用数,1,第1章 单片机基础,1 我们所说的单片机,是一块集成电路芯片。下面的三个型号的单片机芯片,都属于8051系列,其品牌为STC。它们的内部组成可认为完全相同,都能直接用在本书单片机学习板的MCU插座上,但性能有所差异。,左上为STC89C52的实物图,其片内存储器容量大于STC89C51。,左中为STC90C52的实物图,可替代STC89C52,且性能更好。,1.1 单片机是块集成电路芯片,左下为STC12C5A32的实物图,是所谓的1T单片机,其工作速度比上面两个型号快得多。,,,,,,第1章 单片机基础 1

3、 我们所说的单片机,,2,2 51系列单片机的内部结构示意图,,,,,,2 51系列单片机的内部结构示意图,3,3 51系列单片机引脚功能图,左图为8051系列单片机的引脚功能图,它采用双列直插40引脚封装,它所有引脚的功能我们要全部记住。,,,,,,3 51系列单片机引脚功能图 左图为8051系,4,1.2用单片机芯片组成单片机应用系统,1 本书单片机学习板电原理路图,,,,,,1.2用单片机芯片组成单片机应用系统1 本书单片机学习板电原,5,2 本书单片机学习板印刷电路图,,,,,,2 本书单片机学习板印刷电路图,6,3 本书单片机学习板四位数码管电原理图,,

4、,,,,3 本书单片机学习板四位数码管电原理图,7,1.3对单片机编程以实现单片机系统的功能,案例1:编程实现,在4位数码管的最左位上显示“8。”,案例源程序,#include "reg51.h",sbit qw= P2^0;,main(),,{,P0=0;,qw=0;,},程序的第1行称为预处理命令。,第2行是定义位寻址变量。,第3行~第7行是程序的主函数。C程序是由若干个C函数组成,其中必须有一个也只能有一个名为“main”的函数。main函数就是主函数。第3行称为函数头,第4行~第7行称为函数体,第4行的大括号“{”称为函数体的开始标志,第7行的“}”称为函数体的结束标志,开始标志与结

5、束标志之间是若干语句。语句以分号“;”为结束标志。,这个程序运行时的所有功能,是由两个赋值语句具体实现:赋值语句“P0=0;”使口0的8个引脚,即单片机芯片的第39、38、37、36、35、34、33、32全部输出低电平,从而使四位数码管的所有(32只)发光二极管的负极均为低电平;赋值语句“qw=0”使口2的最低位引脚,即单片机芯片的第21脚为低电平,这就使单片机学习板上的PNP管Q3的基极为低电平而导通,从而使最左边位数码管的8只发光二极管正极为高电平。,,,,,,1.3对单片机编程以实现单片机系统的功能案例1:编程实现,在,8,1.4把程序写入单片机芯片的操作平台和操作步骤,1 首先,

6、在桌面上双击Keil的图标,如下图箭头所指。,,一 建立工程文件,,,,,,1.4把程序写入单片机芯片的操作平台和操作步骤1 首先,,9,2 系统进入该软件的初始界面,如下图,,,,,,2 系统进入该软件的初始界面,如下图,10,3 在上一图中,须单击菜单栏中的Project菜单及其子菜单New Project ,如下图所示。,,,,,,,3 在上一图中,须单击菜单栏中的Project菜单及其子,11,4 于是弹出建立新nVisionz工程项目对话框,如下图:,,在上图的“保存在(I)”下拉列表框中选择D盘下的“stc89c52”文件夹,在文件名文本框中,输入工程名“

7、stc89c52”,然后单击“保存”。此时,系统将弹出CPU选择窗口,如下页图。,,,,,,4 于是弹出建立新nVisionz工程项目对话框,如下图:,12,5 在列表框中选择并展开“Atmel”,如下图箭头所指,,,,,,,5 在列表框中选择并展开“Atmel”,如下图箭头所指,13,6 展开“Atmel”项后如下图,在上图中往下拉滚动条,选中“AT89C52”,如下页图。,,,,,,,6 展开“Atmel”项后如下图在上图中往下拉滚动条,,14,7 如下图,选中后单击确定。随后,在弹出的询问框中,选择“是(,Y,)”即可。,,,,,,,7 如下图,选中后单击确

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

9、ve”,,18,4 在其弹出的对话框中的文件名文本框中输入相应的文件名“stc89c52.c”,如下图,,注意:这里必须输入C51源程序的扩展名“.c”来保存。,,,,,,4 在其弹出的对话框中的文件名文本框中输入相应的文件名“st,19,,第三步,把程序文件加载到工程项目中。 1 在Project Windows窗口内,展开Tageget 1,右击Source Group1,如下图。,,,,,,,第三步,把程序文件加载到工程项目中。 1 在,20,4 右击后出现如下界面,在上图菜单中单击“Add Files to Group ‘Source Group1’”,则弹出如下页对话框。,

10、,,,,,4 右击后出现如下界面 在上图菜单中单击“Ad,21,,5 选中“stc89c52”文件后单击“Add”按钮,再单击“Clese”按钮,则加载工作结束。如下图,。,,,,,,5 选中“stc89c52”文件后单击“Add”按钮,22,此时若展开Source Group1,就能看到stc89c52.c已经加入其中。如下图。,,,,,,此时若展开Source Group1,就能看到s,23,第四步,设置编译和链接环境。 1 单击ProjectA菜单及其子菜单option for target ‘Target1’, 如下图。,,,,,,第四步,设置编译和链接环

11、境。 1 单击ProjectA菜单,24,将弹出编译链接设置界面,如下图。,,,,,,将弹出编译链接设置界面,如下图。,25,在上图中,单击Output标签后,在复选框Great HEX Fi:上打√,其余可用默认值,然后确定,如下图,。,,,,,,在上图中,单击Output标签后,在复选框Great HEX,26,第五步,编译成HEX文件。单击Project菜单及其子菜单Ruild all target files,系统就将.C源程序文件编译成指定格式的.HEX文件.如下图。,上图编译信息窗中最后一行告诉我们,源程序有0个错误和0个警告。这是最好结论。有1个错误都不能通过编译,必须针对错误

12、提示信息进行修改。对警告则可改可不改。,,,,,,,,,第五步,编译成HEX文件。单击Project菜单及其子菜单R,27,第六步,将第五步产生.HEX文件下载到单片机芯片中。把单片机学习板上的电源和串口连线与PC机接通,用鼠标依次单击“开始”“程序”“STC_ISP_V4.80” STC_ISP_V4.80”,就进入如下界面.,,,,,,第六步,将第五步产生.HEX文件下载到单片机芯片中。把单片机,28,在MCU类型的下拉列表框中选择”STC89C52RC”,再单击”打开程序文件”按钮,弹出”Open file(*.hex or *.bin)对话框.如下图.,,,,,,在MCU类型的下拉列

13、表框中选择”STC89C52,29,先在上图的下拉列表框中打开“D:\STC89C52”文件夹,随之就出现“STC8051.hex”文件,单击该文件后再单击“打开”按钮,就返回到下载界面,如下图。,按下载软件的提示,关闭一下单片机电源再打开,就可看到下载过程和进度,下载完成后,就可看到单片机四位数码管左边显示的”8。”。,,,,,,先在上图的下拉列表框中打开“D:\STC89C52”文件夹,,30,案例1下载过程与运行效果,,,,,,案例1下载过程与运行效果,31,1.5 从数码管显示学单片机编程,1.5.1 案例2:数码管上的“8。8。”显示,1 源程序,#include "reg5

14、1.h",sbit qw = P2^0;,sbit bw = P2^1;//增加的一个位寻址变量定义,main(),{,P0=0;,qw=0;,bw=0; //增加的一个赋值语句,},,2 源程序分析:本程序用三个赋值语句实现了它的功能。第一个赋值语句使P0代表的口0的8条I/O引脚输出低电平,从而使四位数码管共32个发光二极管的负极为低电平;第二个赋值语句、第三个赋值语句分别使口2的最低两位引脚输出低电平,从而使PNP管Q2、Q3导通,进而使左边两位数码管的共阳极上为高电平。于是,左边两位数码管上的发光二极管全亮。也就是,在四位数码管的左边显示出“8。8。”。,,,,,,

15、1.5 从数码管显示学单片机编程1.5.1 案例2:数,32,3 用流程图表示算法,案例2程序的流程图,案例1程序的流程图,用自然语言描述操作步骤,用C 语句描术操作步骤,,,,,,3 用流程图表示算法案例2程序的流程图案例1程序的流程图,33,4 仿案例1程序的上机操作全过程,完成案例2程序的下载和运行,5 案例2程序的下载操作与运行效果,,,,,,4 仿案例1程序的上机操作全过程,完成案例2程序的下载和运行,34,1.5.2 案例3:被动形式的“8051”显示,#include "reg51.h",sbit qw=P2^0; //定义MCU管脚P2.0位寻址变量名,

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

17、;//赋"1"的笔段码,gw=0;,gw=1;,},1 源程序,,,,,,1.5.2 案例3:被动形式的“8051”显示#inclu,35,2 案例源程序要点分析:,,本案例中对四位数码管的每一位都要进行控制,因此要定义四个位寻址变量:qw、bw、sw和gw。主函数由五个执行段组成。第一执行段有四个赋值语句,作用是关断四个数码管的显示;第二段有三个赋值语句,作用是在数码管的第1位(从左数到右,下同)上显示“8”后关断;第三段是在数码管的第2位上显示“0”后关断;第四段是在数码管的第3位上显示“5”后关断;第五段是在数码管的第4位上显示“1”后关断。,3 案例3程序的流程图,,,,,,

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

19、=1;”,这就是关掉第4位数码管的显示,按此程序设计的本来效果,数码管上显示的“8051”应是一闪而过,此后数码管因全部被关断而无任何显示。,2 案例3程序的一个推论:编译系统有个特殊处理,即在main函数结束而返回的指令处,加了一条跳转指令,迫使单片机程序重新运行。,,,,,,15.3案例4:主动形式的“8051”显示3 物理现象解惑,38,,4 源程序,#include "reg51.h",sbit qw=P2^0; //定义MCU管脚P2.0位寻址变量名,sbit bw=P2^1; //定义MCU管脚P2.1位寻址变量名,sbit sw=P2^2; //定义MCU管脚P2.

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

21、},},,,,,,4 源程序,39,,案例源程序要点分析:,与案例3的源程序相比,案例4源程序中的5个执行段,被一个while循环架构所管辖。在此,先简单地说明一个要点,当while后面的小括号中是整数1是,它大括号中的所有语句,将被无数轮重复执行。因此,在案例4程序中,while下面大括号中的那16个赋值语句,从上到下依次执行一轮后,又将回到上面,又从上到下依次执行一轮,再回到上面,如此永无休止地循环下去,从而实现“8051”的正常显示,,5 案例程序分析及流程图,流程图,,,,,,案例源程序要点分析:5 案例程序分析及流程图流程图,40,6 案例4的下载操作运行效果,,,,,,6 案例4

22、的下载操作运行效果,41,15.4案例5:模块化的“8051”显示,,#include "reg51.h",sbit qw=P2^0; //定义MCU管脚P2.0位寻址变量名,sbit bw=P2^1; //定义MCU管脚P2.1位寻址变量名,sbit sw=P2^2; //定义MCU管脚P2.2位寻址变量名,sbit gw=P2^3; //定义MCU管脚P2.3位寻址变量名,,Disp_led(),{,qw=1; //这四个语句的作用是关断四位数码管,bw=1;,sw=1;,gw=1;,,P0=0x80; //赋"8"的笔段码,qw=0; //接通千位

23、上的数码管,qw=1; //关断千位上的数码管,,P0=0xc0; //赋"0"的笔段码,bw=0;,bw=1;,,P0=0x92; //赋"5"的笔段码,sw=0;,sw=1;,,P0=0xf9; //赋"1"的笔段码,gw=0;,gw=1;,},1 源程序,,,,,,15.4案例5:模块化的“8051”显示 #include,42,void main(),{,while(1),{,Disp_led();,},},,,,,,void main(),43,,,案例5这个程序的运行特点是,执行流程从主函数进入后,就进入其中的while循环,while循环的循环体中,只有一个函数

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

25、44,5 案例5的下载过程及运行效果,,,,,,5 案例5的下载过程及运行效果,45,1.5.5案例6:实用型的“8051”显示,,1 案例源程序:,#include "reg51.h",,sbit qw=P2^0; //定义MCU管脚P2.0位寻址变量名,sbit bw=P2^1; //定义MCU管脚P2.1位寻址变量名,sbit sw=P2^2; //定义MCU管脚P2.2位寻址变量名,sbit gw=P2^3; //定义MCU管脚P2.3位寻址变量名,,Delay(),{,unsigned int i;,for(i=1;i<500;i=i+1

26、),{,;,},},,,,,,1.5.5案例6:实用型的“8051”显示 1 案例源程序,46,Disp_led(),{,qw=1;,bw=1;,sw=1;,gw=1;,,P0=0x80;,qw=0; //接通千位上的数码管,Delay(); //延时,qw=1; //关断千位上的数码管,,P0=0xc0;,bw=0;,Delay();,bw=1;,,P0=0x92;,sw=0;,Delay();,sw=1;,,P0=0xf9;,gw=0;,Delay();,gw=1;,},,,,,,,Disp_led(),47,mai

27、n(),{,while(1),Disp_led();,},,2 案例6程序的流程图,,,,,,main() 2 案例6程序的流程图,48,3 案例6程序的下载操作及运行效果,,,,,,3 案例6程序的下载操作及运行效果,49,1.6 案例6源程序的阅读要点,1 程序的组成,案例6的源程序由三部分组成。,第一部分是预处理部分,预处理命令都是用“#”号打头,本程序中只有一个文件包含的预处理命令。,第二部分是全局变量定义部分。本程序中有四个定义位寻址变量的语句。,第三部分是函数定义部分。本程序中定义了三个函数。,2 文件包含命令的作用,文件包含的作用,是将系统或别人的编程文档直

28、接添进我们的程序中,以提高编程的效率和程序的通用性。在“REG51.h”这个头文件中,定义了代表单片机诸多硬件的很多符号,例如P0、P1等等。用文件包含的手段加进我们的程序中,就省去了自己去定义的麻烦。文件包含命令具体的操作,就是在编译时把该文件的全部内容放在该文件包含命令的位置上。,,,,,,1.6 案例6源程序的阅读要点1 程序的组成2 文件包,50,3 定义位寻址变量的作用,用符号来代表单片机的某I/O引脚,从而用对这些符号的赋值来使对应的I/O脚,输出所指定的高电平或低电平。进而用这些I/O引脚去控制单片机外围电路,。,4 函数的作用,用函数来实现程序的功能,用函数的调用来提

29、高编程的效率。单片机C程序中,必须有一个且只能有一个名为main的主函数,还可以有若干其它函数。,,5 函数定义的格式要求和组成说明,,定义函数的基本格式如下:,函数名(),{,语句序列,},,,,,,,3 定义位寻址变量的作用4 函数的作用5 函数定义的格式,51,组成说明:,函数名可用英文字符标识,函数名后面的小括号对是函数的标记。函数名及其后的小括号对组成函数的函数头。函数头后的大括号对表示函数体,函数体内是若干语句。注意,函数头后面不能有分号。,6 函数调用语句,C程序中,主函数main可以调用其它函数,而其它函数都不能调用main函数,但其它函数间可以相互调用。函数调用可以用函

30、数调用语句来实现。main函数中的while循环的循环体语句“Disp_led(); ”, Disp_led函数中的四个“Delay();”语句,都是函数调用语句。,,,,,,组成说明:函数名可用英文字符标识,函数名后面的小括号对是函数,52,7 案例6源程序的程序架构和函数调用层次图,程序中共有三个函数:main、Disp_led、Delay,其程序架构见图1-26。当main函数调用Disp_led函数时,main是主调函数,Disp_led是被调函数;当Disp_led函数调用Delay函数时,Disp_led是主调函数,Delay是被调函数。程序架构和函数调用层次图如下。,,,,

31、,,7 案例6源程序的程序架构和函数调用层次图,53,8 函数调用时程序执行的流程转移,在案例6中,当程序从main函数运行而执行到函数调用语句“Disp_led(); ”时,程序执行流程就从main函数中,跳转到Disp_led函数,就是从其函数头进入Disp_led函数,并在Disp_led函数中,从上至下依次执行所有语句。当程序在Disp_led函数中运行而执行到“Delay();”语句时,执行流程就从Disp_led函数跳转到Delay函数,也就是从函数头进入Delay函数,当程序执行流程在Delay函数中执行到Delay函数的结束标志“}”时,执行流程就从Delay函数返回到D

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

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

34、的所有子语句永无休止地执行下去。关于while语句的一般形式和执行规则,见第2章相应内容。,,,,,,10 对数码管的编程11 while(1) {语句序列}的作,56,12 for语句号的作用和执行规律,语句for的作用就是让其子句重复执行若干次。例如,有下面的程序段:,int s,n;,s=0;,for(n=1;n<11;n=n+1),{,s=s+n;,},从循环头for(n+1;n<11;n=n+1),可推知,其循环体要执行10次,循环结束后,变量s的值是55。关于for语句的一般形式和执行规则,见第2章相应内容。,,,,,,12 for语句号的作用和执行规律,57,1.7 REG51

35、.h头文件简介,,系统中自带的头文件“REG51.h”的全部内容如下:,/*--------------------------------------------------------------------------,REG51.H,Header generic 80C51 and 80C31 microcontroller.,Copyright (c) 1988-2002 Keil Elektronik GmbH and Keil Software, Inc.,All rights reserved.,----------------------------------------

36、----------------------------------*/,#ifndef __REG51_H__,#define __REG51_H__,/* BYTE Register */,sfr P0 = 0x80;,sfr P1 = 0x90;,sfr P2 = 0xA0;,sfr P3 = 0xB0;,sfr PSW = 0xD0;,sfr ACC = 0xE0;,sfr B = 0xF0;,sfr SP = 0x81;,sfr DPL = 0x82;,sfr DPH = 0x83;,sfr PCON = 0x87;,sfr TCON = 0x8

37、8;,sfr TMOD = 0x89;,,,,,,1.7 REG51.h头文件简介 系统中自带的头文件“RE,58,,sfr TL0 = 0x8A;,sfr TL1 = 0x8B;,sfr TH0 = 0x8C;,sfr TH1 = 0x8D;,sfr IE = 0xA8;,sfr IP = 0xB8;,sfr SCON = 0x98;,sfr SBUF = 0x99;,/* BIT Register */,/* PSW */,sbit CY = 0xD7;,sbit AC = 0xD6;,sbit F0 = 0xD5;,sbit RS1 = 0xD4

38、;,sbit RS0 = 0xD3;,sbit OV = 0xD2;,sbit P = 0xD0;,,,,,,sfr TL0 = 0x8A;,59,/* TCON */,sbit TF1 = 0x8F;,sbit TR1 = 0x8E;,sbit TF0 = 0x8D;,sbit TR0 = 0x8C;,sbit IE1 = 0x8B;,sbit IT1 = 0x8A;,sbit IE0 = 0x89;,sbit IT0 = 0x88;,/* IE */,sbit EA = 0xAF;,sbit ES = 0xAC;,sbit ET1 = 0x

39、AB;,sbit EX1 = 0xAA;,sbit ET0 = 0xA9;,sbit EX0 = 0xA8;,/* IP */,sbit PS = 0xBC;,sbit PT1 = 0xBB;,sbit PX1 = 0xBA;,sbit PT0 = 0xB9;,sbit PX0 = 0xB8;,,,,,,/* TCON */,60,/* P3 */,sbit RD = 0xB7;,sbit WR = 0xB6;,sbit T1 = 0xB5;,sbit T0 = 0xB4;,sbit INT1 = 0xB3;,sbit INT0 = 0xB2;,

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

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

42、,1,案例效果说明:,并驾齐驱的跑马灯显示效果由六场显示组成,并字的含义是四个数码管同步显示同名笔画,即第一场四个数码管都显示笔画a,第二场四个数码管都显示笔画b,第三场四个数码管都显示笔画c,第四场都显示笔画d、第五场都显示笔画e,第六场都显示笔画f。程序整个运行过程如下图,。,,,,,,3.1并驾齐驱的跑马灯1 案例效果说明:并驾齐驱的跑马灯显,63,2 案例7源程序,/* ------------------------------------,案例7:并驾齐驱的跑马灯,------------------------------------*/,#include "reg51.h",

43、sbit qw = P2^0; //定义MCU管脚P2.0位寻址变量名,sbit bw = P2^1; //定义MCU管脚P2.1位寻址变量名,sbit sw = P2^2; //定义MCU管脚P2.2位寻址变量名,sbit gw = P2^3; //定义MCU管脚P2.3位寻址变量名,,/*------延时子函数------*/,Delay(),{,unsigned int i;,for( i =1;i < 25000;i++ ),{,;,},},,,,,,2 案例7源程序/* -

44、------------------,64,/*-------------------------------------------------,数码管显示函数,-------------------------------------------------*/,Disp_led( ),{,//做准备工作,qw=0; /*开通千位(左边第一位)上的数码管显示*/,bw=0; // 开通百位上的数码管显示,sw=0; // 开通十位上的数码管显示,gw=0; // 开通个位上的数码管显示,,//第一场,P0 = 0xfe;

45、 // 把笔划'a'码赋给P0口,Delay(); // 延时,//第二场,P0 = 0xfd; // 把单笔划'b'码赋给P0口,Delay(); // 延时,//第三场,P0 = 0xfb; // 把单笔划'c'码赋给P0口,Delay(); // 延时,//第四场,P0 = 0xf7; // 把单笔划'd'码赋给P0口,Delay(); // 延时,,,,,,,/*----------------------------,65,,//第五场,P0 = 0xef; // 把单笔划'e'码赋给P0口,Del

46、ay(); // 延时,//第六场,P0 = 0xdf; // 把单笔划'f'码赋给P0口,Delay(); //延时,},,/*-------------------------------------------------,主函数,重复调用显示函数来实现程序功能,-------------------------------------------------*/,void main(),{,while(1),{,Disp_led();,},},,,,,,//第五场,66,3 案例7程序的流程图,,,,,,3 案例7程序的流程

47、图,67,4 案例7程序的下载操作与运行效果,,,,,,4 案例7程序的下载操作与运行效果,68,3.2迈步边关的巡逻灯,1 案例效果说明:,,边关迈步的巡逻灯显示效果由十二场显示组成。第一场显示千位数码管上的a笔画;第二场显示百位数码管上的a笔画;第三场显示十位数码管上的a笔画;第四场显示个位数码管上的a笔画;第五场显示个位数码管上的b笔画;第六场显示个位数码管上的c笔画;第七场显示个位数码管上的d笔画;第八场显示十位数码管上的d笔画;第九场显示百位数码管上的d笔画;第十场显示千位数码管上的d笔画;第十一场显示千位数码管上的e笔画;第十二场显示千位数码管上的f笔画。示意图如下。,,,,,,3

48、.2迈步边关的巡逻灯1 案例效果说明:,69,2 案例源程序,/* ------------------------------------,案例8:迈步边关的巡逻灯,------------------------------------*/,#include "reg51.h",sbit qw = P2^0; //定义MCU管脚P2.0位寻址变量名,sbit bw = P2^1; //定义MCU管脚P2.1位寻址变量名,sbit sw = P2^2; //定义MCU管脚P2.2位寻址变量名,sbit

49、gw = P2^3; //定义MCU管脚P2.3位寻址变量名,void Delay(); //声明函数Delay(),void Disp_led( ); //声明函数Disp_led,/*-------------------------------------------------,主函数,重复调用数码管显示函数以显示巡逻灯,-------------------------------------------------*/,void main(),{,,while(1),{

50、,Disp_led();,,},},,,,,,2 案例源程序,70,/*-------------------------------------------------,数码管显示函数,-------------------------------------------------*/,void Disp_led( ),{,//准备工作,qw=1; //关断千位上的数码管显示,bw=1; //关断百位上的数码管显示,sw=1; //关断十位上的数码管显示,gw=1;

51、 //关断个位上的数码管显示,,//第一场,P0 = 0xfe; //把笔画a的显示码赋给P0口,qw=0; /*开通千位(左边第一位)上的数码管显示*/,Delay(); //延时,qw=1; //关断千位上的数码管显示,,//第二场,P0 = 0xfe; //把笔画a的显示码赋给P0口,bw=0; /*开通百位(左起第二位)上的数码管显示*/,Delay(); //延时,bw=1; //关断百位上的数码管显示,,

52、,,,,/*----------------------------,71,,//第三场,P0 =0xfe; //把笔画a的显示码赋给P0口,sw=0; /*开通十位(左起第三位)上的数码管显示*/,Delay(); //延时,sw=1; //关断十位上的数码管显示,//第四场,P0 = 0xfe; //把笔画a的显示码赋给P0口,gw=0; /*开通个位(左起第四位)上的数码管显示*/,Delay(); //延时,gw=1; //关断个位上的数码管显示,//第五场,

53、P0 = 0xfd; //把笔画b的显示码赋给P0口,gw=0; /*开通个位(左起第四位)上的数码管显示*/,Delay(); //延时,gw=1; //关断个位上的数码管显示,,,,,,//第三场,72,//第六场,P0 = 0xfb; //把笔画c的显示码赋给P0口,gw=0; /*开通个位(左起第四位)上的数码管显示*/,Delay(); //延时,gw=1; //关断个位上的数码管显示,,//第七场,P0 = 0xf7; //把笔画d的显示码赋给P0口,gw=0;

54、 /*开通个位(左起第四位)上的数码管显示*/,Delay(); //延时,gw=1; //关断个位上的数码管显示,,//第八场,P0 =0xf7; //把笔画d的显示码赋给P0口,sw=0; /*开通十位(左起第三位)上的数码管显示*/,Delay(); //延时,sw=1; //关断十位上的数码管显示,,,,,,//第六场,73,//第九场,P0 = 0xf7; //把笔画d的显示码赋给P0口,bw=0; /*开通百位(左起第二位)上的数码管显示*/,D

55、elay(); //延时,bw=1; //关断百位上的数码管显示,,//第十场,P0 = 0xf7; //把笔画a的显示码赋给P0口,qw=0; /*开通千位(左边第一位)上的数码管显示*/,Delay(); //延时,qw=1; //关断个位上的数码管显示,,//第十一场,P0 = 0xef; //把笔画e的显示码赋给P0口,qw=0; /*开通千位(左边第一位)上的数码管显示*/,Delay(); //延时,qw=1; // 关断个位上的数码管显示,,,,,,//第九场,74,,//第十二场,P0 = 0xdf

56、; //把笔画f的显示码赋给P0口,qw=0; /*开通千位(左边第一位)上的数码管显示*/,Delay(); //延时,qw=1; // 关断个位上的数码管显示,},,/*------延时函数------*/,void Delay(),{,unsigned int i;,for( i =0;i < 25000;i++ ),{,;,},},,,,,,//第十二场,75,3 案例8程序的流程图,,,,,,3 案例8程序的流程图,76,4 案例8程序的下载操作与运行效果,,,,,,4 案例8程序的下载操作与运行效果,77,3.3 大江东去的流水灯,1,案例效果说明:,,大江东去的流水灯显示效

57、果由八场显示组成,第一场显示千位数码管上的e、f两笔画;第二场显示千位数码管上的b、c两笔画;第三场显示百位数码管上的e、f两笔画;第四场显示百位数码管上的b、c两笔画;第五场显示十位数码管上的e、f两笔画;第六场显示十位数码管上的b、c两笔画;第七场显示个位数码管上的e、f两笔画;第八场显示个位数码管上的b、c两笔画。各场显示的示意图如下。,,,,,,3.3 大江东去的流水灯1 案例效果说明:,78,2 案例源程序,/* ------------------------------------,案例9:大江东去的流水灯,---------------------------------

58、---*/,#include "reg51.h",sbit qw = P2^0; //定义MCU管脚P2.0位寻址变量名,sbit bw = P2^1; //定义MCU管脚P2.1位寻址变量名,sbit sw = P2^2; //定义MCU管脚P2.2位寻址变量名,sbit gw = P2^3; //定义MCU管脚P2.3位寻址变量名,,/*-------------------------------------------------,主函数,重复调用显示函数字

59、以显示巡逻灯,-------------------------------------------------*/,void main(),{,while(1),Disp_led();,},,,,,,2 案例源程序,79,,/*-------------------------------------------------,数码管显示函数,-------------------------------------------------*/,Disp_led( ),{,//第一场,qw=0; /*开通千位(左边第一位)上的数码管显示*/,bw=1;

60、 //关断百位上的数码管显示,sw=1; //关断十位上的数码管显示,gw=1; //关断个位上的数码管显示,P0 = 0xcf; //把f、e笔画的显示码赋给P0口,Delay(); //延时,,//第二场,qw=1; /*开通千位(左边第一位)上的数码管显示*/,bw=0; //,关断,百位上的数码管显示,sw=1; //关断十位上的数码管显示,gw=1; //关断个位上的数码管显示,P0 = 0xf9; //把b、c笔画的显示码赋给P0口,Delay(); //延时,,,,,,,/*-------------------

61、---------,80,//第三场,qw=1; //关断千位上的数码管显示,bw=0; /*开通百位(左起第二位)上的数码管显示*/,sw=1; //关断十位上的数码管显示,gw=1; //关断个位上的数码管显示,P0 = 0xcf; //把f、e笔画的显示码赋给P0口,Delay(); //延时,,//第四场,qw=1; //关断千位上的数码管显示,bw=0; /*开通百位(左起第二位)上的数码管显示*/,sw=1; //关断十位上的数码管显示,gw=1; //关断个位上的数码管显示,P0 = 0xf9; //把c、b笔画的显示码赋给P0口,Delay(); //延时,

62、,,,,,//第三场,81,,//第五场,qw=1; //关断千位上的数码管显示,bw=1; //关断百位上的数码管显示,sw=0; /*开通十位(左起第三位)上的数码管显示*/,gw=1; //关断个位上的数码管显示,P0 =0xcf; //把f、e笔画的显示码赋给P0口,Delay(); //延时,,//第六场,qw=1; //关断千位上的数码管显示,bw=1; //关断百位上的数码管显示,sw=0; /*开通十位(左起第三位)上的数码管显示*/,gw=1; //关断个位上的数码管显示,P0 =0xf9; //把c、b笔画的显示码赋给P0口,Delay(); //延时,

63、,,,,,//第五场,82,//第七场,qw=1; //关断千位上的数码管显示,bw=1; //关断百位上的数码管显示,sw=1; //关断十位上的数码管显示,gw=0; /*开通个位(左起第四位)上的数码管显示*/,P0 = 0xcf; //把f、e笔画的显示码赋给P0口,Delay(); //延时,,//第八场,qw=1; //关断千位上的数码管显示,bw=1; //关断百位上的数码管显示,sw=1; //关断十位上的数码管显示,gw=0; /*开通个位(左起第四位)上的数码管显示*/,P0 = 0xf9; //把c、b笔画的显示码赋给P0口,Delay(); //

64、延时,},,/*------延时函数------*/,Delay(),{,unsigned int i;,for( i =0;i < 25000;i++ ),;,},,,,,,//第七场,83,3 案例9程序的流程图,,,,,,3 案例9程序的流程图,84,4 案例9程序的下载操作与运行效果,,,,,,4 案例9程序的下载操作与运行效果,85,3.4孔雀开屏式循环灯,1 案例效果说明:,本案例的显示效果由4场组成。第一场显示出四个数码管中间的4个竖笔画,第二场显示出四个数码管中间的8个竖笔画,第三场显示出中间的12个竖笔画,第四场显示出全部竖笔画。用这四场的循环显示,模拟孔雀开屏的效果。,

65、,,,,,3.4孔雀开屏式循环灯1 案例效果说明:,86,2 案例源程序,/* ------------------------------------,案例10: 孔雀开屏式循环灯,------------------------------------*/,#include "reg51.h",sbit qw = P2^0; //定义MCU管脚P2.0位寻址变量名,sbit bw =P2^1; //定义MCU管脚P2.0位寻址变量名,sbit sw = P2^2; //定义MCU管脚P2.2位寻址变量名,sbit gw = P2^3

66、; //定义MCU管脚P2.3位寻址变量名,unsigned char q,b,s,g; //定义相应位的笔画码变量,提高笔画 //显示的灵活性,/*------延时函数------*/,Delay(),{,unsigned int i;,for( i =0;i < 500;i++ ),;,},,,,,,2 案例源程序,87,/*-------------------------------------------------,数码管显示函数,-------------------------------------------------*/,Disp_led( ),{,//准备工作,qw=1; //关断千位上的数码管显示,bw=1; //关断百位上的数码管显示,sw=1; //关断十位上的数码管显示,gw=1; //关断个位上的数码管显示,,//第一时段:显示千位上的

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

相关资源

更多
正为您匹配相似的精品文档
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!