单片机之流水灯 AT89C51
#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();
}
}
}
单片机流水灯AT89C5 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)