1、单片机原理实验指导书实验教学版本第 1 页第一章单片机系统板说明一、概述单片机实验开发系统是一种多功能、高配置、高品质的MCS-51 单片机教学与开发设备。适用于大学本科单片机教学、课程设计和毕业设计以及电子设计比赛。该系统采用模块化设计思想,减小了系统面积,同时增加了可靠性,使得单片机实验开发系统能满足从简单的数字电路实验到复杂的数字系统设计实验,并能一直延伸到综合电子设计等创新性实验项目。该系统采用集成稳压电源供电,使电源系统的稳定性大大提高,同时又具备完备的保护措施。为适应市场上多种单片机器件的应用,该系统采用“单片机板+外围扩展板”结构,通过更换不同外围扩展板,可实验不同的单片机功能,
2、适应了各院校不同的教学需求。二、单片机板简介本实验系统因为自带了MCS-51 单片机系统,因此没有配置其他单片机板,但可以根据教学需要随时配置。以单片机板为母板,并且有 I/O 接口引出,可以很方便的完成所有实验。因此构成单片机实验系统。1、主要技术参数(1)MSC-51 单片机板板上配有ATMEL 公司的 STC89C51 芯片。STC89C51 资源:32 个 I/O 口;封装DIP40。STC89C51 开发软件:KEIL C51。2、MSC-51 单片机 结构(1)单片机板中央放置一块可插拔的DIP 封装的 STC89C51 芯片。(2)单片机板左上侧有一个串口,用于下载程序。(3)单
3、片机板的四周是所有IO 引脚的插孔,旁边标有I0 引脚的脚引。(4)单片机板与各个模块配合使用时,可形成个完整的实验系统。三、母板简介主要技术参数(1)实验系统电源实验系统内置了集成稳压电源,使整个电源具有短路保护、过流保护功能,提高了实验的稳定性。主板的右上角为电源总开关,当把220V 交流电源线插入主板后,打开电源开关,主板单片机原理实验指导书实验教学版本第 2 页得电工作。为适用多种需要,配置了+5V,+12V,5V 电压供主板和外设需要,通过右上角的插针排和插孔输出到外设。此外,还设有螺旋保险插孔保护实验箱。(2)RS232 接口RS232 接口通过MAX232 芯片实现与计算机的串行
4、通讯,通过接口引出信号。(3)单片机最小系统单片机最小系统的核心是ATMEL 公司的AT89S51 单片机,AT89S51 右边的按键是复位键,按下时单片机复位,单片机的放两排插孔,分别是:P1.0P1.7,P0.0P1.7,P3.0P3.7,P2.0P2.7,它们可以实现单片机实验和开发。(4)模拟量接口一个模拟量接口,由ICL8038 产生,通过插孔引出。(5)DA 转换器DA 转换器由DA0832,LM324 芯片组成,(8 位,05V 电压输出),对应的接口序号为:数据信号:D0D7;片选信号:/CS;读有效信号OE。(6)AD 转换器AD 转换器和DA 转换器相临,主要由ADC080
5、9 组成,(8 位)对应的接口序号为:模拟输入:IN0-IN7;基准电压:REF+,REF-;读写信号:RD,WR;输出信号:D0 D7;检测信号:I0;地址锁存允许:ALE。(7)8 位拨动开关8 位拨动开关由KlK8 组成,每一位都有相应LED(Dl D8)指示,当拨码开关拨上边时输出高电平,LED 亮;拨下边时输出低电平,由插孔l8 输出。(8)24 位按键开关24 位按键开关位于主板中下方,由按键KlK24 组成,有六排,第一排按下时是高电平,弹上时是低电平,由插孔14 输出;第二排按下时是低电平,弹上时高电平,由插孔14 输出;第三到第六排是4*4 的行列式键盘;由L1 L4,H1H
6、4 输出。(9)静态显示数码管静态显示区由数码管DP1DP6 组成,由插孔输出,供静态显示用。(10)发光二极管显示区8 位红色发光二极管,高电平亮,可作为状态指示用;另一部分是交通灯,由东西南北四组红绿黄发光二极管构成,高电平亮。(11)动态扫描显示区系统的显示采用8 位 8 段共阴或共阳数码管(高电平有效),所对应的接口序号为:段码:a,b,c,d,e,f,g,h;位选:L1,L2,L3,L4,L5,L6,L7,L8。(12)蜂鸣器蜂鸣器(高电平 TTL 驱动)从其下方对应输入口,会产生lKHz 的信号响声。(13)继电器控制区单片机原理实验指导书实验教学版本第 3 页继电器控制区主要由K
7、J1KJ3 三个继电器及其驱动电路组成,高电平TTL 驱动,输出接口分别为JJ1,JJ2,JJ3。(14)数字温度计数字温度计使用DS1302 温度传感器,输出接口为SCLK、I/O、RESET。(15)EEPROM EEPROM(AT24C16),用来保存数据信息,接口序号为:串行数据线:SDA;时钟线:SCL;写保护线:WP。(16)串行 A/D AD 转换器主要由MAX192组成,(8 位)对应的接口序号为:模拟输入:IN0-IN7;片选信号:CS;输出信号:DOUT;时钟信号:SCLK;转换开始:SSTRB。(17)变频模块(18)直流斩波模块(19)红外模块四、主要实验项目本实验系统
8、由于采用模块化设计,各模块之间既相互独立,又可相互组合,完成各种类型实验。其中包括验证性基础实验,综合性、设计性、创新性实验以及研究开发性、创新性、及全国电子大赛赛前培训实验等。以下列举了本实验系统能做的部分单片机原理课程实验及课外开放性备选实验项目。单片机原理课程实验实验一 LED 显示器指示实验二 软件延时及灯光控制实验实验三 多级外部中断实验实验四 脉冲频率的测量实验实验五 串行口扩展实验实验六 串行 EEPROM 的读出和写入实验实验七 8 位 A/D、D/A 转换器的应用实验实验八 串行 A/D、D/A 的应用实验实验九 直流继电器的驱动及控制实验实验十 数据采集的软件抗干扰实验实验
9、十一密码锁控制器的设计实验十二数字温度控制器的设计实验十三8255扫描键盘显示实验实验十四音乐编程实验实验十五声光报警实验实验十六可预置可逆计数器实验单片机原理实验指导书实验教学版本第 4 页实验十七DS1302时钟芯片的应用实验实验十八红外通信接口实验实验十九单片机变频调速实验实验二十交通灯控制实验部分备选实验项目实验一 闪烁灯实验一 模拟开关灯实验一 多路开关状态指示实验一 广告灯的左移右移实验一 广告灯(利用取表方式)实验一 报警产生器实验一 I/O 并行口直接驱动LED显示实验一 按键识别方法之一实验一 0099计数器实验一 定时计数器 T0作定时应用技术(一)实验一 动态数码显示技术
10、实验一 44 矩阵式键盘识别技术实验一 定时计数器 T0作定时应用技术(一)实验一 定时计数器 T0作定时应用技术(二)实验一“叮咚”门铃实验一 数字钟实验一 ADC0809A/D 转换器基本应用技术单片机原理实验指导书实验教学版本第 5 页第二章Keil C 软件使用Keil C51 软件是众多单片机应用开发的优秀软件之一,它集编辑,编译,仿真于一体,支持汇编,PLM 语言和C 语言的程序设计,界面友好,易学易用。下面介绍 Keil C51 软件的使用方法进入Keil C51 后,屏幕如下图所示。几秒钟后出现编辑界启动 Keil C51 时的屏幕进入 Keil C51 后的编辑界面简单程序的
11、调试学习程序设计语言、学习某种程序软件,最好的方法是直接操作实践。下面通过简单的编程、调试,引导大家学习Keil C51 软件的基本使用方法和基本的调试技巧。单片机原理实验指导书实验教学版本第 6 页1)建立一个新工程单击 Project 菜单,在弹出的下拉菜单中选中New Project 选项2)然后选择你要保存的路径,输入工程文件的名字,比如保存到C51目录里,工程文件的名字为 C51 如下图所示,然后点击保存.3)这时会弹出一个对话框,要求你选择单片机的型号,你可以根据你使用的单片机来选择,keil c51 几乎支持所有的51 核的单片机,我这里还是以大家用的比较多的Atmel 的 89
12、C51来说明,如下图所示,选择 89C51 之后,右边栏是对这个单片机的基本的说明,然后点击确定.单片机原理实验指导书实验教学版本第 7 页4)完成上一步骤后,屏幕如下图所示到现在为止,我们还没有编写一句程序,下面开始编写我们的第一个程序。5)在下图中,单击“File”菜单,再在下拉菜单中单击“New”选项新建文件后屏幕如下图所示单片机原理实验指导书实验教学版本第 8 页此时光标在编辑窗口里闪烁,这时可以键入用户的应用程序了,但笔者建议首先保存该空白的文件,单击菜单上的“File”,在下拉菜单中选中“Save As”选项单击,屏幕如下图所示,在“文件名”栏右侧的编辑框中,键入欲使用的文件名,同
13、时,必须键入正确的扩展名。注意,如果用语言编写程序,则扩展名为(.c);如果用汇编语言编写程序,则扩展名必须为(.asm)。然后,单击“保存”按钮。6)回到编辑界面后,单击“Target 1”前面的“”号,然后在“Source Group 1”上单击右键,弹出如下菜单然后单击“Add File to Group,Source Group 1?”屏幕如下图所示单片机原理实验指导书实验教学版本第 9 页选中 Test.c,然后单击“Add”屏幕好下图所示注意到“Source Group 1”文件夹中多了一个子项“Text1.c”了吗?子项的多少与所增加的源程序的多少相同7)现在,请输入如下的C 语
14、言源程序:#include /包含文件#include void main(void)/主函数SCON=0 x52;TMOD=0 x20;TH1=0 xf3;TR1=1;/此行及以上3 行为 PRINTF 函数所必须printf(“Hello I am KEIL.n”);/打印程序执行的信息printf(“I will be your friend.n”);while(1);在输入上述程序时,读者已经看到了事先保存待编辑的文件的好处了吧,即 Keil c51 会自动识别关键字,并以不同的颜色提示用户加以注意,这样会使用户少犯错误,有利于提高编单片机原理实验指导书实验教学版本第 10 页程效率。
15、程序输入完毕后,如下图所示8)在上图中,单击“Project”菜单,再在下拉菜单中单击“Built Target”选项(或者使用快捷键 F7),编译成功后,再单击“Project”菜单,在下拉菜单中单击“Start/Stop Debug Session”(或者使用快捷键Ctrl+F5),屏幕如下所示单片机原理实验指导书实验教学版本第 11 页9)调试程序:在上图中,单击“Debug”菜单,在下拉菜单中单击“Go”选项,(或者使用快捷键 F5),然后再单击“Debug”菜单,在下拉菜单中单击“Stop Running”选项(或者使用快捷键 Esc);再单击“View”菜单,再在下拉菜单中单击“S
16、erial Windows#1”选项,就可以看到程序运行后的结果,其结果如下图所示至此,我们在Keil C51 上做了一个完整工程的全过程。但这只是纯软件的开发过程,如何使用程序下载器看一看程序运行的结果呢?10)单击“Project”菜单,再在下拉菜单中单击“”在下图中,单击“Output”中单击“Create HEX File”选项,使程序编译后产生HEX 代码,供下载器软件使用。把程序下载到AT89S51 单片机中。单片机原理实验指导书实验教学版本第 12 页第三章AT89S51 单片机下载器软件使用AT89S51 单片机下载器是专门用于下载程序到单片机系统中,该软件使用方便。启动软件之
17、后进入下面的界面(如图3.1 所示):图 3.1 在上图中:1界面右边为操作状态显示区;2界面左上为下载芯片选择区,该软件支持多种芯片的程序在线下载,对系统板上的单片机 AT89S51 是其中一种,软件默认情况下为AT89S51 单片机。3界面左边为在线下载的操作区,它可以提供如下的操作(1)初始化:启动AT89S51 单片机进入ISP 下载状态,若启动成功,则状态显示区就会显示如图3.2 所示的文字。否则,不成功会有“初始化失败”的字样提示。图 3.2(2)特征字:点击一下检测器件,会读出单片机的芯片的特征字,对于AT89S51单片机的特征字为:1E5106。(3)擦除器件:是把单片机的内容
18、擦除干净,即单片机内部ROM 的内容全为FFH。(4)写器件:把代码区中的程序代码下载到单片机的内部ROM 中。注意在编程之前,要对单片机芯片进行擦除操作。(5)效验数据:是经过编程之后,对下载到单片机内部ROM 中的内容与代码区的单片机原理实验指导书实验教学版本第 13 页内容相比较,若程序下载过程中完全正确,则提示校验正确,否则提示出现错误。那就得需要重新下载程序到ROM 中。(6)自动:提供了从内部ROM 从擦除到编程,最后到校验这三个过程。(7)读器件:从单片机内部ROM 中读取内容到代码显示区中。单片机原理实验指导书实验教学版本第 14 页第四章实验及实践课题1闪烁灯1实验任务如图
19、4.1.1 所示:在P1.0 端口上接一个发光二极管L1,使 L1 在不停地一亮一灭,一亮一灭的时间间隔为0.2 秒。2电路原理图图 4.1.1 3系统板上硬件连线把“单片机系统”区域中的P1.0 端口用导线连接到“八路发光二极管指示模块”区域中的 L1 端口上。4程序设计内容(1)延时程序的设计方法作为单片机的指令的执行的时间是很短,数量大微秒级,因此,我们要求的闪烁时间间隔为0.2 秒,相对于微秒来说,相差太大,所以我们在执行某一指令时,插入延时程序,来达到我们的要求,但这样的延时程序是如何设计呢?下面具体介绍其原理:498*20+2*20+2=10002 如图 4.1.1 所示的石英晶体
20、为12MHz,因此,1个机器周期为1 微秒机器周期微秒MOV R6,#20 2个2 D1:MOV R7,#248 2个222 24849820DJNZ R7,$2个2 248(498 DJNZ R6,D1 2个2 20 4010002 因此,上面的延时程序时间为10.002ms。单片机原理实验指导书实验教学版本第 15 页由以上可知,当 R610、R7248 时,延时 5ms,R620、R7248 时,延时 10ms,以此为基本的计时单位。如本实验要求0.2 秒 200ms,10ms R5 200ms,则 R520,延时子程序如下:DELAY:MOV R5,#20 D1:MOV R6,#20
21、D2:MOV R7,#248 DJNZ R7,$DJNZ R6,D2 DJNZ R5,D1 RET(2)输出控制如图 1 所示,当P1.0 端口输出高电平,即P1.01 时,根据发光二极管的单向导电性可知,这时发光二极管L1 熄灭;当P1.0 端口输出低电平,即P1.00 时,发光二极管L1 亮;我们可以使用SETBP1.0 指令使P1.0 端口输出高电平,使用CLRP1.0 指令使 P1.0 端口输出低电平。5程序框图如图 4.1.2 所示图 4.1.2 6汇编源程序ORG 0000H START:CLR P1.0 LCALL DELAY SETB P1.0 LCALL DELAY LJMP
22、 START DELAY:MOV R5,#20;延时子程序,延时0.2 秒D1:MOV R6,#20 D2:MOV R7,#248 DJNZ R7,$DJNZ R6,D2 DJNZ R5,D1 RET END 单片机原理实验指导书实验教学版本第 16 页7C 语言源程序#include sbit L1=P10;void delay02s(void)/延时 0.2 秒子程序 unsigned char i,j,k;for(i=20;i0;i-)for(j=20;j0;j-)for(k=248;k0;k-);void main(void)while(1)L1=0;delay02s();L1=1;d
23、elay02s();单片机原理实验指导书实验教学版本第 17 页2模拟开关灯1 实验任务如图 4.2.1 所示,监视开关K1(接在 P3.0 端口上),K1 拨上为高电平,拨下为低电平。用发光二极管L1(接在单片机P1.0 端口上)显示开关状态,如果开关拨上,L1 亮,开关拨下,L1 熄灭。2 电路原理图图 4.2.1 3 系统板上硬件连线(1)把“单片机系统”区域中的P1.0 端口用导线连接到“八路发光二极管指示模块”区域中的L1 端口上;(2)把“单片机系统”区域中的P3.0 端口用导线连接到“八路拨动开关”区域中的K1端口上;4 程序设计内容(1)开关状态的检测过程单片机对开关状态的检测
24、相对于单片机来说,是从单片机的P3.0 端口输入信号,而输入的信号只有高电平和低电平两种,当拨开开关K1 拨上去,即输入高电平,相当开关断开,当拨动开关K1 拨下去,即输入低电平,相当开关闭合。单片机可以采用 JBBIT,REL 或者是 JNBBIT,REL 指令来完成对开关状态的检测即可。(2)输出控制如图 3 所示,当P1.0 端口输出高电平,即P1.01 时,根据发光二极管的单向导电性可知,这时发光二极管L1 熄灭;当P1.0 端口输出低电平,即P1.00 时,发光二极管L1 亮;我们可以使用SETBP1.0 指令使P1.0 端口输出高电平,使用CLRP1.0 指令使 P1.0 端口输出
25、低电平。5 程序框图单片机原理实验指导书实验教学版本第 18 页图 4.2.2 6 汇编源程序ORG 00H START:JB P3.0,LIG CLR P1.0 SJMP START LIG:SETB P1.0 SJMP START END 7 C 语言源程序#include sbit K1=P30;sbit L1=P10;void main(void)while(1)if(K1=0)L1=0;/灯亮 else L1=1;/灯灭 开始K1 开关闭合了吗?L1 亮L1 灭单片机原理实验指导书实验教学版本第 19 页3多路开关状态指示1 实验任务如图 4.3.1 所示,AT89S51 单片机的
26、P1.0P1.3 接四个发光二极管L1L4,P1.4P1.7接了四个开关K1K4,编程将开关的状态反映到发光二极管上。(开关闭合,对应的灯亮,开关断开,对应的灯灭)。2 电路原理图图 4.3.1 3 系统板上硬件连线(1把“单片机系统”区域中的P1.0P1.3 用导线连接到“八路发光二极管指示模块”区域中的L1L4 端口上;(2把“单片机系统”区域中的P1.4P1.7 用导线连接到“八路拨动开关”区域中的 K1 K4 端口上;4 程序设计内容(1开关状态检测对于开关状态检测,相对单片机来说,是输入关系,我们可轮流检测每个开关状态,根据每个开关的状态让相应的发光二极管指示,可以采用JBP1.X,
27、REL或 JNBP1.X,REL 指令来完成;也可以一次性检测四路开关状态,然后让其指示,可以采用MOVA,P1指令一次把P1 端口的状态全部读入,然后取高单片机原理实验指导书实验教学版本第 20 页4 位的状态来指示。(2输出控制根据开关的状态,由发光二极管L1L4 来指示,我们可以用SETBP1.X 和CLRP1.X 指令来完成,也可以采用MOVP1,1111XXXXB方法一次指示。5 程序框图图 4.3.2 6 方法一(汇编源程序)ORG 0000H START:MOV A,P1 ANL A,#0F0H RR A RR A RR A RR A ORL A,#0F0H MOV P1,A S
28、JMP START END 7 方法一(C 语言源程序)#include unsigned char temp;void main(void)while(1)temp=P14;temp=temp|0 xf0;P1=temp;8 方法二(汇编源程序)ORG 00H START:JB P1.4,NEXT1 CLR P1.0 开始读 P1 口数据到 ACCACC内容右移 4 次ACC内容与 F0H 相或ACC内容送入P1 口单片机原理实验指导书实验教学版本第 21 页SJMP NEX1 NEXT1:SETB P1.0 NEX1:JB P1.5,NEXT2 CLR P1.1 SJMP NEX2 NEX
29、T2:SETB P1.1 NEX2:JB P1.6,NEXT3 CLR P1.2 SJMP NEX3 NEXT3:SETB P1.2 NEX3:JB P1.7,NEXT4 CLR P1.3 SJMP NEX4 NEXT4:SETB P1.3 NEX4:SJMP START END 9 方法二(C 语言源程序)#include void main(void)while(1)if(P1_4=0)P1_0=0;else P1_0=1;if(P1_5=0)P1_1=0;else P1_1=1;if(P1_6=0)P1_2=0;else P1_2=1;if(P1_7=0)P1_3=0;else P1_3
30、1;单片机原理实验指导书实验教学版本第 22 页4广告灯的左移右移1实验任务做单一灯的左移右移,硬件电路如图4.4.1 所示,八个发光二极管L1L8 分别接在单片机 的P1.0 P1.7接 口 上,输 出“0”时,发 光 二 极 管 亮,开 始 时P1.0P1.1P1.2P1.3P1.7P1.6 P1.0 亮,重复循环。2电路原理图图 4.4.1 3系统板上硬件连线把“单片机系统”区域中的P1.0P1.7 用 8 芯排线连接到“八路发光二极管指示模块”区域中的 L1L8 端口上,要求:P1.0 对应着 L1,P1.1 对应着 L2,P1.7 对应着L8。4程序设计内容我们可以运用输出端口指令
31、MOVP1,A 或 MOVP1,DATA,只要给累加器值或常数值,然后执行上述的指令,即可达到输出控制的动作。每次送出的数据是不同,具体的数据如下表1 所示P1.7 P1.6 P1.5 P1.4 P1.3 P1.2 P1.1 P1.0 说明L8 L7 L6 L5 L4 L3 L2 L1 1 1 1 1 1 1 1 0 L1 亮1 1 1 1 1 1 0 1 L2 亮1 1 1 1 1 0 1 1 L3 亮单片机原理实验指导书实验教学版本第 23 页1 1 1 1 0 1 1 1 L4 亮1 1 1 0 1 1 1 1 L5 亮1 1 0 1 1 1 1 1 L6 亮1 0 1 1 1 1 1
32、1 L7 亮0 1 1 1 1 1 1 1 L8 亮表 1 5程序框图图 4.4.2 6汇编源程序ORG 0 START:MOV R2,#8 MOV A,#0FEH SETB C LOOP:MOV P1,A LCALL DELAY RLC A DJNZ R2,LOOP MOV R2,#8 LOOP1:MOV P1,A LCALL DELAY RRC A DJNZ R2,LOOP1 LJMP START DELAY:MOV R5,#20;D1:MOV R6,#20 D2:MOV R7,#248 DJNZ R7,$DJNZ R6,D2 DJNZ R5,D1 RET END 7C 语言源程序#inc
33、lude unsigned char i;unsigned char temp;unsigned char a,b;单片机原理实验指导书实验教学版本第 24 页void delay(void)unsigned char m,n,s;for(m=20;m0;m-)for(n=20;n0;n-)for(s=248;s0;s-);void main(void)while(1)temp=0 xfe;P1=temp;delay();for(i=1;i8;i+)a=temp(8-i);P1=a|b;delay();for(i=1;ii;b=temp(8-i);P1=a|b;delay();单片机原理实验指
34、导书实验教学版本第 25 页5广告灯(利用取表方式)1实验任务利用取表的方法,使端口P1 做单一灯的变化:左移2 次,右移 2 次,闪烁2 次(延时的时间 0.2 秒)。2电路原理图图 4.5.1 3系统板上硬件连线把“单片机系统”区域中的P1.0P1.7 用 8 芯排线连接到“八路发光二极管指示模块”区域中的 L1L8 端口上,要求:P1.0 对应着 L1,P1.1 对应着 L2,P1.7 对应着L8。4程序设计内容在用表格进行程序设计的时候,要用以下的指令来完成(1)利用 MOVDPTR,DATA16 的指令来使数据指针寄存器指到表的开头。(2)利用 MOVCA,ADPTR 的指令,根据累
35、加器的值再加上DPTR 的值,就可以使程序计数器PC 指到表格内所要取出的数据。因此,只要把控制码建成一个表,而利用MOVC工,ADPTR 做取码的操作,就可方便地处理一些复杂的控制动作,取表过程如下图所示:单片机原理实验指导书实验教学版本第 26 页5程序框图图 4.5.2 6汇编源程序ORG 0 START:MOV DPTR,#TABLE LOOP:CLR A MOVC A,A+DPTR CJNE A,#01H,LOOP1 JMP START LOOP1:MOV P1,A MOV R3,#20 LCALL DELAY INC DPTR JMP LOOP DELAY:MOV R4,#20 D
36、1:MOV R5,#248 DJNZ R5,$DJNZ R4,D1 DJNZ R3,DELAY RET TABLE:DB 0FEH,0FDH,0FBH,0F7H DB 0EFH,0DFH,0BFH,07FH DB 0FEH,0FDH,0FBH,0F7H DB 0EFH,0DFH,0BFH,07FH DB 07FH,0BFH,0DFH,0EFH DB 0F7H,0FBH,0FDH,0FEH DB 07FH,0BFH,0DFH,0EFH DB 0F7H,0FBH,0FDH,0FEH DB 00H,0FFH,00H,0FFH DB 01H END 单片机原理实验指导书实验教学版本第 27 页7C 语
37、言源程序#include unsigned char code table=0 xfe,0 xfd,0 xfb,0 xf7,0 xef,0 xdf,0 xbf,0 x7f,0 xfe,0 xfd,0 xfb,0 xf7,0 xef,0 xdf,0 xbf,0 x7f,0 x7f,0 xbf,0 xdf,0 xef,0 xf7,0 xfb,0 xfd,0 xfe,0 x7f,0 xbf,0 xdf,0 xef,0 xf7,0 xfb,0 xfd,0 xfe,0 x00,0 xff,0 x00,0 xff,0 x01;unsigned char i;void delay(void)unsigned
38、 char m,n,s;for(m=20;m0;m-)for(n=20;n0;n-)for(s=248;s0;s-);void main(void)while(1)if(tablei!=0 x01)P1=tablei;i+;delay();else i=0;单片机原理实验指导书实验教学版本第 28 页6报警产生器1 实验任务用 P1.0 输出 1KHz 和 500Hz 的音频信号驱动扬声器,作报警信号,要求1KHz 信号响100ms,500Hz 信号响 200ms,交替进行,P1.7 接一开关进行控制,当开关合上响报警信号,当开关断开告警信号停止,编出程序。2 电路原理图图 4.6.1 3 系
39、统板上硬件连线(1把“单片机系统”区域中的P1.0 端口用导线连接到“扬声器模块”区域中的MIC-IN 端口上;(2把“单片机系统”区域中的P1.7/RD 端口用导线连接到“八路拨动开关”区域中的 K1 端口上;4 程序设计内容(1信号产生的方法500Hz 信号周期为2ms,信号电平为每1ms 变反 1 次,1KHz 的信号周期为1ms,信号电平每500us 变反 1 次;5 程序框图单片机原理实验指导书实验教学版本第 29 页图 4.6.2 6 汇编源程序FLAG BIT 00H ORG 00H START:JB P1.7,START JNB FLAG,NEXT MOV R2,#200 DV
40、CPL P1.0 LCALL DELY500 LCALL DELY500 DJNZ R2,DV CPL FLAG NEXT:MOV R2,#200 DV1:CPL P1.0 LCALL DELY500 DJNZ R2,DV1 CPL FLAG SJMP START DELY500:MOV R7,#250 LOOP:NOP DJNZ R7,LOOP RET END 7 C 语言源程序#include#include bit flag;开始K1 按下了吗?FLAG 0 吗?置 200 次计数P1.0 输出取反延时 500us 计数值计完了吗?FLAG 取反置 200 次计数P1.0 输出取反延时
41、 1ms 计数值计完了吗?FLAG 取反单片机原理实验指导书实验教学版本第 30 页unsigned char count;void dely500(void)unsigned char i;for(i=250;i0;i-)_nop_();void main(void)while(1)if(P1_7=0)for(count=200;count0;count-)P1_0=P1_0;dely500();for(count=200;count0;count-)P1_0=P1_0;dely500();dely500();单片机原理实验指导书实验教学版本第 31 页7I/O并行口直接驱动LED显示1.实
42、验任务如图 13 所示,利用AT89S51 单片机的P0 端口的 P0.0P0.7 连接到一个共阴数码管的ah 的笔段上,数码管的公共端接地。在数码管上循环显示09 数字,时间间隔0.2秒。2.电路原理图图 4.7.1 3.系统板上硬件连线把“单片机系统”区域中的P0.0/AD0P0.7/AD7 端口用 8 芯排线连接到“四路动态数码显示模块”区域中的数码管的ah 端口上;要求:P0.0/AD0 与 a 相连,P0.1/AD1与 b 相连,P0.2/AD2 与 c 相连,P0.7/AD7 与 h 相连。然后选任一位选端接地。4.程序设计内容(1LED 数码显示原理七段 LED 显示器内部由七个
43、条形发光二极管和一个小圆点发光二极管组成,根据各管的极管的接线形式,可分成共阴极型和共阳极型。LED 数码管的ga 七个发光二极管因加正电压而发亮,因加零电压而不以发亮,不同亮暗的组合就能形成不同的字形,这种组合称之为字形码,下面给出共阴极的字形码见表2“0”3FH“8”7FH“1”06H“9”6FH 单片机原理实验指导书实验教学版本第 32 页“2”5BH“A”77H“3”4FH“b”7CH“4”66H“C”39H“5”6DH“d”5EH“6”7DH“E”79H“7”07H“F”71H(2由于显示的数字0 9 的字形码没有规律可循,只能采用查表的方式来完成我们所需的要求了。这样我们按着数字0
44、9 的顺序,把每个数字的笔段代码按顺序排好!建立的表格如下所示:TABLEDB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH 5程序框图图 4.7.2 6 汇编源程序ORG 0 START:MOV R1,#00H NEXT:MOV A,R1 MOV DPTR,#TABLE MOVC A,A+DPTR MOV P0,A LCALL DELAY INC R1 CJNE R1,#10,NEXT LJMP START DELAY:MOV R5,#20 D2:MOV R6,#20 D1:MOV R7,#248 DJNZ R7,$DJNZ R6,D1 DJNZ R5,D2
45、RET TABLE:DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH END 7 C 语言源程序单片机原理实验指导书实验教学版本第 33 页#include unsigned char code table=0 x3f,0 x06,0 x5b,0 x4f,0 x66,0 x6d,0 x7d,0 x07,0 x7f,0 x6f;unsigned char dispcount;void delay02s(void)unsigned char i,j,k;for(i=20;i0;i-)for(j=20;j0;j-)for(k=248;k0;k-);void mai
46、n(void)while(1)for(dispcount=0;dispcount10;dispcount+)P0=tabledispcount;delay02s();单片机原理实验指导书实验教学版本第 34 页8按键识别方法之一1 实验任务每按下一次开关SP1,计数值加1,通过 AT89S51 单片机的P1 端口的 P1.0 到 P1.3 显示出其的二进制计数值。2 电路原理图图 4.8.1 3 系统板上硬件连线(1把“单片机系统”区域中的P3.7/RD 端口连接到“低脉冲键盘”区域中的SP1端口上;(2把“单片机系统”区域中的P1.0 P1.4 端口用 8芯排线连接到“八路发光二极管指示模块
47、区域中的“L1L8”端口上;要求,P1.0 连接到 L1,P1.1 连接到 L2,P1.2连接到 L3,P1.3 连接到 L4 上。4 程序设计方法(1其实,作为一个按键从没有按下到按下以及释放是一个完整的过程,也就是说,当我 们 按 下 一 个 按 键时,总希望某个命令只执行一次,而在按键按下的过程中,不要有干扰进来,因为,在按下的过程中,一旦有干扰过来,可能造成误触发过程,这并不是我们所想要的。因此在单片机原理实验指导书实验教学版本按键按下的时候,图 4.8.2 要把我们手上的干扰信号以及按键的机械接触等干扰信号给滤除掉,一般情况下,我们可以采用电容来滤除掉这些干扰信号,但实际上,会增加
48、硬件成本及硬件电路的体积,这是我们不希望,总得有个办法解决这个问题,因此我们可以采用软件滤波的方法去除这些干扰信号,一般情况下,一个按键按下的时候,总是在按下的时刻存在着一定的干扰信号,按下之后就基本上进入了稳定的状态。具体的一个按键从按下到释放的全过程的信号图如上图所示:从图中可以看出,我们在程序设计时,从按键被识别按下之后,延时 5ms 以上,从而避开了干扰信号区域,我们再来检测一次,看按键是否真得已经按下,若真得已经按下,这时肯定输出为低电平,若这时检测到的是高电平,证明刚才是由于干扰信号引起的误触发,CPU 就认为是误触发信号而舍弃这次的按键识别过程。从而提高了系统的可靠性。由于要求每
49、按下一次,命令被执行一次,直到下一次再按下的时候,再执行一次命令,因此从按键被识别出来之后,我们就可以执行这次的命令,所以要有一个等待按键释放的过程,显然释放的过程,就是使其恢复成高电平状态。(2对于按键识别的指令,我们依然选择如下指令JBBIT,REL 指令是用来检测 BIT 是否为高电平,若BIT 1,则程序转向REL处执行程序,否则就继续向 下 执行 程 序。或 者是JNBBIT,REL 指令是用来检测BIT是否为低电平,若 BIT 0,则程序转向 REL 处执行程序,否则就继续向下执行程序。(3但对程序设计过程中按键识别过程的框图如右图所示:图 4.8.3 5 程序框图单片机原理实验指
50、导书实验教学版本第 36 页图 4.8.4 6 汇编源程序ORG 0 START:MOV R1,#00H;初始化 R7 为 0,表示从 0 开始计数MOV A,R1;CPL A;取反指令MOV P1,A;送出 P1 端口由发光二极管显示REL:JNB P3.7,REL;判断 SP1 是否按下LCALL DELAY10MS ;若按下,则延时10ms 左右JNB P3.7,REL;再判断 SP1 是否真得按下INC R7;若真得按下,则进行按键处理,使MOV A,R7;计数内容加1,并送出 P1 端口由CPL A;发光二极管显示MOV P1,A;JNB P3.7,$;等待 SP1 释放SJMP R






