```c
#include <reg52.h>
#include <intrins.h>
typedef unsigned int u16; //对数据类型进行声明定义
typedef unsigned char u8;
//--定义使用的IO口--//
#define GPIO_DIG P0
#define GPIO_TRAFFIC P1
sbit LSA=P2^0;
sbit LSB=P2^1;
sbit LSC=P2^2;
sbit DG = P2^3; //东绿灯
sbit DY = P2^4; //东黄灯
sbit DR = P2^5; //东红灯
sbit NG= P2^6; //南绿灯
sbit NY = P1^0; //南黄灯
sbit NR = P1^1; //南红灯
sbit XG = P1^2; //西绿灯
sbit XY = P1^3; //西黄灯
sbit XR= P1^4; //西红灯
sbit BG = P1^5; //北绿灯
sbit BY= P1^6; //北黄灯
sbit BR = P1^7; //北红灯
sbit FW=P2^7; //定义复位按键
sbit YJ=P3^0; //定义夜间模式按键
sbit JJ=P3^1; //定义紧急模式按键
sbit STTime=P3^2; //定义设定时间按键
sbit ZTime=P3^3; //定义时间加按键
sbit JTime=P3^4; //定义时间键按键
sbit HongWai=P3^5; //红外线
sbit buzzer=P3^7; //峰鸣器
u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的值
u8 DisplayData[8];
char kkk=0,fk=0;
char key,key1;
char Ddjs0=30,Ndjs0=30,Xdjs0=60,Bdjs0=90,
Ddjs01=90,Ndjs01=30,Xdjs01=30,Bdjs01=60,
Ddjs02=60,Ndjs02=90,Xdjs02=30,Bdjs02=30,
Ddjs03=30,Ndjs03=60,Xdjs03=90,Bdjs03=30; //以上为临时变量
int js=0,js0,js11=0,js12=0,js21=0,js22=0,js31=0,js32=0;
char Ddjs=30,Ndjs=30,Xdjs=60,Bdjs=90, //东绿初始倒计时时间
Ddjs1=90,Ndjs1=30,Xdjs1=30,Bdjs1=60, //南绿倒计时时间
Ddjs2=60,Ndjs2=90,Xdjs2=30,Bdjs2=30, //西绿倒计时时间
Ddjs3=30,Ndjs3=60,Xdjs3=90,Bdjs3=30; //北绿倒计时时间
/************以下为函数声明*************/
void DigDisplay(); //数码管动态扫描函数,循环扫描8个数码管显示
void djsxs11();
void djsxs12();
void djsxs13();
void djsxs14();
void djsxs1();
void djsxs2();
void djsxs3();
void djsxs4();
void jtdfw();//复位
void Ledmei(); //将所有的灯熄灭
void jj();//紧急模式
void set_djs1();
void set_djs2();
void set_djs3();
void set_djs4();
void yj(); // 夜间模式
void jtdd();
void jtddy();
void jtdn();
void jtdny();
void jtdx();
void jtdxy();
void jtdb();
void jtdby();
void xuanzheng();
void diaoyong();
void baoji(); //闯红灯报警
/*******************************************************************************
* 函 数 名 : delay
* 函数功能 : 延时函数,i=1时,大约延时10us
*******************************************************************************/
void delay(u16 i)
{
while(i--);
}
void baoji() //闯红灯报警
{
if(HongWai==0)
{
buzzer=~buzzer;
delay(10);
}
else buzzer=1;
}
void diaoyong() //调用函数
{
Ddjs=Ddjs0;
Ndjs=Ndjs0;
Xdjs=Xdjs0;
Bdjs=Bdjs0;
Ddjs1=Ddjs01;
Ndjs1=Ndjs01;
Xdjs1=Xdjs01;
Bdjs1=Bdjs01;
Ddjs2=Ddjs02;
Ndjs2=Ndjs02;
Xdjs2=Xdjs02;
Bdjs2=Bdjs02;
Ddjs3=Ddjs03;
Ndjs3=Ndjs03;
Xdjs3=Xdjs03;
Bdjs3=Bdjs03;
}
void xuanzheng() //返回跳转前一状态
{
if(key==0) jtdd(); //当key==0时,回到jtdd()函数
if(key==1) jtddy(); //当key==1时,回到jtddy()函数
if(key==2) jtdn(); //当key==2时,回到jtdn()函数
if(key==3) jtdny(); //当key==3时,回到jtdny()函数
if(key==4) jtdx(); //当key==4时,回到jtdx()函数
if(key==5) jtdxy(); //当key==5时,回到jtdxy()函数
if(key==6) jtdb(); //当key==6时,回到jtdb()函数
if(key==7) jtdby(); //当key==7时,回到jtdby()函数 这样的作用是,紧急模式从哪里进入,回到哪里
}
/*****************************************************/
/* 函数名:delayms */
/* 功能:产生毫秒级延时 */
/*****************************************************/
void delayms(int x)
{
char i;
while(x--)
{
for(i=150;i>0;i--);
}
}
/*******************************************************************************
* 函 数 名 : Timer0Init
* 函数功能 : 定时器0初始化
*******************************************************************************/
void Timer0Init()
{
js=0;
TMOD=0x01; //定义定时器0工作模式
TH0=0x4c; //赋初值高位
TL0=0x00; //赋初值低位
TR0=1; //启动定时器
ET0=1; //开中断
EA=1; //开全局中断
}
/*****************************************************/
/* 函数名:Timer0() interrupt 1 using 1 */
/* 功能:定时器0中断服务函数 */
/*****************************************************/
void Timer0() interrupt 1 using 1
{
TF0=0;
TH0=0x4c;
TL0=0x00; //重新赋高地位初值
js++;
js11++;
js21++;
js31++;
if(js>=0)
{
js0++;
if(js0==22)
{
js0=0;
Ddjs--;
Ndjs--;
Xdjs--;
Bdjs--;
}
}
else if(js==660)
{
js=0;
}
if(js11>=660)
{
js12++;
if(js12==22)
{
js12=0;
Ddjs1--;
Ndjs1--;
Xdjs1--;
Bdjs1--;
}
}
else if(js11==1320)
{
js11=0;
}
if(js21>=1320)
{
js22++;
if(js22==22)
{
js22=0;
Ddjs2--;
Ndjs2--;
Xdjs2--;
Bdjs2--;
}
}
else if(js21==1980)
{
js21=0;
}
if(js31>=1980)
{
js32++;
if(js32==22)
{
js32=0;
Ddjs3--;
Ndjs3--;
Xdjs3--;
Bdjs3--;
}
}
else if(js31==2640)
{
js=0;
js11=0;
js21=0;
js31=0;
}
}
/*******************************************************************************
* 函 数 名 : DigDisplay
* 函数功能 : 数码管动态扫描函数,循环扫描8个数码管显示
*******************************************************************************/
void DigDisplay()
{
u8 i;
for(i=0;i<8;i++)
{
switch(i) //位选,选择点亮的数码管,
{
case(0):
LSA=0;LSB=0;LSC=0; break;//显示第0位
case(1):
LSA=1;LSB=0;LSC=0; break;//显示第1位
case(2):
LSA=0;LSB=1;LSC=0; break;//显示第2位
case(3):
LSA=1;LSB=1;LSC=0; break;//显示第3位
case(4):
LSA=0;LSB=0;LSC=1; break;//显示第4位
case(5):
LSA=1;LSB=0;LSC=1; break;//显示第5位
case(6):
LSA=0;LSB=1;LSC=1; break;//显示第6位
case(7):
LSA=1;LSB=1;LSC=1; break;//显示第7位
}
GPIO_DIG=DisplayData[i];//发送段码
delayms(100);//间隔一段时间扫描
GPIO_DIG=0x00;//消隐
}
}
/*****************************************************/
/* 函数名:djsxs11() */
/* 功能:8个数码管动态显示 */
/*****************************************************/
void djsxs11()
{ char b1,b2,b3,b4,b5,b6,b7,b8;
b1=Ddjs/10; //将倒计时时间的高位赋予b1
b2=Ddjs%10; //将倒计时时间的低位赋予b2
b3=Ndjs/10; //将倒计时时间的高位赋予b3
b4=Ndjs%10; //将倒计时时间的低位赋予b4
b5=Xdjs/10; //将倒计时时间的高位赋予b5
b6=Xdjs%10; //将倒计时时间的低位赋予b6
b7=Bdjs/10; //将倒计时时间的高位赋予b7
b8=Bdjs%10; //将倒计时时间的低位赋予b8
DisplayData[0]=smgduan[b1];
DisplayData[1]=smgduan[b2];
DisplayData[2]=smgduan[b3];
DisplayData[3]=smgduan[b4];
DisplayData[4]=smgduan[b5];
DisplayData[5]=smgduan[b
基于单片机的交通灯控制系统设计程序
最新推荐文章于 2024-04-30 21:10:06 发布