单片机控制左右来回循环的流水灯
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
左右来回循环的流水灯
设计要求
8个发光二极管LED0~LED7经限流电阻分别接至P1口的P1.0~P1.7引脚上,阳极共同接高电平。编程实现制作左右来回循环的节日彩灯,显示规律如下图所示。
题37图节日彩灯的花样显示的规律
为了使显示效果更加绚丽多彩,P1端口8个引脚分别接有不同颜色的发光二极管。具体如题37表所示。
题37表P1口8个引脚的不同颜色的发光二极管
P1口引脚发光二极管的颜色
P1.0 红色LED
P1.1 蓝色LED
P1.2 绿色LED
P1.3 黄色LED
P1.4 红色LED
P1.5 蓝色LED
P1.6 绿色LED
P1.7 黄色LED
使用C51编流水灯程序以及设计相应的硬件电路十分简单,且有多种方法。本方案力求程序最简化最清晰原则,用NS图(盒图)表示算法如下:
程序中设置中间变量temp用来给P1口赋值,命令_crol_和_cror_用于使temp左移或右移,例如当temp=11111110B时,执行_crol_(temp,1)之后temp=11111101,应用此两条语句必须把头文件
全部代码如下:
#include
#include
unsigned char temp; //定义字符变量temp,temp左移或右移并给连接LED的P1口赋值
int a; //定义延迟函数delay()
void delay(void);
void main()
{
temp=0xfe; //给temp赋初值
P1=temp; //temp赋值给P1口,第一个LED(红色)点亮
while(1) //主程序,括号中的程序将一直循环
{
for(a=0;a<7;a++) //左移部分,LED从左到右依次点亮
{
temp=_crol_(temp,1); //_crol_语句控制变量temp左移
delay(); //每个灯点亮之后延迟一会在点下一个灯
P1=temp;
}
for(a=0;a<7;a++) //右移部分,LED从右到左依次点亮
{
temp=_cror_(temp,1); //第8个灯点亮后开始右移程序,LED从右向左点亮
delay();
P1=temp;
}
}
}
void delay() //延时子程序
{
int i,j; //定义局部变量i,j
for(i=200;i>0;i--) //i,j不断计数占用CPU时间,达到延时目的
for(j=1;j<150;j++);
}
电路连接如下:
void delay()()
{
unsigned int i;
for(i=0;i<1500;i++)
}
void fun(void)
{
unsigned char i;
for (i=0;i<8;i++)
{
P0=1<
delay()();
}
while(--i)
{
P0=1<
delay()();
}
}
void main()
{
while(1)
{
fun();
}
}
void L_M()//左
{
unsigned char a,b,i,temp; unsigned int s;
temp=0xfe;
P1=temp;
for(s=0;s<300000;s++);
for(i=0;i<8;i++)
{
a=temp<
b=temp>>(8-i);
P1=a|b;
for(s=0;s<300000;s++);
}
}
void R_M()//右
{
unsigned char a,b,i,temp;
unsigned int s;
temp=0x7f;
P1=temp;
for(s=0;s<300000;s++);
for(i=0;i<8;i++)
{
a=temp>>i;
b=temp<<(8-i);
P1=a|b;
for(s=0;s<300000;s++);
}
}
#include
#include
#define uchar unsigned char
uchar temp; //定义全局变量temp
delay() //延时子函数
{
uint i,j;
for(i=1;i<400;i++)
for(j=1;j<400;j++);
}
void main() //主函数
{
temp=0xfe;
P0=temp;
while(1)
{
temp=_crol_(temp,1); //_crol_ 字符循环左移_cror_ 字符循环右移delay();
P0=temp;
}
}