设计方案
设计一个以51单片机为核心的简易多彩广告灯闪烁控制系统。2位数码管显示闪烁控制方案,分别显示01、02、03、和10号方案,初始化为00,彩灯灭;2个控制按键,一个加一数字键,一个确定键,循环十个花型方案。方案01为左循环一秒闪烁;方案02为右循环一秒闪烁;方案03为 10000000 11000000 ... 11111111 递增间隔一秒闪烁;方案10为 01010101 、10101010间隔一秒闪烁;其余方案灯灭。
设计原理图
#include<reg52.h>
void left_loop(); //声明左移函数
void right_loop(); //声明右移函数
void ji_ou(); //声明奇偶函数
void delayms(unsigned int xms) ; //延时函数声明
void increase(); //递增亮灯函数声明
void other_programme(); //其他方案函数声明
void key_detect(void); //按键检测声明
void display(void); //数码管显示函数声明
sbit key1 = P0^0; //加一键
sbit key2 = P0^1; //确认键
unsigned int flag = 0; //方案计数变量
//数码管显示字符转换表
unsigned char code table[] = {
0xC0,0xF9,0xA4,0xB0,0x99,
0x92,0x82,0xF8,0x80,0x90
};
void main()
{
while(1)
{
key_detect(); //按键检测
if(flag==11)
{
flag = 0;
}
display();
}
}
//方案01,流水灯左移1s
void left_loop()
{
unsigned char cnt = 0; //定义计数变量cnt,用于移位控制
while(1)
{
P1 = ~(0x01 << cnt); //P0等于1左移cnt位,控制8个LED
delayms(1000); //软件延时
cnt++; //移位计数变量自加1
if (cnt >= 8) //移位计数超过7后,再重新从0开始
{
cnt = 0;
}
delayms(100);
P1 = 0xff;
if(key1==0)
{
P1 = 0xff; //加一计数键按下,所有灯灭
delayms(20);
if(key1==0)
{
P1 = 0xff;
flag++;
delayms(10);
}
while(!key1); //检测按键是否松开
delayms(20);
while(!key1);
break;
}
}
}
//方案02,流水灯右移1s
void right_loop()
{
unsigned char cnt = 0; //定义计数变量cnt,用于移位控制
while (1) //主循环,程序无限循环执行该循环体语句
{
P1 = ~(0x80 >> cnt); //P0等于0x80右移cnt位,控制8个LED
delayms(1000);
cnt++; //移位计数变量自加1
if (cnt >= 8) //移位计数超过7后,再重新从0开始
{
cnt = 0;
}
delayms(100);
P1 = 0xff;
if(key1==0)
{
P1 = 0xff;
delayms(20);
if(key1==0)
{
P1 = 0xff;
flag++;
delayms(10);
}
while(!key1); //检测按键是否松开
delayms(20);
while(!key1);
break;
}
}
}
//方案03,递增间隔一秒闪烁
void increase()
{
unsigned int i = 0;
unsigned char a[] = {0xff,0x7f,0x3f,0x1f,0x0f,0x07,0x03,0x01,0x00};
while(1)
{
if(i>8)
{
i = 0;
}
P1 = a[i];
delayms(1000);
P1 = 0xff;
delayms(1000);
i++;
if(key1==0)
{
delayms(10);
if(key1==0)
{
P1 = 0xff;
flag++;
delayms(10);
}
while(!key1); //检测按键是否松开
delayms(10);
while(!key1);
}
}
}
//方案10,奇偶间隔闪烁
void ji_ou()
{
while(1)
{
P1 = 0xaa;
delayms(1000);
P1 = ~0xaa;
delayms(1000);
if(key1==0)
{
delayms(10);
if(key1==0)
{
P1 = 0xff;
flag++;
delayms(10);
}
while(!key1); //检测按键是否松开
delayms(20);
while(!key1);
break;
}
}
}
//其他方案,广告灯全灭
void other_programme()
{
P1 = 0xff;
delayms(10);
if(key1==0)
{
delayms(10);
if(key1==10)
{
P1 = 0xff;
flag++;
delayms(10);
}
while(!key1)
delayms(20);
while(!key1);
}
}
//数码管显示函数
void display(void)
{
unsigned int shi,ge;
shi = flag/10; //取十位
ge = flag%10; //取个位
P2 = table[shi]; //送十位进数码管
delayms(1);
P3 = table[ge]; //送个位进数码管
delayms(1);
}
//按键检测函数
void key_detect()
{
if(key1==0)
{
delayms(10); //按键消抖
if(key1==0)
{
flag++;
}
while(!key1); //检测是否松开key1加一计数键
}
else if(key2==0)
{
delayms(10); //按键消抖
if(key2==0)
{
switch(flag)
{
case 1:left_loop(); break;
case 2:right_loop(); break;
case 3:increase(); break;
case 10:ji_ou(); break;
default:other_programme(); //其他方案全灭
}
}
while(!key2); //检测key2键盘是否松开
}
}
//延时x毫秒
void delayms(unsigned int xms) //延时xms
{
unsigned int i,j;
for(i=xms;i>0;i--)
{
for(j=110;j>0;j--);
}
}