怎么控制51系列单片机流水灯先左移再右移?最好有分析

用汇编编写一个程序实现上图控制,亮灯时间为0.5秒。

#include<reg52.h>
#include <intrins.h> 头文件
#define uchar unsigned char 宏定义
uchar a,b;
uchar b=1;
uchar a=0xfe; 变量定义和初始化
void main() 主函数
{
EA=1;IT1=1;ET0=1;中断允许设置
TH0=-5000/256;
TL0=-5000%256; 赋值
TMOD=0x01;

TR0=1; 启动
while(1); 等待中断产生

}

void timer0(void) interrupt 1 using 1 中断函数
{
TH0=-5000/256;
TL0=-5000%256; 重新赋值
b=b+1; 计算时间

if(b==40) 0.5秒时间到
{
b=0; 清0
P1=a; P1口赋值 0XFE 二进制11111110 也就是第一盏亮其他灭
a=_crol_(a,1); 库函数实现循环
P1=a; 把循环后的值重新付给P1口
}
}
以上只是单方向的循环 还缺少延时函数 加在赋值后面
双向循环 可以用左移右移指令
赋值 P1口 A=A<<1 循环左移一位 A=A>>1 循环右移一位
温馨提示:内容为网友见解,仅供参考
第1个回答  2010-12-24
/*单片机,用定时中断实现每隔0.2秒让接在P1口的8个小灯从左往右循环点亮。*/
#include<reg52.h>
#include <intrins.h>
#define uchar unsigned char
uchar a,b;
uchar b=1;
uchar a=0xfe;
void main()
{
EA=1;IT1=1;ET0=1;
TH0=-5000/256;
TL0=-5000%256;
TMOD=0x01;

TR0=1;
while(1)

}

void timer0(void) interrupt 1 using 1
{
TH0=-5000/256;
TL0=-5000%256;
b=b+1;

if(b==40)
{
b=0;
P1=a;
a=_crol_(a,1);
P1=a;
}
}本回答被网友采纳

关于单片机流水灯左移右移的问题?
51单片机的左移右移,首先在开始要调用"intrins.h"的文件包,这个文件包含_cror_(右移),_crol_(左移);然后通过for语句来控制;for(m=20;m>0;m--)for(n=20;n>0;n--)for(k=250;k>0;k--);理解这三句,第一句是指:m=20;m>0然后m--是真就执行:for(n=20;n>0;n--)for(k=...

51单片机C程序实验LED灯:[2]左到右的流水灯
程序清单 说明:本例有两种程序写法 第一种是入门级别比较基础的写法 先是依旧延时子程序,然后主程序利用直接赋值,与“”循环 第二种是稍微高级一些的写法,调用了其他头文件 主要是利用了一个intrins.h文件下的右循环语句”P0=_cror_(P0,1); “另也有左循环_crol_(),括号里面是要循环移位的值。

请问金沙滩51单片机中,先是左移到头,然后再右移到头的花样流水灯程序该...
\/*单片机,用定时中断实现每隔0.2秒让接在P1口的8个小灯从左往右循环点亮。*\/ #include #include #define uchar unsigned char uchar a,b; uchar b=1; uchar a=0xfe; void main() { EA=1;IT1=1;ET0=1; TH0=-5000\/256; TL0=-5000%256; TMOD=0x01;...(火星人)2086 ...

如何实现51单片机的按键k1按下,LED流水灯向右移动,按键k2被按下,LED...
对控制LED口的寄存器进行位操作,按k1左移,按K2就是右移了。51单片机是对兼容英特尔8051指令系统的单片机的统称。51单片机广泛应用于家用电器、汽车、工业测控、通信设备中。因为51单片机的指令系统、内部结构相对简单,所以国内许多高校用其进行单片机入门教学。51单片机的特点:同样的一段程序,在各个单片机...

51单片机的c语言 左移右移怎么用?想用来控制流水灯,请帮忙写个完整的c...
\/\/ 延时0.2s j= j<<1; \/\/ 左移1位 } j=0x80; \/\/ 设置右移初始值j为0x80 for (i=0;i<8;i++){ P1= ~ j;delay02s( );j= j>>1; \/\/ 右移1位 } } }

很简的51单片机C语言流水灯程序
1、51单片机C语言实现循环8个流水灯左移三次,后右移三次。例程:include<reg51.h> \/\/51单片机头文件#include <intrins.h> \/\/包含有左右循环移位子函数的库#define uint unsigned int \/\/宏定义#define uchar unsigned char \/\/宏定义sbit beep=P2^3;void delay(uint z) \/\/延时函数,z...

一个用C语言做51单片机做流水灯控制向左移动一位,右边补0的一段程序...
\/\/右边补0,直接移位就可以temp<,=1; 如果流水灯只有一个亮,下面的程序就是对的,移位之后补1.include "reg51.h"void delay(unsigned char m);main(){ unsigned char temp;temp=0xfe; \/\/temp=1111 1110,使得P1口的某个引脚为低电平(亮)while(1){ P1=temp; \/\/P1口的数据来自...

单片机中流水灯如何控制
主要靠软件控制,简单的可以使用左移或右移指令,将低电平0 逐渐移入寄存器中,即控制LED指示灯逐渐一个一个地点亮或一个一个地熄灭。复杂点: 可以进行花式流水控制。例如: 可以由两边逐渐向内点亮 然后再由内逐渐向外一个一个熄灭。还可以由由内逐渐向两边内点亮 然后再由两边渐向内逐一个一...

用51单片机写了一个流水灯程序,有一点问题,请高手解惑
决定了流水灯左移7次,再右移7次,结束两个循环后,才能执行下面的while(!key),按键才有效,而在循环过程中,不执行while(!key),所以按键无效。下图画红框内的两个循环。要想按键随时有效,应该把两个移位函数_cror_,_crol_ 放在主程中,检测key也放在主程中,而不能这样放一个子程序中。

51单片机用定时器实现流水灯左右移动?
bit flag;void main(){ TMOD = 0x10;TH1 = 0x3c;TL1 = 0xb0;TR1=1;ET1=1;EA=1;P0 = a;while(1);} void tm()interrupt 3 { TH1 = 0x3c;TL1 = 0xb0;n++; n %= 10;if(n == 0) { if(flag) a = _cror_(a, 1);else a = _crol_(a, 1);k++; k %=...

相似回答