#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
/*****定义控制位**********************/
sbit EW_LED2=P2^3; //EW_LED2控制位
sbit EW_LED1=P2^2; //EW_LED1控制位
sbit SN_LED2=P2^1; //SN_LED2控制位
sbit SN_LED1=P2^0; //SN_LED1控制位
sbit SN_G=P1^2; //SN绿灯
sbit EW_G=P1^5; //EW绿灯
sbit SN_Yellow=P1^1; //SN黄灯
sbit EW_Yellow=P1^4; //EW黄灯
sbit EW_Red=P1^3; //EW红灯
sbit SN_Red=P1^0; //SN红灯
sbit s=P2^4; //功能选择键
sbit key1=P2^5; //按键加及东西强制通行
sbit key2=P2^6; //按键减及南北强制通行
sbit fm=P3^7; //蜂鸣器
sbit dula=P2^7;
sbit P3_2=P3^2;
bit FLAG_SN_Y=0,FLAG_SN_G=0,F_SN=0; //SN黄灯标志位,绿灯标志位,sn运行标志位
bit FLAG_EW_Y=0,FLAG_EW_G=0,F_EW=0; //EW黄灯标志位,绿灯标志位,ew运行标志位
bit F_DISP=0,flag=0,flag_key=0,flag_l=1;
bit f_g=1,f_y=0;
char Time_EW; //东西方向倒计时单元
char Time_SN; //南北方向倒计时单元
uchar EW=24,SN=20,EW1=30,SN1=34; //程序初始化赋值正常模式
uchar a=0,i,c=0;
uchar code table[]= {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; //1~~~~9段选码
uchar code LIGHT[]= {0x0c,//SN通行
0x0a,//SN黄灯
0x21,//EW通行
0x11,//EW黄灯
0x09//全红
}; //交通信号灯控制代码
/**************** 延时子程序*********************/
void delayms(uchar k)
{
uchar i,j;
for(i=100;i>0;i--)
for(j=k;j>0;j--);
}
void Delay(uchar a)
{
uchar i;
i=a;
while(i--)
{
;
}
}
/***************EW方向SN方向主干道数码管显示驱动 ****************/
void DISP_SN(char g)
{
char h,l;
h=g/10; //SN方向计时的十位数
l=g%10; //SN方向计时的个位数
dula=1;
P0=table[l]; //显示SN计时时间的低位
dula=0;
SN_LED2=0;
Delay(20);
SN_LED2=1;
P0=0;
dula=1;
P0=table[h]; //显示SN计时时间的高位
dula=0;
SN_LED1=0;
Delay(20);
SN_LED1=1;
P0=0;
}
void DISP_EW(char b)
{
char h,l;
h=b/10; //EW方向计时的十位数
l=b%10; //EW方向计时的个位数
dula=1;
P0=table[l]; //显示EW计时时间的低位
dula=0;
EW_LED2=0;
Delay(20);
P0=0;
EW_LED2=1;
dula=1;
P0=table[h]; //显示EW计时时间的高位
dula=0;
EW_LED1=0;
Delay(20);
EW_LED1=1;
P0=0;
}
void dispnon(void)
{
SN_LED2=1;
SN_LED1=1;
EW_LED2=1;
EW_LED1=1;
}
/***************按键检测*************/
void keyscan(void)
{
if(s==0)
{
delayms(5);
if(s==0)
{
if(flag_key==0)
{
a++;
flag=1;
TR0=0;
P1=LIGHT[4];
dispnon();
fm=1;
if(a==4)
{
a=0;
flag=0;
if(F_SN==1&&F_EW==0)
P1=LIGHT[0];
if(FLAG_SN_Y==1)
P1=LIGHT[1];
if(F_EW==1&&F_SN==0)
P1=LIGHT[2];
if(FLAG_EW_Y==1)
P1=LIGHT[3];
TR0=1;
}
}
else if(flag_key==1)
{
flag_key=0;
flag=0;
if(F_SN==1&&F_EW==0)
P1=LIGHT[0];
if(FLAG_SN_Y==1)
P1=LIGHT[1];
if(F_EW==1&&F_SN==0)
P1=LIGHT[2];
if(FLAG_EW_Y==1)
P1=LIGHT[3];
TR0=1;
fm=1;
}
}
while(!s);
}
if(a!=0)
{
if(key1==0)
{
delayms(5);
if(key1==0)
{
if(a==1)
{
SN++;
EW++;
if(SN==100)
SN=0;
if(EW==100)
EW=0;
DISP_SN(SN);
DISP_EW(EW1);
}
if(a==2)
{
EW1++;
SN1++;
if(EW1==100)
EW1=0;
if(SN==100)
SN1=0;
DISP_EW(EW1);
DISP_SN(SN);
}
while(!key1)
{
if(a==1)
{
DISP_SN(SN);
DISP_EW(EW1);
}
if(a==2)
{
DISP_EW(EW1);
DISP_SN(SN);
}
}
}
}
if(key2==0)
{
delayms(5);
if(key2==0)
{
if(a==1)
{
SN--;
EW--;
if(SN==-1)
SN=99;
if(EW==-1)
EW=99;
DISP_SN(SN);
DISP_EW(EW1);
}
if(a==2)
{
EW1--;
SN1--;
if(EW1==-1)
EW1=99;
if(SN1==-1)
SN1=99;
DISP_EW(EW1);
DISP_SN(SN);
}
while(!key2)
{
if(a==1)
{
DISP_SN(SN);
DISP_EW(EW1);
}
if(a==2)
{
DISP_EW(EW1);
DISP_SN(SN);
}
}
}
}
}
if(a!=0)
{
if(a==1)
DISP_EW(EW1);
if(a==2)
DISP_SN(SN);
if(a==3)
{
DISP_EW(EW1);
DISP_SN(SN);
}
}
if(a==0)
{
if(key1==0)
{
delayms(5);
if(key1==0)
{
TR0=0;
flag=1;
P0=0;
fm=1;
flag_key=1;
}
while(!key1);
dispnon();
P1=LIGHT[0];
}
if(key2==0)
{
delayms(5);
if(key2==0)
{
TR0=0;
flag=1;
P0=0;
fm=1;
c++;
flag_key=1;
}
while(!key2);
dispnon();
P1=LIGHT[2];
}
}
}
/***********************EW和SN信号灯状态***************/
void signal_light(void)
{
/****************SN信号灯状态*******************/
if(F_SN==1)
{
if(f_g==1) //SN通行标志位
{
if(flag_l==1)
{
P1=LIGHT[0];
Time_EW=EW;
Time_SN=SN;
flag_l=0;
}
if(Time_SN>=0)
{
if(Time_SN==3)
{
FLAG_SN_G=1;
}
if(F_DISP==0)
{
DISP_SN(Time_SN);
}
DISP_EW(Time_EW);
}
if(Time_SN==-1)
{
f_g=0;
f_y=1;
FLAG_SN_G=0;
Time_SN=3;
FLAG_SN_Y=1;
P1=LIGHT[1];
}
}
if(f_y==1) //SN黄灯标志位
{
if(Time_SN>=0)
{
if(F_DISP==0)
{
DISP_SN(Time_SN);
}
DISP_EW(Time_EW);
}
if(Time_SN==-1)
{
f_y=0;
f_g=1;
F_SN=0;
FLAG_SN_Y=0;
flag_l=1;
F_EW=1;
}
}
}
/***********************EW信号灯状态***********************/
if(F_EW==1)
{
if(f_g==1) //EW通行标志位
{
if(flag_l==1)
{
P1=LIGHT[2];
Time_EW=EW1;
Time_SN=SN1;
flag_l=0;
}
if(Time_EW>=0)
{
if(Time_EW==3)
{
FLAG_EW_G=1;
}
if(F_DISP==0)
{
DISP_EW(Time_EW);
}
DISP_SN(Time_SN);
}
if(Time_EW==-1)
{
f_g=0;
f_y=1;
FLAG_EW_G=0;
Time_EW=3;
FLAG_EW_Y=1;
P1=LIGHT[3];
}
}
if(f_y==1) //EW黄灯标志位
{
if(Time_EW>=0)
{
DISP_SN(Time_SN);
if(F_DISP==0)
{
DISP_EW(Time_EW);
}
}
if(Time_EW==-1)
{
f_y=0;
f_g=1;
F_EW=0;
FLAG_EW_Y=0;
F_SN=1;
flag_l=1;
}
}
}
}
/**************开机自检***********/
void check(void)
{
Time_EW=5;
Time_SN=5;
F_SN=1;
F_EW=0;
while(Time_SN>=0&&Time_EW>=0)
{
P1=LIGHT[4];
DISP_SN(Time_SN);
DISP_EW(Time_EW);
}
}
void init(void)
{
IT0=0;
TMOD=0x01;//定时器工作于方式1
TH0=(65536-50000)/256;//定时器赋初值
TL0=(65536-50000)%256;
EA=1;//CPU开中断总允许
ET0=1;//开定时中断
baidu_29965081
- 粉丝: 0
- 资源: 2
最新资源
- 顺丰API查询快递单基于顺丰丰桥SDK开发的用易语言源码 免开发调用 需要收寄人手机号码后四位+单号查询 简单对接接口,快速开发必备 .zip
- 随着前端技术越来越成熟,JS,TS已成为各大厂开发的必备使用语言,本站从易到难深入理解JS,TS,同时提供TS做题功能,让你边学边实践,快速掌握.zip
- 通过中缀、后缀实现一个四则运算器,并设计求解界面,由于我喜欢前端嘛,用前端语言实现起来容易以及界面写起来很顺手 .zip
- 该项目是一个使用TypeScript实现的简易版Web系统框架,旨在提供一套搭建Web应用程序的基础设施 它具备以下主要特点和功能1. 虚拟文件系统2. 语言系统3. 常用接口集合.zip
- 网页编辑器,拖拽读取文件,保存文件,支持大部分编程语言文件编辑,简单易用,无需安装,这正是我想要的.zip
- 电力系统分析:基于VBA的分布式电源最佳接入点判定方法与程序实现
- MATLAB实现线性代数方程组直接解法算法解析与实践案例
- 基于MATLAB的线性代数方程组雅克比迭代解法研究与应用
- 基于MATLAB实现的线性代数方程组高斯消去法解析与应用
- MATLAB实现拉格朗日插值多项式的数值计算方法
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈