《51单片机汇编语言及C语言经典实例》由会员分享,可在线阅读,更多相关《51单片机汇编语言及C语言经典实例(26页珍藏版)》请在金锄头文库上搜索。
1、.1.51单片机汇编语言及C语言经典实例实验及课程设计51单片机汇编语言及C语言经典实例1.一、闪烁灯如图1 所示为一简单单片机系统原理图:在 P1.0 端口上接一个发光二极管 L1,使 L1 在不停地一亮一灭,一亮一灭的时间间隔为 0.2 秒。延时程序的设计方法,作为单片机的指令的执行的时间是很短,数量大微秒级,因此,我们要求的闪烁时间间隔为 0.2 秒,相对于微秒来说,相差太大,所以我们在执行*一指令时,插入延时程序,来到达我们的要求,但这样的延时程序是如何设计呢.下面具体介绍其原理:如图 所示的石英晶体为 12MHz,因此,1 个机器周期为 1 微秒,机器周期 微秒如图 1 所示,当 P
2、1.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
3、)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,编程将开关的状态反映到
4、发光二极管上。开关闭合,对应的灯亮,开关断开,对应的灯灭。对于开关状态检测,相对单片机来说,是输入关系,我们可轮流检测每个开关状态,根据每个开关的状态让相应的发光二极管指示,可以采用 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 程序流程图*INC
5、lude 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
6、.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 的指令,根据
7、累加器的值再加上 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,
8、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*d
9、f,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=ta
10、blei;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
11、 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
12、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;P
13、2=tableSecond%10;图8 单片机原理图五、动态数码显示技术如图9所示,P0 端口接动态数码管的字形码笔段,P2 端口接动态数码管的数位选择端,P1.7 接一个开关,当开关接高电平时,显示“12345字样;当开关接低电平时,显示“HELLO字样。动态扫描方法:动态接口采用各数码管循环轮流显示的方法,当循环显示频率较高时,利用人眼的暂留特性,看不出闪烁显示现象,这种显示需要一个接口完成字形码的输出字形选择,另一接口完成各数码管的轮流点亮数位选择。在进展数码显示的时候,要对显示单元开辟 8 个显示缓冲区,每个显示缓冲区装有显示的不同数据即可。对于显示的字形码数据我们采用查表方法来完成。
14、汇编源程序图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,66