您的位置 首页 制造

单片机之流水灯 AT89C51

流水灯是单片机入门必学的一个实验。这里面主要涉及的操作就是移位操作,还有就是对延时的控制。在没有接触定时器的时候,可以用for语句来…

流水灯单片机入门必学的一个试验。这里边首要触及的操作便是移位操作,还有便是对延时的操控。在没有触摸定时器的时分,能够用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();
}
}
}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/bandaoti/zhizao/274440.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部