基于51单片机交通灯程序

  • 格式:doc
  • 大小:26.13 KB
  • 文档页数:9

.
.
#include
#include
#define uchar unsigned char
#define uint unsigned int
bit Flag_SN_Yellow; //SN黄灯标志位
bit Flag_EW_Yellow;//EW黄灯标志位
uchar Time_EW;//东西方向倒计时单元
uchar Time_SN;//南北方向倒计时单元
uchar EW=15,SN=10,EWL=19,SNL=19; //程序初始化赋值,正常模式
uchar EW1=60,SN1=40,EWL1=19,SNL1=19;//用于存放修改值的变量
uchar Flag_Moden=1; //模式变量 1正常模式 2 禁止南北通东西 3 禁止东西
通南北 4 禁止东西南北 5 夜间模式
uchar Flag_key=0;
uchar code
table[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//1~~~~9段选

sbit HC164_Data =P0^0;
sbit HC164_Clk =P0^1;
sbit EW_green =P0^2;
sbit EW_yellow =P0^3;
sbit EW_red =P0^4;
.
.
sbit SN_red =P0^5;
sbit SN_green =P0^7;
sbit SN_yellow =P0^6;

sbit SN_RXD_red =P2^7;
sbit SN_RXD_green =P2^6;
sbit EW_RXD_red =P2^5;
sbit EW_RXD_green =P2^4;
sbit FMQ = P1^0;
sbit key1 = P3^3;
sbit key2 = P3^4;
sbit key3 = P3^5;
sbit WEI1 =P2^3; // 东西数码管第一位
sbit WEI2 =P2^2; // 东西数码管第二位
sbit WEI3 =P2^1; // 南北数码管第一位
sbit WEI4 =P2^0; // 南北数码管第二位
//uchar ew=40;sn=35;
//函数 delay(uchar z)
//功能能 延时
void Delay(uchar z)
{
uchar a,b;
.
.
for(a=z;a>0;a--)
for(b=200;b>0;b--);
}
void HC_164_Set_byte(uchar duan)
{
uchar i;
for(i=0;i<8;i++){
HC164_Data =duan & 0x80;
HC164_Clk =0;
HC164_Clk =1;
duan =duan <<1;
}
}
void display_smg(uchar wei,uchar num)
{
switch(wei){
case 1: WEI1=0;WEI2=1;WEI3=1;WEI4=1;HC_164_Set_byte(table[num]);break;
case 2: WEI1=1;WEI2=0;WEI3=1;WEI4=1;HC_164_Set_byte(table[num]);break;
case 3: WEI1=1;WEI2=1;WEI3=0;WEI4=1;HC_164_Set_byte(table[num]);break;
case 4: WEI1=1;WEI2=1;WEI3=1;WEI4=0;HC_164_Set_byte(table[num]);break;
default: break;
.
.
}
}

void Display(void)
{
uchar h,l;
h=Time_EW/10;
l=Time_EW;
display_smg(1,h);
Delay(8);
display_smg(2,l);
Delay(8);
h=Time_SN/10;
l=Time_SN;
display_smg(3,h);
Delay(8);
display_smg(4,l);
Delay(8);
}

void Key()
{
.
.
if(key1==0){
Delay(10);
if(key1==0){
while(!key1);

Flag_key++;
if(Flag_key==1) {
Flag_Moden=2;
}

if(Flag_key==2) {
Flag_Moden=3;
}

if(Flag_key==3) {
Flag_Moden=4;
}
if(Flag_key==4) {
Flag_Moden=5;
FMQ=1;
TR0=1;

}

if(Flag_key==5) {
.
.
Flag_EW_Yellow=0; //SN关黄灯信号位
Flag_SN_Yellow=0; //SN关黄灯信号位
FMQ=1;
Flag_Moden=1;
TR0=1;//启动定时
Flag_key=0;
}
}
}
if(key2==0){
while(!key2);
Flag_Moden=2;
}
if(key3==0){
while(!key3);
Flag_Moden=3;
}
}

void timer0(void)interrupt 1 using 1
{
static uchar count;
.
.
TH0=(65536-50000)/256;
TL0=(65536-50000)%6;
count++;

if(count==10)
{
if(Flag_SN_Yellow==1) //测试南北黄灯标志位
{SN_yellow=~SN_yellow;}
if(Flag_EW_Yellow==1) //测试东西黄灯标志位
{EW_yellow=~EW_yellow;}
}

if(count==20)
{
if(Flag_Moden==1){
Time_EW--;
Time_SN--;
}
if(Flag_SN_Yellow==1)//测试南北黄灯标志位
{SN_yellow=~SN_yellow;}
if(Flag_EW_Yellow==1)//测试东西黄灯标志位
{EW_yellow=~EW_yellow;}
count=0;
.
.
}

}
//模式1
void Zc_moshi()
{
//*******S0状态**********
EW_RXD_red=0; //EW人行道禁止
EW_RXD_green=1;//EW人行道禁止
SN_RXD_red=1; //EW人行道通行
SN_RXD_green=0;//SN人行道通行
Flag_EW_Yellow=0; //EW关黄灯显示信号
Flag_SN_Yellow=0; //SN关黄灯显示信号
Time_EW=EW; //EW=45;SN=40;
Time_SN=SN;

SN_green =0; //SN通行,EW红灯

SN_red =1;
EW_red =0;
EW_green =1;

while(Time_EW>5){

if(key1==0 || key2==0||key3==0)
.
.
{
//Flag_Moden=1;
TR0=0;//启动定时
break;
}
Display();
}
SN_yellow=0; //SN黄灯亮开始闪烁5秒
SN_green =1; //灭
//*******S1状态**********
Time_SN=5;
while(Time_EW<=5){
if(key1==0 || key2==0||key3==0)
{
//Flag_Moden=1;
TR0=0;//启动定时
break;
}
Flag_SN_Yellow=1; //SN开黄灯信号位
Display();
}
//*******S2状态**********