交通灯设计.docx
《交通灯设计.docx》由会员分享,可在线阅读,更多相关《交通灯设计.docx(35页珍藏版)》请在冰豆网上搜索。
交通灯设计
控制交通灯的程序设计
#include
unsigned char code
dis_7[21]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,
0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,
0x86,0x8e,0xbf,0x89,0x8c,0x00,0xff};//
共阳数码管
段码
unsigned char data disbuf[6]={0x00,0x00,0x00,0x00,0x00,0x00};//
显示缓冲区
:
时分秒使用
unsigned char data count_timedx[]={2,10,5,10,25}; //
东西方向倒计时时间
unsigned char data count_timenb[]={2,25,10,5,10}; //
南北方向倒计时时间
unsigned char data Hour=14,Minite=06,Second=0,Halfsec=0;
//
定义时钟位
unsigned char xdata *ledaddr=0x2000; //
锁存器选通地址
unsigned char data
Ms=0,Lightcode=0,Light_step,Led_step,Light_num;
unsigned int
data
Fault_dx=0,Fault_nb=0,Fault_total=0,Countdx=0,Countnb=0;
sbit p10=P1^0; //
第
0
位数码管位控制端
sbit p11=P1^1; //
第
1
位数码管位控制端
sbit p12=P1^2; //
第
2
位数码管位控制端
sbit p13=P1^3; //
第
3
位数码管位控制端
sbit p14=P1^4; //
第
4
位数码管位控制端
sbit p15=P1^5; //
第
5
位数码管位控制端
sbit p16=P1^6; //
发光二极管选通
sbit p17=P1^7; //
按键选通
sbit p33=P3^3; //k1
键
用于切换四种功能
/*****************************************************************************/
/****************************1
毫秒延时函数
*******************************/
void delay1ms(int t)
{
unsigned int i,j;
for(i=0;i
for(j=0;j<120;j++)
;
}
/***************************************************************************/
/*************************
键盘扫描函数
****************************************/
unsigned char getkey(void)
{
unsigned char Y
iwei;
unsigned char test=0x00,tim;
*ledaddr=test;
if(p17==0 && tim==0)
//
判断是否有按键按下
{
p17=1;
tim=1;
test=0xfe;
delay1ms(5);
for(Y
iwei=0;Yiwei<8;Yiwei++)
//
处理按键
{
*ledaddr=test;
if(p17==0)break;
else test=(test<<1)+1;
}
return Yiwei;
}
else if(p17==0){}
else {tim=0;}
}
/*****************************************************************************/
/************************
六位
LED
数码管显示
***********************************/
void
displed(unsigned
int
hour_shi,unsigned
int
hour_ge,unsigned
int
min_shi,unsigned
int
min_ge,unsigned int sec_shi,unsigned int sec_ge)
{
*ledaddr=dis_7[hour_shi];
//
时的十位显示
p10=0;
delay1ms
(1);
p10=1;
*ledaddr=dis_7[hour_ge];
//
时的个位显示
p11=0;
delay1ms
(1);
p11=1;
*ledaddr=dis_7[min_shi];
//
分的十位显示
p12=0;
delay1ms
(1);
p12=1;
*ledaddr=dis_7[min_ge];
//
分的个位显示
p13=0;
delay1ms
(1);
p13=1;
*ledaddr=dis_7[sec_shi];
//
秒的十位显示
p14=0;
delay1ms
(1);
p14=1;
*ledaddr=dis_7[sec_ge];
//
秒的个位显示
p15=0;
delay1ms
(1);
p15=1;
}
/*****************************************************************************/
/******************************
发光二极管显示函数
*****************************/
void displight(unsigned int state)
{
if(state==0)
//
状态
0
:
各方向红灯全亮
{
Lightcode=0xbb;
}
else if(state==1)
//
状态
1
:
东西绿灯亮,南北红灯亮
{
Lightcode=0xbe;
}
else if(state==2)
//
状态
2
:
东西黄灯闪烁,南北红灯亮
{
Lightcode=0xbd;
}
else if(state==3)
//
状态
3
:
东西红灯亮,左行亮,南北红灯亮
{
Lightcode=0xb3;
}
else if(state==4)
//
状态
4
:
东西红灯亮,南北直行绿灯亮
{
Lightcode=0xeb;
}
else if(state==5) //
状态
5
:
东西红灯亮,南北黄灯闪烁
{
Lightcode=0xdb;
}
else if(state==6)
//
状态
6
:
东西红灯亮,南北红灯亮,左行亮
{
Lightcode=0x3b;
}
//
黄灯闪烁
if((Halfsec%2)==0)
{
if(state==2)
Lightcode=0xbf;
//
东西闪烁
if(state==5)
Lightcode=0xfb;
//
南北闪烁
}
*ledaddr=Lightcode; //
送交通灯显示状态
p16=0;
delay1ms
(1);
p16=1;
}
/****************************************************************************/
/****************************
违章车辆统计函数
********************************/
void weizhang(void)
//
红灯亮的时候是否有车通过,
KL1
键显示东西,
KL2
键显示南北
{
unsigned char key1;
key1=getkey();
//
获得键值
if((key1==0)&&(Light_step>=4)&&(Light_step<=6))
//KL1
键显示南北方向违章车辆,且
只在南北方向为红灯时加
1
{
Fault_dx++;
if(Fault_dx==99)
//
最大计数
99
辆
{
Fault_dx=0;
}
}
else if((key1==2)&&(Light_step>=1)&&(Light_step<=3))
//KL3
键显示东西方向违章车辆,
且只在东西方向为红灯时加
1
{
Fault_nb++;
if(Fault_nb==99)
//
最大计数
99
辆
{
Fault_nb=0;
}
}
}
/***************************************************************************/
/****************************
数字钟函数
***********************************/
void shuzizhong(void)
//
数字钟:
KL3
键调节秒,
KL4
键调节分,
KL5
键调节时
{
unsigned char data key2;
key2=getkey();
//
获得键值
if(key2==2)
//
调节秒,按一次
KL3
,则加一秒
{
Second++;
if(Second==60)
Second=0;
}
if(key2==3)
//
调节分,按一次
KL4
,则加一分
{
Minite++;
if(Minite==60)
Minite=0;
}
if(key2==4)
//
调节时,按一次
KL5
,则加一时
{ Hour++;
if(Hour==24)
Hour=0;
}
disbuf[0]=Second%10; //时钟显示,送缓冲区
disbuf[1]=Second/10;
disbuf[2]=Minite%10;
disbuf[3]=Minite/10;
disbuf[4]=Hour%10;
disbuf[5]=Hour/10;
}
/*****************************************************************************/
/**************
修改倒计时间函数
*********************************************/
void change_time(void)
//
注意:
只修改绿灯、黄灯或左行灯时间,红灯时间自动求出
{
unsigned int data key3=0;
key3=getkey();
if(key3==4)
//KL5
键选择要修改东西向倒计时
{
Light_num++;
if(Light_num>4) Light_num=0;
}
if(key3==5) //KL2
键用于修改东西方向倒计时,加
1
{
count_timedx[Light_num]++;
if(count_timedx[Light_num]>=99)
count_timedx[Light_num]=99;
}
if(key3==1)//KL6
键用于修改东西方向倒计时,减
1
{
count_timedx[Light_num]--;
if(count_timedx[Light_num]<1)
count_timedx[Light_num]=1; }