新闻中心

EEPW首页>嵌入式系统>设计应用> 单片机之流水灯 AT89C51

单片机之流水灯 AT89C51

作者: 时间:2016-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();
}
}
}



评论


技术专区

关闭