文档详情

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

发布:2017-04-16约3.48万字共36页下载文档
文本预览下载声明
51单片机汇编语言及C语言经典实例实验及课程设计 51单片机汇编语言及C语言经典实例 一、闪烁灯 如图1 所示为一简单单片机系统原理图:在 P1.0 端口上接一个发光二极管 L1,使 L1 在不停地一亮一灭,一亮一灭的时间间隔为 0.2 秒。 延时程序的设计方法,作为单片机的指令的执行的时间是很短,数量大微秒级,因此,我们要求的闪烁时间间隔为 0.2 秒,相对于微秒来说,相差太大,所以我们在执行某一指令时,插入延时程序,来达到我们的要求,但这样的延时程 序是如何设计呢?下面具体介绍其原理:如图 4.1.1 所示的石英晶体为 12MHz,因此,1 个机器周期为 1 微秒,机器周期 微秒如图 1 所示,当 P1.0 端口输出高电平,即 P1.0=1 时,根据发光二极管的单向导电性可知,这时发光二极管 L1 熄灭;当 P1.0 端口输出低电平,即 P1.0=0 时,发光二极管 L1 亮;我们可以使用 SETB P1.0 指令使 P1.0端口输出高电平,使用 CLR P1.0 指令使 P1.0 端口输出低电平。 C 语言源程序 #include AT89X51.H sbit L1=P1^0; 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 0 START: CLR P1.0 LCALL DELAY 图2 程序设计流程图 SETB P1.0 LCALL DELAY LJMP 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 二、多路开关状态指示 如图 3 所示,AT89S51 单片机的 P1.0-P1.3 接四个发光二极管 L1-L4, P1.4-P1.7 接了四个开关 K1-K4,编程将开关的状态反映到发光二极管上。 (开关闭合,对应的灯亮,开关断开,对应的灯灭)。 对于开关状态检测,相对单片机来说,是输入关系,我们可轮流检测每个开关状 态,根据每个开关的状态让相应的发光二极管指示,可以采用 JB P1.X,REL 或 JNB P1.X,REL 指令来完成;也可以一次性检测四路开关状态,然后让其指 示,可以采用 MOV A,P1 指令一次把 P1 端口的状态全部??入,然后取高 4 位的状态来指示。 方法1(汇编源程序) ORG 00H START: MOV A,P1 ANL A,#0F0H RR A RR A RR A RR A ORL A,#0F0H MOV P1,A SJMP START END 方法1(C语言程序) 图4 程序流程图 #INClude AT89X51.H unsigned char temp; void main(void) { while(1) { temp=P14; temp=temp | 0xf0; P1=temp; } } 方法2(汇编源程序) ORG 00H START: JB P1.4,NEXT1 CLR P1.0 SJMP NEX1 图3 单片机原理图 NEXT1: SETB P1.0 NEX1: JB P1.5,NEXT2 CLR P1.1 SJMP NEX2 NEXT2: 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 方法2(C 语言源程序) #INClude AT89X51.H 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; } els
显示全部
相似文档