收藏 分享(赏)

单片机实例1-12.doc

上传人:HR专家 文档编号:7296479 上传时间:2019-05-14 格式:DOC 页数:49 大小:591KB
下载 相关 举报
单片机实例1-12.doc_第1页
第1页 / 共49页
单片机实例1-12.doc_第2页
第2页 / 共49页
单片机实例1-12.doc_第3页
第3页 / 共49页
单片机实例1-12.doc_第4页
第4页 / 共49页
单片机实例1-12.doc_第5页
第5页 / 共49页
点击查看更多>>
资源描述

1、1 闪烁灯 1 实验任务 如图 4.1.1 所示:在 P1.0 端口上接一个发光二极管 L1,使 L1 在不停地一亮一灭,一亮一灭的时间间隔为 0.2 秒。 2 电路原理图 图 4.1.1 3 系统板上硬件连线 把“单片机系统”区域中的 P1.0 端口用导线连接到“八路发光二极管指示模块”区域中的 L1 端口上。4 程序设计内容 (1)延时程序的设计方法 作为单片机的指令的执行的时间是很短,数量大微秒级,因此,我们要求的闪烁时间间隔为 0.2 秒,相对于微秒来说,相差太大,所以我们在执行某一指令时,插入延时程序,来达到我们的要求,但这样的延时程序是如何设计呢?下面具体介绍其原理: 如图 4.1

2、.1 所示的石英晶体为 12MHz,因此,1 个机器周期为 1 微秒 机器周期 微秒 MOV R6,#20 2 个 2 D1: MOV R7,#248 2 个 2 22248498 20 DJNZ R7,$ 2 个 2248 (498 DJNZ R6,D1 2 个 22040 10002 因此,上面的延时程序时间为 10.002ms。 由以上可知,当 R610、R7248 时,延时 5ms,R620、R7248 时,延时 10ms,以此为基本的计时单位。如本实验要求 0.2 秒200ms,10msR5200ms,则 R520,延时子程序如下: DELAY: MOV R5,#20D1: MOV

3、R6,#20D2: MOV R7,#248DJNZ R7,$DJNZ R6,D2DJNZ R5,D1RET (2) 输出控制 如图 1 所示,当 P1.0 端口输出高电平,即 P1.01 时,根据发光二极管的单向导电性可知,这时发光二极管 L1 熄灭;当 P1.0 端口输出低电平,即 P1.00 时,发光二极管 L1 亮;我们可以使用 SETB P1.0 指令使 P1.0 端口输出高电平,使用 CLR P1.0 指令使 P1.0 端口输出低电平。5程序框图 如图 4.1.2 所示 图 4.1.2 6 汇编源程序ORG 0START: CLR P1.0LCALL DELAYSETB P1.0LC

4、ALL DELAYLJMP STARTDELAY: MOV R5,#20 ;延时子程序,延时 0.2 秒D1: MOV R6,#20D2: MOV R7,#248DJNZ R7,$DJNZ R6,D2DJNZ R5,D1RETEND7 C 语言源程序#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;delay02s();

5、2 模拟开关灯 1 实验任务 如图 4.2.1 所示,监视开关 K1(接在 P3.0 端口上),用发光二极管 L1(接在单片机 P1.0 端口上)显示开关状态,如果开关合上,L1 亮,开关打开,L1 熄灭。 2 电路原理图 图 4.2.1 3 系统板上硬件连线 (1) 把“单片机系统”区域中的 P1.0 端口用导线连接到“八路发光二极管指示模块” 区域中的 L1 端口上; (2) 把“单片机系统”区域中的 P3.0 端口用导线连接到“四路拨动开关”区域中的 K1 端口上; 4 程序设计内容 (1) 开关状态的检测过程 单片机对开关状态的检测相对于单片机来说,是从单片机的 P3.0 端口输入信号

6、,而输入的信号只有高电平和低电平两种,当拨开开关 K1 拨上去,即输入高电平,相当开关断开,当拨动开关 K1 拨下去,即输入低电平,相当开关闭合。单片机可以采用 JB BIT,REL 或者是 JNB BIT,REL 指令来完成对开关状态的检测即可。 (2) 输出控制 如图 3 所示,当 P1.0 端口输出高电平,即 P1.01 时,根据发光二极管的单向导电性可知,这时发光二极管 L1 熄灭;当 P1.0 端口输出低电平,即 P1.00时,发光二极管 L1 亮;我们可以使用 SETB P1.0 指令使 P1.0 端口输出高电平,使用 CLR P1.0 指令使 P1.0 端口输出低电平。 5 程序

7、框图 图 4.2.2 6 汇编源程序 ORG 00HSTART: JB P3.0,LIGCLR P1.0SJMP STARTLIG: SETB P1.0SJMP STARTEND 7 C 语言源程序#include sbit K1=P30;sbit L1=P10;void main(void)while(1)if(K1=0)L1=0; /灯亮elseL1=1; /灯灭 3 多路开关状态指示 1 实验任务 如图 4.3.1 所示,AT89S51 单片机的 P1.0P1.3 接四个发光二极管L1L4,P1.4P1.7 接了四个开关 K1K4,编程将开关的状态反映到发光二极管上。(开关闭合,对应的灯

8、亮,开关断开,对应的灯灭)。 2 电路原理图 图 4.3.1 3 系统板上硬件连线 (1 把“单片机系统”区域中的 P1.0P1.3 用导线连接到“八路发光二极管指示模块”区域中的 L1L4 端口上; (2 把“单片机系统”区域中的 P1.4P1.7 用导线连接到“四路拨动开关”区域中的 K1K4 端口上; 4 程序设计内容 (1 开关状态检测 对于开关状态检测,相对单片机来说,是输入关系,我们可轮流检测每个开关状态,根据每个开关的状态让相应的发光二极管指示,可以采用 JB P1.X,REL 或 JNB P1.X,REL 指令来完成;也可以一次性检测四路开关状态,然后让其指示,可以采用 MOV

9、 A,P1 指令一次把 P1 端口的状态全部读入,然后取高 4 位的状态来指示。 (2 输出控制 根据开关的状态,由发光二极管 L1L4 来指示,我们可以用 SETB P1.X 和CLR P1.X 指令来完成,也可以采用 MOV P1,1111XXXXB 方法一次指示。 5 程序框图 读 P1 口数据到 ACC中 ACC内容右移 4 次 ACC内容与 F0H 相或 ACC内容送入 P1 口 图 4.3.2 6 方法一(汇编源程序)ORG 00HSTART: MOV A,P1ANL A,#0F0HRR ARR ARR ARR AXOR A,#0F0HMOV P1,ASJMP STARTEND7

10、方法一(C 语言源程序)#include unsigned char temp;void main(void)while(1)temp=P14;temp=temp | 0xf0;P1=temp;8 方法二(汇编源程序)ORG 00HSTART: JB P1.4,NEXT1CLR P1.0SJMP NEX1NEXT1: SETB P1.0NEX1: JB P1.5,NEXT2CLR P1.1SJMP NEX2NEXT2: SETB P1.1NEX2: JB P1.6,NEXT3CLR P1.2SJMP NEX3NEXT3: SETB P1.2NEX3: JB P1.7,NEXT4CLR P1.3

11、SJMP NEX4NEXT4: SETB P1.3NEX4: SJMP STARTEND9 方法二(C 语言源程序)#include void main(void)while(1)if(P1_4=0)P1_0=0;elseP1_0=1;if(P1_5=0)P1_1=0;elseP1_1=1;if(P1_6=0)P1_2=0;elseP1_2=1;if(P1_7=0)P1_3=0;elseP1_3=1; 4 广告灯的左移右移 1 实验任务 做单一灯的左移右移,硬件电路如图 4.4.1 所示,八个发光二极管 L1L8分别接在单片机的 P1.0P1.7 接口上,输出“0”时,发光二极管亮,开始时 P

12、1.0P1.1P1.2P1.3P1.7P1.6P1.0 亮,重复循环。 2 电路原理图 图 4.4.1 3 系统板上硬件连线 把“单片机系统”区域中的 P1.0P1.7 用 8 芯排线连接到“八路发光二极管指示模块”区域中的 L1L8 端口上,要求:P1.0 对应着 L1,P1.1 对应着L2,P1.7 对应着 L8。 4 程序设计内容 我们可以运用输出端口指令 MOV P1,A 或 MOV P1,DATA,只要给累加器值或常数值,然后执行上述的指令,即可达到输出控制的动作。 每次送出的数据是不同,具体的数据如下表 1 所示 P1.7 P1.6 P1.5 P1.4 P1.3 P1.2 P1.1

13、 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 亮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 1 L7 亮0 1 1 1 1 1 1 1 L8 亮表 1 5程序框图 图 4.4.2 6 汇编源程序ORG 0START: MOV R2,#8MOV A,#0FEHSETB CLOOP: MOV P1,ALCALL DELAYRLC ADJNZ R2,LOOPMOV

14、 R2,#8LOOP1: MOV P1,ALCALL DELAYRRC ADJNZ R2,LOOP1LJMP STARTDELAY: MOV R5,#20 ;D1: MOV R6,#20D2: MOV R7,#248DJNZ R7,$DJNZ R6,D2DJNZ R5,D1RETEND7 C 语言源程序#include unsigned char i;unsigned char temp;unsigned char a,b;void delay(void)unsigned char m,n,s;for(m=20;m0;m-)for(n=20;n0;n-)for(s=248;s0;s-);voi

15、d main(void)while(1)temp=0xfe;P1=temp;delay();for(i=1;i(8-i);P1=a|b;delay();for(i=1;ii;b=tempunsigned char code table=0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0x00,0xff,0x00,0xff,0x

16、01;unsigned char i;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)if(tablei!=0x01)P1=tablei;i+;delay();elsei=0; 6 报警产生器 1 实验任务 用 P1.0 输出 1KHz 和 500Hz 的音频信号驱动扬声器,作报警信号,要求1KHz 信号响 100ms,500Hz 信号响 200ms,交替进行,P1.7 接一开关进行控制,当开关合上响报警信号,当开关断开告警信号停止

17、,编出程序。 2 电路原理图 图 4.6.1 3 系统板上硬件连线 (1 把“单片机系统”区域中的 P1.0 端口用导线连接到“音频放大模块”区域中的 SPK IN 端口上; (2 在“音频放大模块”区域中的 SPK OUT 端口上接上一个 8 欧的或者是16 欧的喇叭; (3 把“单片机系统”区域中的 P1.7/RD 端口用导线连接到“四路拨动开关”区域中的 K1 端口上; 4 程序设计内容 (1 信号产生的方法 500Hz 信号周期为 2ms,信号电平为每 1ms 变反 1 次,1KHz 的信号周期为 1ms,信号电平每 500us 变反 1 次; 5 程序框图 图 4.6.2 6 汇编源

18、程序FLAG BIT 00HORG 00HSTART: JB P1.7,STARTJNB FLAG,NEXTMOV R2,#200DV: CPL P1.0LCALL DELY500LCALL DELY500DJNZ R2,DVCPL FLAGNEXT: MOV R2,#200DV1: CPL P1.0LCALL DELY500DJNZ R2,DV1CPL FLAGSJMP STARTDELY500: MOV R7,#250LOOP: NOPDJNZ R7,LOOPRETEND7 C 语言源程序#include #include bit flag;unsigned char count;void

19、 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(); 7 I/O 并行口直接驱动 LED 显示 1. 实验任务 如图 13 所示,利用 AT89S51 单片机的 P0 端口的 P0.0P0.7 连接到一个共阴数码管的 ah 的笔段上,数码管的公共端接地。在数码管上循

20、环显示 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. 程序设计内容 (1 LED 数码显示原理 七段 LED 显示器内部由七个条形发光二极管和一个小圆点发光二极管组成,根据各管的极管的接线形式,可分成共阴极型和共阳极型。 LED 数码管的 ga 七个发光二极管因加正

21、电压而发亮,因加零电压而不以发亮,不同亮暗的组合就能形成不同的字形,这种组合称之为字形码,下面给出共阴极的字形码见表 2 “0” 3FH “8” 7FH “1” 06H “9” 6FH “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 由于显示的数字 09 的字形码没有规律可循,只能采用查表的方式来完成我们所需的要求了。这样我们按着数字 09 的顺序,把每个数字的笔段代码按顺序排好!建立的表格如下所示:TABLE DB 3FH,06H,5BH,4F

22、H,66H,6DH,7DH,07H,7FH,6FH 5程序框图 图 4.7.2 6 汇编源程序ORG 0START: MOV R1,#00HNEXT: MOV A,R1MOV DPTR,#TABLEMOVC A,A+DPTRMOV P0,ALCALL DELAYINC R1CJNE R1,#10,NEXTLJMP STARTDELAY: MOV R5,#20D2: MOV R6,#20D1: MOV R7,#248DJNZ R7,$DJNZ R6,D1DJNZ R5,D2RETTABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FHEND7 C 语言源

23、程序#include unsigned char code table=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f;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 main(void)while(1)for(dispcount=0;dispcount10;dispcount+)P0=tabledispcount;delay02s(); 8 按键识别方法之一 1

24、 实验任务 每按下一次开关 SP1,计数值加 1,通过 AT89S51 单片机的 P1 端口的 P1.0 到P1.3 显示出其的二进制计数值。 2 电路原理图 图 4.8.1 3 系统板上硬件连线 (1 把“单片机系统”区域中的 P3.7/RD 端口连接到“独立式键盘”区域中的 SP1 端口上; (2 把“单片机系统”区域中的 P1.0P1.4 端口用 8 芯排线连接到“八路发光二极管指示模块”区域中的“L1L8”端口上;要求,P1.0 连接到L1,P1.1 连接到 L2,P1.2 连接到 L3,P1.3 连接到 L4 上。 4 程序设计方法 (1 其实,作为一个按键从没有按下到按下以及释放是

25、一个完整的过程,也就是说,当我们按下一个按键时,总 希望某个命令只执行一次,而在按键按下的过程中,不要有干扰进来,因为,在按下的过程中,一旦有干扰过来,可能造成误触发过程,这并不是我们所想要的。因此在按键按下的时候, 图 4.8.2 要把我们手上的干扰信号以及按键的机械接触等干扰信号给滤除掉,一般情况下,我们可以采用电容来滤除掉这些干扰信号,但实际上,会增加硬件成本及硬件电路的体积,这是我们不希望,总得有个办法解决这个问题,因此我们可以采用软件滤波的方法去除这些干扰信号,一般情况下,一个按键按下的时候,总是在按下的时刻存在着一定的干扰信号,按下之后就基本上进入了稳定的状态。具体的一个按键从按下

26、到释放的全过程的信号图如上图所示:从图中可以看出,我们在程序设计时,从按键被识别按下之后,延时 5ms 以上,从而避开了干扰信号区域,我们再来检测一次,看按键是否真得已经按下,若真得已经按下,这时肯定输出为低电平,若这时检测到的是高电平,证明刚才是由于干扰信号引起的误触发,CPU 就认为是误触发信号而舍弃这次的按键识别过程。从而提高了系统的可靠性。 由于要求每按下一次,命令被执行一次,直到下一次再按下的时候,再执行一次命令,因此从按键被识别出来之后,我们就可以执行这次的命令,所以要有一个等待按键释放的过程,显然释放的过程,就是使其恢复成高电平状态。 (1 对于按键识别的指令,我们依然选择如下指

27、令 JB BIT,REL 指令是用来检测 BIT 是否为高电平,若 BIT1,则程序转向 REL 处执行程序,否则就继续向下执行程序。或者是 JNB BIT,REL 指令是用来检测 BIT 是否为低电平,若 BIT0,则程序转向 REL 处执行程序,否则就继续向下执行程序。 (2 但对程序设计过程中按键识别过程的框图如右图所示:图 4.8.3 5 程序框图 图 4.8.4 6 汇编源程序ORG 0START: MOV R1,#00H ;初始化 R7 为 0,表示从 0 开始计数MOV A,R1 ;CPL A ;取反指令MOV P1,A ;送出 P1 端口由发光二极管显示REL: JNB P3.7,REL ;判断 SP1 是否按下

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

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


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

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

道客多多©版权所有2020-2025营业执照举报