给大家分享一下前段时间做的基于51单片机的交通灯设计,用于大家学习交流,希望能给大家带来一点点帮助。
所需元器件如下:
STC89C52RC芯片 *1
10K电阻 *1
330Ω电阻 *22
10uF 电解电容 *1
22pF 瓷片电容 *2
12MHz晶振 *1
按键 *1
8550 *8
单位7段数码管 *8
黄色LED *4
红色LED *4
绿色LED *4
程序代码如下:
#include"reg51.h"
#define LEDSS1 0 //定义数码管对应存储数组下标号
#define LEDSS2 1 //定义数码管对应存储数组下标号
#define LEDSN1 2 //定义数码管对应存储数组下标号
#define LEDSN2 3 //定义数码管对应存储数组下标号
#define LEDSW1 4 //定义数码管对应存储数组下标号
#define LEDSW2 5 //定义数码管对应存储数组下标号
#define LEDSE1 6 //定义数码管对应存储数组下标号
#define LEDSE2 7 //定义数码管对应存储数组下标号
sbit NSG=P3^0; //定义南北方向绿灯
sbit NSY=P3^1; //定义南北方向黄灯
sbit NSR=P3^2; //定义南北方向红灯
sbit WEG=P3^3; //定义东西方向绿灯
sbit WEY=P3^4; //定义东西方向黄灯
sbit WER=P3^5; //定义东西方向红灯
unsigned char code LED[12]= //定义数码管显示数组
{
0XC0,0XF9,0XA4,0XB0,0X99,0X92,
0X82,0XF8,0X80,0X90,0XFF,0XF6
};
unsigned char code dispbit[8]= //定义数码管位选
{
0XFE,0XFD,0XFB,0XF7,0XEF,0XDF,0XBF,0X7F
};
unsigned char dat[9]={0,0,0,0,0,0,0,0}; //可调用数码管显示数组
void delay(unsigned int x)
{
unsigned char i;
while(x--)
{
for(i=0;i<100;i++);
}
}
void save_dat(unsigned char second)
{
dat[LEDSS1]=second/10; //北方向秒十位存储
dat[LEDSS2]=second%10; //北方向秒个位存储
dat[LEDSN1]=second/10; //南方向秒十位存储
dat[LEDSN2]=second%10; //南方向秒个位存储
dat[LEDSW1]=second/10; //西方向秒十位存储
dat[LEDSW2]=second%10; //西方向秒个位存储
dat[LEDSE1]=second/10; //东方向秒十位存储
dat[LEDSE2]=second%10; //东方向秒个位存储
}
void main(void)
{
unsigned char ledcount=0;
unsigned int circle_count=0;
unsigned char second=25;
unsigned char jtd_status=1;
unsigned char flash_count=3;
NSG=1;
NSY=1;
NSR=0;
WEG=1;
WEY=1;
WER=0;
save_dat(second);
while(1)
{
switch(jtd_status)
{
case 1:
if(circle_count%200==0)
{
NSR=1;
WER=0;
NSG=0;
WEY=1;
save_dat(second);
second--;
}
if(circle_count>3200)
{
circle_count=0;
jtd_status=2;
}
break;
case 2:
if(circle_count>200)
{
NSG=1;
circle_count=0;
save_dat(second);
second--;
flash_count--;
if(flash_count>0)
jtd_status=3;
else
jtd_status=4;
}
break;
case 3:
if(circle_count>200)
{
NSG=0;
circle_count=0;
save_dat(second);
second--;
jtd_status=2;
}
break;
case 4:
if(circle_count>200)
{
NSY=0;
circle_count=0;
save_dat(second);
second--;
if(second==0)
{
jtd_status=5;
second=25;
}
}
break;
case 5:
if(circle_count%200==0)
{
NSG=1;
NSY=1;
NSR=0;
WER=1;
WEY=1;
WEG=0;
save_dat(second);
second--;
}
if(circle_count>3200)
{
circle_count=0;
jtd_status=6;
flash_count=3;
}
break;
case 6:
if(circle_count>200)
{
WEG=1;
circle_count=0;
save_dat(second);
second--;
flash_count--;
if(flash_count>0)
jtd_status=7;
else
jtd_status=8;
}
break;
case 7:
if(circle_count>200)
{
WEG=0;
circle_count=0;
save_dat(second);
second--;
jtd_status=6;
}
break;
case 8:
if(circle_count>200)
{
circle_count=0;
WEY=0;
WEG=1;
save_dat(second);
second--;
if(second==0)
{
jtd_status=1;
second=25;
flash_count=3;
}
}
break;
default:break;
}
P2=0xff;
P0=LED[dat[ledcount]];
P2=dispbit[ledcount];
ledcount++;
if(ledcount>7)
ledcount=0;
delay(5);
circle_count++;
}
}