51单片机汇编语言及C语言经典实例

上传人:仙*** 文档编号:98531619 上传时间:2022-05-29 格式:DOC 页数:26 大小:1.43MB
返回 下载 相关 举报
51单片机汇编语言及C语言经典实例_第1页
第1页 / 共26页
51单片机汇编语言及C语言经典实例_第2页
第2页 / 共26页
51单片机汇编语言及C语言经典实例_第3页
第3页 / 共26页
点击查看更多>>
资源描述
-. z-51单片机汇编语言及C语言经典实例实验及课程设计51单片机汇编语言及C语言经典实例. z-一、闪烁灯如图1 所示为一简单单片机系统原理图:在 P1.0 端口上接一个发光二极管 L1,使 L1 在不停地一亮一灭,一亮一灭的时间间隔为 0.2 秒。延时程序的设计方法,作为单片机的指令的执行的时间是很短,数量大微秒级,因此,我们要求的闪烁时间间隔为 0.2 秒,相对于微秒来说,相差太大,所以我们在执行*一指令时,插入延时程序,来到达我们的要求,但这样的延时程序是如何设计呢.下面具体介绍其原理:如图 所示的石英晶体为 12MHz,因此,1 个机器周期为 1 微秒,机器周期 微秒如图 1 所示,当 P1.0 端口输出高电平,即 P1.01 时,根据发光二极管的单向导电性可知,这时发光二极管 L1 熄灭;当 P1.0 端口输出低电平,即 P1.00 时,发光二极管 L1 亮;我们可以使用 SETB P1.0 指令使 P1.0端口输出高电平,使用 CLR P1.0 指令使 P1.0 端口输出低电平。C 语言源程序*include sbit L1=P10;void delay02s(void) /延时 0.2 秒子程序图1 单片机原理图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();汇编源程序ORG 0START: CLR P1.0LCALL DELAY图2 程序设计流程图SETB P1.0LCALL DELAYLJMP STARTDELAY: MOV R5,*20 ;延时子程序,延时 0.2 秒D1: MOV R6,*20D2: MOV R7,*248DJNZ R7,$DJNZ R6,D2DJNZ R5,D1RETEND二、多路开关状态指示如图 3 所示,AT89S51 单片机的 P1.0P1.3 接四个发光二极管 L1L4,P1.4P1.7 接了四个开关 K1K4,编程将开关的状态反映到发光二极管上。开关闭合,对应的灯亮,开关断开,对应的灯灭。对于开关状态检测,相对单片机来说,是输入关系,我们可轮流检测每个开关状态,根据每个开关的状态让相应的发光二极管指示,可以采用 P1.*,REL或 JNB P1.*,REL 指令来完成;也可以一次性检测四路开关状态,然后让其指示,可以采用 MOV A,P1 指令一次把 P1 端口的状态全部读入,然后取高 4 位的状态来指示。方法1汇编源程序ORG 00HSTART: MOV A,P1ANL A,*0F0HRR ARR ARR ARR AORL A,*0F0HMOV P1,ASJMP STARTEND方法1C语言程序图4 程序流程图*INClude unsigned char temp;void main(void)while(1)temp=P14;temp=temp | 0*f0;P1=temp;方法2汇编源程序ORG 00HSTART: P1.4,NE*T1CLR P1.0SJMP NE*1图3 单片机原理图NE*T1: SETB P1.0NE*1: P1.5,NE*T2CLR P1.1SJMP NE*2NE*T2: SETB P1.1NE*2: P1.6,NE*T3CLR P1.2SJMP NE*3NE*T3: SETB P1.2NE*3: P1.7,NE*T4CLR P1.3SJMP NE*4NE*T4: SETB P1.3NE*4: SJMP STARTEND方法2C 语言源程序*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;else图5 单片机原理图三、广告灯的设计利用取表的方法,使端口 P1 做单一灯的变化:左移 2 次,右移 2 次,闪烁 2 次延时的时间 0.2 秒。利用 MOV DPTR,DATA16 的指令来使数据指针存放器指到表的开头。利用 MOVC A,ADPTR 的指令,根据累加器的值再加上 DPTR 的值,就可以使程序计数器 PC 指到表格所要取出的数据。因此,只要把控制码建成一个表,而利用 MOVC A,ADPTR 做取码的操作,就可方便地处理一些复杂的控制动作,取表过程如以下图所示:汇编源程序ORG 0START: MOV DPTR,*TABLELOOP: CLR AMOVC A,A+DPTRCJNE A,*01H,LOOP1JMP STARTLOOP1: MOV P1,AMOV R3,*20LCALL DELAYINC DPTRJMP LOOPDELAY: MOV R4,*20D1: MOV R5,*248图6 程序流程图DJNZ R5,$DJNZ R4,D1DJNZ R3,DELAYRRETTABLE: DB 0FEH,0FDH,0FBH,0F7HDB 0EFH,0DFH,0BFH,07FHDB 0FEH,0FDH,0FBH,0F7HDB 0EFH,0DFH,0BFH,07FHDB 07FH,0BFH,0DFH,0EFHDB0F7H,0FBH,0FDH,0FEHDB 07FH,0BFH,0DFH,0EFHDB0F7H,0FBH,0FDH,0FEHDB 00H, 0FFH,00H, 0FFHDB 01HENDC 语言源程序*INClude unsigned char code table=0*fe,0*fd,0*fb,0*f7,0*ef,0*df,0*bf,0*7f,0*fe,0*fd,0*fb,0*f7,0*ef,0*df,0*bf,0*7f,0*7f,0*bf,0*df,0*ef,0*f7,0*fb,0*fd,0*fe,0*7f,0*bf,0*df,0*ef,0*f7,0*fb,0*fd,0*fe,0*00,0*ff,0*00,0*ff,0*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!=0*01)P1=tablei;i+;delay();elsei=0;四、 0059 秒计时器如以下图8所示,在 AT89S51 单片机的 P0 和 P2 端口分别接有两个共阴数码管,P0 口驱动显示秒的时间的十位,而 P2 口驱动显示秒的时间的个位。在设计过程中我们用一个存储单元作为秒计数单元,当一秒钟到来时,就让秒计数单元加 1,当秒计数到达 60 时,就自动返回到 0,重新秒计数。对于秒计数单元中的数据要把它十位数和个位数分开,方法仍采用对 10 整除和对 10 求余。汇编源程序Second EQU 30HORG 0000HSTART: MOV Second,*00HNE*T: MOV A,SecondMOV B,*10DIV ABMOV DPTR,*TABLEMOVC A,A+DPTRMOV P0,AMOV A,BMOVC A,A+DPTRMOV P2,ALCALL DELY1SINC SecondMOV A,SecondCJNE A,*60,NE*T图7 程序流程图LJMP STARTDELY1S: MOV R5,*100D2: MOV R6,*20D1: MOV R7,*248DJNZ R7,$DJNZ R6,D1DJNZ R5,D2RETTABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FHENDC 语言源程序*include unsigned char code table=0*3f,0*06,0*5b,0*4f,0*66,0*6d,0*7d,0*07,0*7f,0*6f;unsigned char Second;void delay1s(void)unsigned char i,j,k;for(k=100;k0;k-)for(i=20;i0;i-)for(j=248;j0;j-);void main(void)Second=0;P0=tableSecond/10;P2=tableSecond%10;while(1)delay1s();Second+;if(Second=60)Second=0;P0=tableSecond/10;P2=tableSecond%10;图8 单片机原理图五、动态数码显示技术如图9所示,P0 端口接动态数码管的字形码笔段,P2 端口接动态数码管的数位选择端,P1.7 接一个开关,当开关接高电平时,显示“12345字样;当开关接低电平时,显示“HELLO字样。动态扫描方法:动态接口采用各数码管循环轮流显示的方法,当循环显示频率较高时,利用人眼的暂留特性,看不出闪烁显示现象,这种显示需要一个接口完成字形码的输出字形选择,另一接口完成各数码管的轮流点亮数位选择。在进展数码显示的时候,要对显示单元开辟 8 个显示缓冲区,每个显示缓冲区装有显示的不同数据即可。对于显示的字形码数据我们采用查表方法来完成。汇编源程序图9 单片机原理图ORG 0000HSTART: P1.7,DIR1MOV DPTR,*TABLE1SJMP DIRDIR1: MOV DPTR,*TABLE2DIR: MOV R0,*00HMOV R1,*01HNE*T: MOV A,R0MOVC A,A+DPTRMOV P0,AMOV A,R1MOV P2,ALCALL DAYINC R0RL AMOV R1,ACJNE R1,*0DFH,NE*TSJMP STARTDAY: MOV R6,*4D1: MOV R7,*248DJNZ R7,$DJNZ R6,D1图10 单片机原理图RETTABLE1: DB 06H,5BH,4FH,66H,6DHTABLE2: DB 78H,79H,38H,38H,3FHENDC 语言源程序*include Unsigned char code table1=0*06,0*5b,0*4f,0*66,0*6d;Unsignedcharcode table2=0*78,0*79,0*38,0*38,0*3f;Unsignedchari;Unsignedchara,b;Unsignedchartemp;void main(void)while(1)temp=0*fe;for(i=0;i5;i+)if(P1_7=1)P0=table1i;elseP0=table2i;P2=temp;a=temp(7-i);temp=a|b;for(a=4;a0;a-)for(b=248;b0;b-);. z-六、44 矩阵式键盘识别技术如图11所示,用 AT89S51 的并行口 P1 接 44 矩阵键盘,以 P1.0P1.3作输入线,以 P1.4P1.7 作输出线;在数码管上显示每个按键的“0F序。对应的按键的序号排列如图12所示每个按键有它的行值和列值,行值和列值的组合就是识别这个按键的编码。矩阵的行线和列线分别通过两并行接口和 CPU 通信。每个按键的状态同样需变成数字量“0和“1,开关的一端列线通过电阻接 VCC,而接地是通过程序输出数字“0实现的。键盘处理程序的任务是:确定有无键按下,判断哪一个键按下,键的功能是什么;还要消除按键在闭合或断开时的抖动。两个并行口中,一个输出扫描码,使按键逐行动态接地,另一个并行口输入按键状态,由行扫描值和回馈信号共同形成键编码而识别按键,通过软件查表,查出该键的功能。. z-汇编源程序KEYBUF EQU 30HORG 00HSTART: MOV KEYBUF,*2WAIT:MOV P3,*0FFHCLR P3.4MOV A,P3ANL A,*0FH*RL A,*0FHJZ NOKEY1LCALL DELY10MSMOV A,P3ANL A,*0FH*RL A,*0FHJZ NOKEY1MOV A,P3ANL A,*0FHCJNE A,*0EH,NK1MOV KEYBUF,*0LJMP DK1NK1: CJNE A,*0DH,NK2MOV KEYBUF,*1LJMP DK1NK2: CJNE A,*0BH,NK3MOV KEYBUF,*2LJMP DK1NK3: CJNE A,*07H,NK4MOV KEYBUF,*3LJMP DK1NK4: NOPDK1:MOV A,KEYBUFMOV DPTR,*TABLEMOVC A,A+DPTRMOV P0,ADK1A: MOV A,P3ANL A,*0FH*RL A,*0FHJNZ DK1ANOKEY1:MOV P3,*0FFHCLR P3.5MOV A,P3ANL A,*0FH*RL A,*0FHJZ NOKEY2LCALL DELY10MSMOV A,P3ANL A,*0FH*RL A,*0FHJZ NOKEY2MOV A,P3ANL A,*0FHCJNE A,*0EH,NK5MOV KEYBUF,*4LJMP DK2NK5: CJNE A,*0DH,NK6MOV KEYBUF,*5LJMP DK2NK6: CJNE A,*0BH,NK7MOV KEYBUF,*6LJMP DK2NK7: CJNE A,*07H,NK8MOV KEYBUF,*7LJMP DK2NK8: NOPDK2:MOV A,KEYBUFMOV DPTR,*TABLEMOVC A,A+DPTRMOV P0,ADK2A: MOV A,P3ANL A,*0FH*RL A,*0FHJNZ DK2ANOKEY2:MOV P3,*0FFHCLR P3.6MOV A,P3ANL A,*0FH*RL A,*0FHJZ NOKEY3LCALL DELY10MSMOV A,P3ANL A,*0FH*RL A,*0FHJZ NOKEY3MOV A,P3ANL A,*0FHCJNE A,*0EH,NK9MOV KEYBUF,*8LJMP DK3NK9: CJNE A,*0DH,NK10MOV KEYBUF,*9LJMP DK3NK10: CJNE A,*0BH,NK11MOV KEYBUF,*10LJMP DK3NK11: CJNE A,*07H,NK12MOV KEYBUF,*11LJMP DK3NK12: NOPDK3:MOV A,KEYBUFMOV DPTR,*TABLEMOVC A,A+DPTRMOV P0,ADK3A: MOV A,P3ANL A,*0FH*RL A,*0FHJNZ DK3ANOKEY3:MOV P3,*0FFHCLR P3.7MOV A,P3ANL A,*0FH*RL A,*0FHJZ NOKEY4LCALL DELY10MSMOV A,P3ANL A,*0FH*RL A,*0FHJZ NOKEY4MOV A,P3ANL A,*0FHCJNE A,*0EH,NK13MOV KEYBUF,*12LJMP DK4NK13: CJNE A,*0DH,NK14MOV KEYBUF,*13LJMP DK4NK14: CJNE A,*0BH,NK15MOV KEYBUF,*14LJMP DK4NK15: CJNE A,*07H,NK16MOV KEYBUF,*15LJMP DK4NK16: NOPDK4:MOV A,KEYBUFMOV DPTR,*TABLEMOVC A,A+DPTRMOV P0,ADK4A: MOV A,P3ANL A,*0FH*RL A,*0FHJNZ DK4ANOKEY4:LJMP WAITDELY10MS:MOV R6,*10D1: MOV R7,*248DJNZ R7,$DJNZ R6,D1RETTABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07HDB 7FH,6FH,77H,7CH,39H,5EH,79H,71HENDC 语言源程序*INClude unsigned char code table=0*3f,0*06,0*5b,0*4f,0*66,0*6d,0*7d,0*07,0*7f,0*6f,0*77,0*7c,0*39,0*5e,0*79,0*71;unsigned char temp;unsigned char key;unsigned char i,j;void main(void)while(1)P3=0*ff;P3_4=0;temp=P3;temp=temp & 0*0f;if (temp!=0*0f)for(i=50;i0;i-)for(j=200;j0;j-);temp=P3;temp=temp & 0*0f;if (temp!=0*0f)temp=P3;temp=temp & 0*0f;switch(temp)case 0*0e:key=7;break;case 0*0d:key=8;break;case 0*0b:key=9;break;case 0*07:key=10;break;temp=P3;P1_0=P1_0;P0=tablekey;temp=temp & 0*0f;while(temp!=0*0f)temp=P3;temp=temp & 0*0f;P3=0*ff;P3_5=0;temp=P3;temp=temp & 0*0f;if (temp!=0*0f)for(i=50;i0;i-)for(j=200;j0;j-);temp=P3;temp=temp & 0*0f;if (temp!=0*0f)temp=P3;temp=temp & 0*0f;switch(temp)case 0*0e:key=4;break;case 0*0d:key=5;break;case 0*0b:key=6;break;case 0*07:key=11;break;temp=P3;P1_0=P1_0;P0=tablekey;temp=temp & 0*0f;while(temp!=0*0f)temp=P3;temp=temp & 0*0f;P3=0*ff;P3_6=0;temp=P3;temp=temp & 0*0f;if (temp!=0*0f)for(i=50;i0;i-)for(j=200;j0;j-);temp=P3;temp=temp & 0*0f;if (temp!=0*0f)temp=P3;temp=temp & 0*0f;switch(temp)case 0*0e:key=1;break;case 0*0d:key=2;break;case 0*0b:key=3;break;case 0*07:key=12;break;temp=P3;P1_0=P1_0;P0=tablekey;temp=temp & 0*0f;while(temp!=0*0f)temp=P3;temp=temp & 0*0f;P3=0*ff;P3_7=0;temp=P3;temp=temp & 0*0f;if (temp!=0*0f)for(i=50;i0;i-)for(j=200;j0;j-);temp=P3;temp=temp & 0*0f;if (temp!=0*0f)temp=P3;temp=temp & 0*0f;switch(temp)case 0*0e:key=0;break;case 0*0d:key=13;break;case 0*0b:key=14;break;case 0*07:key=15;break;temp=P3;P1_0=P1_0;P0=tablekey;temp=temp & 0*0f;while(temp!=0*0f)temp=P3;temp=temp & 0*0f;. z-. z-七、按键识别方法每按下一次开关 SP1,计数值加 1,通过AT89S51 单片机的 P1 端口的 P1.0 到 P1.3显示出其二进制计数值。*程序设计方法:作为一个按键从没有按下到按下以及释放是一个完整的过程,也就是说,当我们按下一个按键时,总希望*个命令只执行一次,而在按键按下的 过程中,不要有干扰进来,因为,在按下的过程中,一旦有干扰过来,可能造成误触发过程,这并不是我们所想要的。因此在按键按下的时候,要把我们手上的干扰信号以及按键的机械接触等干扰信号给滤除掉,一般情况下,我们可以采用电容来滤除掉这些干扰信号,但实际上,会增加硬件本钱及硬件电路的体积,这是我们不希望,总得有个方法解决这个问题,因此我们可以采用软件滤波的方法去除这些干扰信号,一般情况下,一个按键按下的时候,总是在按下的时刻存在着一定的干扰信号,按下之后就根本上进入了稳定的状态。具体的一个按键从按下到释放的全过程的信号图如上图所示:从图中可以看出,我们在程序设计时,从按键被识别按下之后,延时 5ms 以上,从而避开了干扰信号区域,我们再来检测一次,看按键是否真得已经按下,假设真得已经按下,这时肯定输出为低电平,假设这时检测到的是高电平,证明刚刚是由于干扰信号引起的误触发,CPU 就认为是误触发信号而舍弃这次的按键识别过程。从而提高了系统的可靠性。由于要求每按下一次,命令被执行一次,直到下一次再按下的时候,再执行一次命令,因此从按键被识别出来之后,我们就可以执行这次的命令,所以要有一个等待按键释放的过程,显然释放的过程,就是使其恢复成高电平状态。. z-1 汇编源程序ORG 0000HSTART: MOV R1,*00H ;初始化 R1 为 0,表示从 0 开场计数MOV A,R1 ;CPL A ;取反指令MOV P1,A ;送出 P1 端口由发光二极管显示REL: P3.7,REL ;判断 SP1 是否按下LCALL DELAY10MS ;假设按下,则延时 10ms 左右 P3.7,REL ;再判断 SP1 是否真得按下INC R1 ;假设确实按下,则进展按键处理,使MOV A,R1 ;计数容加 1,并送出 P1 端口由CPL A ;发光二极管显示MOV P1,A ;JNB P3.7,$ ;等待 SP1 释放SJMP REL ;继续对 K1 按键扫描DELAY10MS: MOV R6,*20 ;延时 10ms 子程序L1: MOV R7,*248DJNZ R7,$DJNZ R6,L1RETEND2. C 语言源程序*include unsigned char count;void delay10ms(void)unsigned char i,j;for(i=20;i0;i-)for(j=248;j0;j-);void main(void)while(1)if(P3_7=0)delay10ms();if(P3_7=0)count+;if(count=16)count=0;P1=count;while(P3_7=0);. z-八、数字钟1 开机时,显示 12:00:00 的时间开场计时;2 P0.0/AD0 控制“秒的调整,每按一次加 1 秒;3 P0.1/AD1 控制“分的调整,每按一次加 1 分;4 P0.2/AD2 控制“时的调整,每按一次加 1 个小时6 汇编源程序SECOND EQU 30HMINITE EQU 31HHOUR EQU 32HHOURK BIT P0.0MINITEK BIT P0.1SECONDK BIT P0.2DISPBUF EQU 40HDISPBIT EQU 48HT2STA EQU 49HT2STB EQU 4AHTEMP EQU 4BHORG 00HLJMP STARTORG 0BHLJMP INT_T0START: MOV SECOND,*00HMOV MINITE,*00HMOV HOUR,*12MOV DISPBIT,*00HMOV T2STA,*00HMOV T2STB,*00HMOV TEMP,*0FEHLCALL DISPMOV TMOD,*01HMOV TH0,*(65536-2000) / 256MOV TL0,*(65536-2000) MOD 256SETB TR0SETB ET0SETB EAWT: SECONDK,NK1LCALL DELY10MS SECONDK,NK1INC SECONDMOV A,SECONDCJNE A,*60,NS60MOV SECOND,*00HNS60: LCALL DISPJNB SECONDK,$NK1: MINITEK,NK2LCALL DELY10MS MINITEK,NK2INC MINITEMOV A,MINITECJNE A,*60,NM60MOV MINITE,*00HNM60: LCALL DISPJNB MINITEK,$NK2: HOURK,NK3LCALL DELY10MS HOURK,NK3INC HOURMOV A,HOURCJNE A,*24,NH24MOV HOUR,*00HNH24: LCALL DISPJNB HOURK,$NK3: LJMP WTDELY10MS:MOV R6,*10D1: MOV R7,*248DJNZ R7,$DJNZ R6,D1RETDISP:MOV A,*DISPBUFADD A,*8DEC AMOV R1,AMOV A,HOURMOV B,*10DIV ABMOV R1,ADEC R1MOV A,BMOV R1,ADEC R1MOV A,*10MOVR1,ADEC R1MOV A,MINITEMOV B,*10DIV ABMOV R1,ADEC R1MOV A,BMOV R1,ADEC R1MOV A,*10MOVR1,ADEC R1MOV A,SECONDMOV B,*10DIV ABMOV R1,ADEC R1MOV A,BMOV R1,ADEC R1RETINT_T0:MOV TH0,*(65536-2000) / 256MOV TL0,*(65536-2000) MOD 256MOV A,*DISPBUFADD A,DISPBITMOV R0,AMOV A,R0MOV DPTR,*TABLEMOVC A,A+DPTRMOV P1,AMOV A,DISPBITMOV DPTR,*TABMOVC A,A+DPTRMOV P3,AINC DISPBITMOV A,DISPBITCJNE A,*08H,KNAMOV DISPBIT,*00HKNA: INC T2STAMOV A,T2STACJNE A,*100,DONEMOV T2STA,*00HINC T2STBMOV A,T2STBCJNE A,*05H,DONEMOV T2STB,*00HINC SECONDMOV A,SECONDCJNE A,*60,NE*TMOV SECOND,*00HINC MINITEMOV A,MINITECJNE A,*60,NE*TMOV MINITE,*00HINC HOURMOV A,HOURCJNE A,*24,NE*TMOV HOUR,*00HNE*T: LCALL DISPDONE: RETITABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,40HTAB: DB 0FEH,0FDH,0FBH,0F7H,0EFH,0DFH,0BFH,07FHEND. z-7 C 语言源程序*INClude unsigned char code dispcode=0*3f,0*06,0*5b,0*4f,0*66,0*6d,0*7d,0*07,0*7f,0*6f,0*77,0*7c,0*39,0*5e,0*79,0*71,0*00;unsigned char dispbitcode=0*fe,0*fd,0*fb,0*f7,0*ef,0*df,0*bf,0*7f;unsigned char dispbuf8=0,0,16,0,0,16,0,0;unsigned char dispbitt;unsigned char second;unsigned char minite;unsigned char hour;unsigned int tt;unsigned char mstt;unsigned char i,j;void main(void)TMOD=0*02;TH0=0*06;TL0=0*06;TR0=1;ET0=1;EA=1;while(1)if(P0_0=0)for(i=5;i0;i-)for(j=248;j0;j-);if(P0_0=0)second+;if(second=60)second=0;dispbuf0=second%10;dispbuf1=second/10;while(P0_0=0);if(P0_1=0)for(i=5;i0;i-)for(j=248;j0;j-);if(P0_1=0)minite+;if(minite=60)minite=0;dispbuf3=minite%10;dispbuf4=minite/10;while(P0_1=0);if(P0_2=0)for(i=5;i0;i-)for(j=248;j0;j-);if(P0_2=0)hour+;if(hour=24)hour=0;dispbuf6=hour%10;dispbuf7=hour/10;while(P0_2=0);void t0(void) interrupt 1 using 0mstt+;if(mstt=8)mstt=0;P1=dispcodedispbufdispbitt;P3=dispbitcodedispbitt;dispbitt+;if(dispbitt=8)dispbitt=0;tt+;if(tt=4000). z-tt=0;second+;if(second=60)second=0;minite+;if(minite=60)minite=0;hour+;if(hour=24)hour=0;dispbuf0=second%10;dispbuf1=second/10;dispbuf3=minite%10;dispbuf4=minite/10;dispbuf6=hour%10;dispbuf7=hour/10;. z-九 ADC0809A/D 转换器根本应用技术1 根本知识ADC0809 是带有 8 位 A/D 转换器、8 路多路开关以及微处理机兼容的控制逻辑的 CMOS 组件。它是逐次逼近式 A/D 转换器,可以和单片机直接接口。2 ADC0809 的部逻辑构造图9-1由上图可知,ADC0809 由一个 8 路模拟开关、一个地址锁存与译码器、一个 A/D转换器和一个三态输出锁存器组成。多路开关可选通 8 个模拟通道,允许 8 路模拟量分时输入,共用 A/D 转换器进展转换。三态输出锁器用于锁存 A/D 转换完的数字量,当 OE 端为高电平时,才可以从三态输出锁存器取走转换完的数据。3 引脚构造IN0IN7:8 条模拟量输入通道ADC0809 对输入模拟量要求:信号单极性,电压围是 05V,假设信号太小,必须进展放大;输入的模拟量在转换过程中应该保持不变,如假设模拟量变化太快,则需在输入前增加采样保持电路。地址输入和控制线:4 条ALE 为地址锁存允许输入线,高电平有效。当 ALE 线为高电平时,地址锁存与译码器将 A,B,C 三条地址线的地址信号进展锁存,经译码后被选中的通道的模拟量进转换器进展转换。A,B 和 C 为地址输入线,用于选通 IN0IN7 上的一路模拟量输入。通道选择表如下表所示。CBA选择的通道000IN0001IN1010IN2011IN3100IN4101IN5110IN6111IN7数字量输出及控制线:11 条ST 为转换启动信号。当 ST 上跳沿时,所有部存放器清零;下跳沿时,开场进行 A/D 转换;在转换期间,ST 应保持低电平。EOC 为转换完毕信号。当 EOC 为高电平时,说明转换完毕;否则,说明正在进展 A/D 转换。OE 为输出允许信号,用于控制三条输出锁存器向单片机输出转换得到的数据。OE1,输出转换得到的数据;OE0,输出数据线呈高阻状态。D7D0 为数字量输出线。CLK 为时钟输入信号线。因 ADC0809 的部没有时钟电路,所需时钟信号必须由外界提供,通常使用频率为 500KHZ,VREF,VREF为参考电压输入。4 ADC0809 应用说明1 ADC0809 部带有输出锁存器,可以与 AT89S51 单片机直接相连。2 初始化时,使 ST 和 OE 信号全为低电平。3 送要转换的哪一通道的地址到 A,B,C 端口上。4 在 ST 端给出一个至少有 100ns 宽的正脉冲信号。5 是否转换完毕,我们根据 EOC 信号来判断。6 当 EOC 变为高电平时,这时给 OE 为高电平,转换的数据就输出给单片机了。5 实验任务如以下图所示,从 ADC0809 的通道 IN3 输入 05V 之间的模拟量,通过 ADC0809转换成数字量在数码管上以十进制形成显示出来。ADC0809 的 VREF 接5V电压。6 电路原理图5 系统板上硬件连线1 把“单片机系统板区域中的 P1 端口的 P1.0P1.7 用 8 芯排线连接到“动态数码显示区域中的 A B C D E F G H 端口上,作为数码管的笔段驱动。2 把“单片机系统板区域中的 P2 端口的 P2.0P2.7 用 8 芯排线连接到“动态数码显示区域中的 S1 S2 S3 S4 S5 S6 S7 S8 端口上,作为数码管的位段选择。3 把“单片机系统板区域中的 P0 端口的 P0.0P0.7 用 8 芯排线连接到“模数转换模块区域中的 D0D1D2D3D4D5D6D7 端口上,A/D 转换完毕的数据输入到单片机的 P0 端口4 把“模数转换模块区域中的 VREF 端子用导线连接到“电源模块区域中的 VCC 端子上;5 把“模数转换模块区域中的 A2A1A0 端子用导线连接到“单片机系统区域中的 P3.4 P3.5 P3.6 端子上;6 把“模数转换模块区域中的 ST 端子用导线连接到“单片机系统区域中的 P3.0 端子上;7 把“模数转换模块区域中的 OE 端子用导线连接到“单片机系统区域中的 P3.1 端子上;8把“模数转换模块区域中的 EOC 端子用导线连接到“单片机系统区域中的 P3.2 端子上;9 把“模数转换模块区域中的 CLK 端子用导线连接到“分频模块区域中的 /4 端子上;10 把“分频模块区域中的 CK IN 端子用导线连接到“单片机系统区域中的 ALE 端子上;11 把“模数转换模块区域中的 IN3 端子用导线连接到“三路可调压模块区域中的 VR1 端子上;6 程序设计容1 进展 A/D 转换时,采用查询 EOC 的标志信号来检测 A/D 转换是否完毕,假设完毕则把数据通过 P0 端口读入,经过数据处理之后在数码管上显示。2 进展 A/D 转换之前,要启动转换的方法:ABC110 选择第三通道ST0,ST1,ST0 产生启动转换的正脉冲信号. z-. z-7 汇编源程序CH EQU 30HDPT EQU 31HDPBUF EQU 33HGDATA EQU 32HST BIT P3.0OE BIT P3.1EOC BIT P3.2ORG 00HLJMP STARTORG 0BHLJMP T0*ORG 30HSTART: MOV CH,*0BCHMOV DPT,*00HMOV R1,*DPTMOV R7,*5MOV A,*10MOV R0,*DPBUFLOP: MOV R0,AINC R0DJNZ R7,LOPMOV R0,*00HINC R0MOV R0,*00HINC R0MOV R0,*00HMOV TMOD,*01HMOV TH0,*(65536-4000)/256MOV TL0,*(65536-4000) MOD 256SETB TR0SETB ET0SETB EAWT: CLR STSETB STCLR STWAIT: JNB EOC,WAITSETB OEMOV GDATA,P0CLR OEMOV A,GDATAMOV B,*100DIV ABMOV 33H,AMOV A,BMOV B,*10DIV ABMOV 34H,AMOV 35H,BSJMP WTT0*: NOPMOV TH0,*(65536-4000)/256MOV TL0,*(65536-4000) MOD 256MOV DPTR,*DPCDMOV A,DPTADD A,*DPBUFMOV R0,AMOV A,R0MOVC A,A+DPTRMOV P1,AMOV DPTR,*DPBTMOV A,DPTMOVC A,A+DPTRMOV P2,AINC DPTMOV A,DPTCJNE A,*8,NE*TMOV DPT,*00HNE*T: RETIDPCD: DB 3FH,06H,5BH,4FH,66HDB 6DH,7DH,07H,7FH,6FH,00HDPBT: DB 0FEH,0FDH,0FBH,0F7HDB 0EFH,0DFH,0BFH,07FHEND8 C 语言源程序*INClude unsigned char code dispbitcode=0*fe,0*fd,0*fb,0*f7,0*ef,0*df,0*bf,0*7f;unsigned char code dispcode=0*3f,0*06,0*5b,0*4f,0*66,0*6d,0*7d,0*07,0*7f,0*6f,0*00;unsigned char dispbuf8=10,10,10,10,10,0,0,0;unsigned char dispcount;sbit ST=P30;sbit OE=P31;sbit EOC=P32;unsigned char channel=0*bc;/IN3unsigned char getdata;void main(void)TMOD=0*01;TH0=(65536-4000)/256;TL0=(65536-4000)%256;TR0=1;ET0=1;EA=1;P3=channel;while(1)ST=0;ST=1;ST=0;while(EOC=0);OE=1;getdata=P0;OE=0;dispbuf2=getdata/100;getdata=getdata%10;dispbuf1=getdata/10;dispbuf0=getdata%10;void t0(void) interrupt 1 using 0TH0=(65536-4000)/256;TL0=(65536-4000)%256;P1=dispcodedispbufdispcount;P2=dispbi
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 管理文书 > 施工组织


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

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


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