微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 单片机之流水灯 AT89C51

单片机之流水灯 AT89C51

时间:11-11 来源:互联网 点击:
流水灯单片机入门必学的一个实验。这里面主要涉及的操作就是移位操作,还有就是对延时的控制。在没有接触定时器的时候,可以用for语句来进行延时,当然并不能做到精准延时,可以通过在试验箱上的实验现象,来修改延时时间的长短。

#include

#define uchar unsigned char

#define uint unsigned int

void delay()

{

uchar m,s,n;

for(m=20;m>0;m--)

for(s=20;s>0;s--)

for(n=248;n>0;n--);

}

/*上面这个延时到底延时了多长时间,可以通过keil中的反汇编看到。晶振为12MHz。机器周期为1us。指令又分为单周期指令、双周期指令*/

/*************************************反汇编**************************/

C:0x0054 12005A LCALL delay(C:005A) //开始调用延时函数 跳转 这是双周期指令2us

35: }

C:0x0057 0A INC R2

C:0x0058 80D6 SJMP C:0030

5: void delay()

6: {

7: uchar m,s,n;

8: for(m=20;m>0;m--)

C:0x005A 7F14 MOV R7,#0x14 //单周期指令1us

9: for(s=20;s>0;s--)

C:0x005C 7E14 MOV R6,#0x14

10: for(n=248;n>0;n--);

11:

C:0x005E 7DF8 MOV R5,#0xF8

C:0x0060 DDFE DJNZ R5,C:0060 //248*2us 双周期指令

C:0x0062 DEFA DJNZ R6,C:005E //20*(248*2+3)us

C:0x0064 DFF6 DJNZ R7,C:005C //20*(20*(248*2+3)+3)us

12: }

C:0x0066 22 RET //双周期指令2us

即总共延时:循环内延时+循环外延时(5us)=496+9980+199660+5约等于0.2秒

/***********************************************************************/

void main(void)

{ uchar temp;

uchar a,b,i;

while(1)

{ temp=0xfe;

P1=temp;

for(i=0;i<8;i++)

{

a=temp

b=temp>>(8-i); //右移有符号数符号位会保留,正数高位补0,负数高位补1.无符号数高位补0

P1=a|b;

delay();

}

for(i=0;i<8;i++)

{

a=temp>>i;

b=temp<(8-i);

P1=a|b;

delay();

}

}

}


Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top