📄 traffic.c
字号:
#include <reg51.h>
#define uchar unsigned char
sbit led1=P2^0; //定义各管脚
sbit led2=P2^1;
sbit CO1=P2^2;
sbit CO2=P2^3;
sbit CO3=P2^4;
sbit CO4=P2^5;
sbit K1=P3^1; //
sbit K2=P3^2;
sbit K3=P3^3;
sbit K4=P3^4;
sbit K5=P3^5;
sbit beep=P3^6;
uchar second,state;
uchar state=1; //初始化
uchar urgent=1;
uchar standard;
uchar t1=10;
uchar t2=20;
uchar t3=15;
uchar t4=25;
unsigned char code table[]={0x3F, 0x06, 0x5B, 0x4F, 0x66,
0x6D, 0x7D, 0x07, 0x7F, 0x6F};//0-9 共阴
bit flag =0 ;
uchar stateflag =0;
/*****************************************************************************
** 函数名称:delay()
** 功能描述:延时子程序,大约延时 n MS
** 输 入: n
** 输 出:
** 全局变量:
** 调用模块:
**
**----------------------------------------------------------------------------
******************************************************************************/
delay(int n)
{uchar k;int j;
for(j=n;j>0;j--)
for(k=125;k>0;k--);
}
/*****************************************************************************
** 函数名称:speaker()
** 功能描述:峰鸣器程序
** 输 入:
** 输 出:
** 全局变量:
** 调用模块:
**
**----------------------------------------------------------------------------
******************************************************************************/
speaker()
{
beep=0;delay(100);beep=1;
}
/*****************************************************************************
** 函数名称:speaker1()
** 功能描述:峰鸣器程序,峰鸣警告时间较长
** 输 入:
** 输 出:
** 全局变量:
** 调用模块:
**
**----------------------------------------------------------------------------
******************************************************************************/
speaker1()
{
beep=0;delay(2000);beep=1;delay(100);
}
/*****************************************************************************
** 函数名称:timer0()
** 功能描述:中断子程序
** 输 入:
** 输 出:
** 全局变量:
** 调用模块:
**
**----------------------------------------------------------------------------
******************************************************************************/
void timer0() interrupt 1 using 0
{uchar tcount;
if(urgent!=2)
{
TH0=(65536-50000)/256; //中断设置初始化
TL0=(65536-50000)%256;
tcount++;
if(tcount==20)
{tcount=0;second++;
if(standard-second<=5)
speaker();
if(second==standard)
{second=0;state++;speaker(); //4种交通灯状态的转变
if(state==5)
{state=1;
}
if(state==1)
{standard=t1;
}
if(state==2)
{
standard=t2;
}
if(state==3)
{
standard=t3;
}
if(state==4)
{
standard=t4;
}
}
}
}
}
/*****************************************************************************
** 函数名称:key()
** 功能描述:键盘事件显测程序
** 输 出:
** 全局变量:
** 调用模块:
**
**----------------------------------------------------------------------------
******************************************************************************/
void key()
{
if(K1==0) //按下键1
{
delay(1000); //软件去抖
if(K1==0){
delay(1000);
if(K1==0){
delay(1000);
if(K1==0){
if(K1==0)
urgent++;speaker();
if(urgent==2)
{EA=1;ET0=1;TMOD=0x21;TR0=0;second=standard-1;state=6;}
if(urgent==3)
{urgent=1;}
if(urgent==1)
{EA=1;ET0=1;TMOD=0x21;TR0=1;second=0;state=1;}
}}}}
if(K2==0 && urgent!=2) //按下键2且不处于紧急状态
{delay(30);
if(K2==0)
while(K2==0);
state++;speaker();
second=0;
if(state==5)
{state=1;
}
if(state==1)
{standard=t1;
}
if(state==2)
{
standard=t2;
}
if(state==3)
{
standard=t3;
}
if(state==4)
{
standard=t4;
}
}
while((K5 ==0 ||flag == 1)&& urgent!=2 )
{
EA = 0 ;
flag = 1 ;
if(K5 ==0)
{
delay(30);
if(K5 == 0)
{
stateflag++;
if(stateflag==5)
stateflag=1;
while(K5 ==0);
}
}
if(stateflag ==1)
{
if(K4 == 0)
{
delay(30);
if(K4 == 0)
{
if(t1<99)
t1++ ;
speaker();
while(K4==0);
}
}
if(K3 == 0)
{
delay(30);
if(K3 == 0)
{
if(t1>1)
t1-- ;
speaker();
while(K3==0);
}
}
P1=table[t1%10]; //数码管动态显示
led1=0;
delay(5);
led1=1;
P1=table[t1/10];
led2=0;
delay(5);
led2=1;
}
if(stateflag ==2)
{
if(K4 == 0)
{
delay(30);
if(K4 == 0)
{
if(t2<99)
t2++ ;
speaker();
while(K4==0);
}
}
if(K3 == 0)
{
delay(30);
if(K3 == 0)
{
if(t2>1)
t2-- ;
speaker();
while(K3==0);
}
}
P1=table[t2%10]; //数码管动态显示
led1=0;
delay(5);
led1=1;
P1=table[t2/10];
led2=0;
delay(5);
led2=1;
}
if(stateflag ==3)
{
if(K4 == 0)
{
delay(30);
if(K4 == 0)
{
if(t3<99)
t3++ ;
speaker();
while(K4==0);
}
}
if(K3 == 0)
{
delay(30);
if(K3 == 0)
{
if(t3>1)
t3-- ;
speaker();
while(K3==0);
}
}
P1=table[t3%10]; //数码管动态显示
led1=0;
delay(5);
led1=1;
P1=table[t3/10];
led2=0;
delay(5);
led2=1;
}
if(stateflag ==4)
{
if(K4 == 0)
{
delay(30);
if(K4 == 0)
{
if(t4<99)
t4++ ;
speaker();
while(K4==0);
}
}
if(K3 == 0)
{
delay(30);
if(K3 == 0)
{
if(t4>1)
t4-- ;
speaker();
while(K3==0);
}
}
P1=table[t4%10]; //数码管动态显示
led1=0;
delay(5);
led1=1;
P1=table[t4/10];
led2=0;
delay(5);
led2=1;
}
if(K2==0)
{
delay(10);
if(K2==0)
{
flag=0;
EA=1;
stateflag =0;
break;
}
}
}
}
/*****************************************************************************
** 函数名称:led()
** 功能描述:数码管倒计时显示程序
** 输 入: n
** 输 出:
** 全局变量:
** 调用模块:
**
**----------------------------------------------------------------------------
******************************************************************************/
void display(char state)
{if(state!=6) //首先判断是否紧急状态,整风进行正常的4种状态的自动转变
{if(state==1) //S1状态的交通指示灯的亮灭情况
{P0=0x1e;
CO1=0;
CO2=1;
CO3=0;
CO4=1;
}
if(state==2) //S2状态的交通指示灯的亮灭情况
{P0=0x1d;
CO1=0;
CO2=1;
CO3=1;
CO4=0;
}
if(state==3) //S3状态的交通指示灯的亮灭情况
{P0=0x33;
CO1=0;
CO2=1;
CO3=0;
CO4=1;
}
if(state==4) //S4状态的交通指示灯的亮灭情况
{P0=0x2b;
CO1=1;
CO2=0;
CO3=0;
CO4=1;
}
P1=table[(standard-second)%10]; //数码管动态显示
led1=0;
delay(5);
led1=1;
P1=table[(standard-second)/10];
led2=0;
delay(5);
led2=1;
}
if(state==6) //紧急状态的交通灯的亮灭情况及数码管显示99
{P0=0x1b;
CO1=0;
CO2=1;
CO3=0;
CO4=1;
P1=table[9];
led1=0;
led2=0;
speaker1();
}
}
/*****************************************************************************
** 函数名称:main()
** 功能描述:主程序
** 输 入:
** 输 出:
** 全局变量:
** 调用模块:
**
**----------------------------------------------------------------------------
******************************************************************************/
void main()
{
standard=t1;
second=0; //设置初始时间
TH0=(65536-50000)/256; //中断设置初始化
TL0=(65536-50000)%256;
EA=1;ET0=1;TMOD=0x21;TR0=1; //开中断总开关,计数器0允许中断,设置中断模式,启动计数器0
while(1) //死循环,进入显示,主要是动态显示原理
{
key();
display(state); //调用交通状态,状态机原理
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -