
一般每一个流水灯通过1位来控制,该位为0则点亮,为1则灭。软件中可能用到:
1、 *** 作符<<或>>,比如8位流水灯,初始全灭,然后顺序点亮
uchar x=0xFF,i
for(i=0;i<8;i++)
{
x<<=1; //左移1位,最低位补0
P1 = x; //输出,假设LED接在P1口的8个脚上
delay300ms();//延时300ms,时间可根据效果自定,这个函数需要自己编制,我就不写了
}
2、循环移位函数_crol_、_cror_等(这是8位的,还有16位和32位的,原型在C51的INTRINSH头文件里)
比如8位流水灯,第一态:前4个亮,后四个灭,第二态右移移位,变成8321灭,7654亮,如此循环
uchar x=0x0F,i
while(1)
{
_cror_(x,1); //x循环右移1位,原最低位移到最高位,0x0F->0x87->0xC3
P1 = x; //输出,假设LED接在P1口的8个脚上
delay300ms();//延时300ms,时间可根据效果自定,这个函数需要自己编制,我就不写了
}
以上提供两种思路和样例,具体应用灵活掌握,不难吧?
下次问和时间有关的单片机问题记得标明系统时钟频率。
假设晶振频率12MHz。一个机器周期是1uS。
D1:
MOV R4, #20;1
D2:
MOV R5, #248;1
DJNZ R5, $ ;2X248=496uS
DJNZ R4, D2 ;2X20+1X20+20X496+1=9981
如果这是个子程序,调用和返回各占2uS,总延时时间9985uS,约10毫秒。
#include<reg52h>
#define uchar unsigned char
#define uint unsigned int
sbit beep=P2^1;
sbit LED1=P0^0;
sbit LED2=P0^1;
uint a=0,b=0,c=0;
void delay(uint a);
void delay(uint a) //延时
{
uint i,j;
for(i=0;i<a;i++)
for(j=0;j<100;j++);
}
void main()
{
beep=0;
IT0=1; //外部中断0后沿触发
IT1=1; //外部中断1后沿触发
EX0=1; //开外部中断0
EX1=1; //开外部中断1
LED1=1;
LED2=1;
delay(800);
EA=1;
while(1)
{ if(a==1)
{
beep=~beep; //如果外部中断0触发以1802毫秒周期报警
delay(180);
LED1=~LED1;
}
if(b==1)
{
beep=~beep; //如果外部中断1触发以902毫秒周期报警
delay(90);
LED2=~LED2;
}
if((a==1 && b==1) || c==1) //如果两个中断同时触发或者人为置位
{
a=0;
b=0;
c=1;
beep=~beep; //以3002毫秒周期报警
LED2=~LED2;
delay(300);
LED1=~LED1;
EA=0;
} } }
void baojing1() interrupt 0
{
beep=~beep;
LED1=~LED1;
delay(100);
a=1;
}
void baojing2() interrupt 2
{
beep=~beep;
LED2=~LED2;
delay(100);
b=1;
}
以上就是关于我用AT89S51.C51单片机编写花样流水灯程序,需要的命令全部的内容,包括:我用AT89S51.C51单片机编写花样流水灯程序,需要的命令、我想问一下以下AT89S51单片机的延时程序的计算过程、求懂AT89S51单片机的大神 解释一下这段程序是什么意思等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)