27,373
社区成员
发帖
与我相关
我的任务
分享
#define uchar unsigned char
#define uint unsigned int
#include <reg52.h>
bit Flag_SN_Yellow; //SN黄灯标志位
bit Flag_EW_Yellow;//EW黄灯标志位
char Time_EW;//东西方向倒计时单元
char Time_SN;//南北方向倒计时单元
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 EW_Red = P0 ^ 3; //EW红灯
sbit SN_Red = P0 ^ 7; //SN红灯
sbit Stop_LED = P2 ^ 6; //紧急停止指示灯
sbit Stop_Btton = P3 ^ 6; //紧急停止按钮
sbit Add_Button = P3 ^ 3; //时间加
sbit Reduces_Button = P3 ^ 4; //时间减
sbit SN_Yellow = P0 ^ 6; //SN黄灯
sbit EW_Yellow = P0 ^ 2; //EW黄灯
sbit Time_Show_LED2 = P2 ^ 5;
sbit Time_Show_LED1 = P2 ^ 4;
uchar code table[10] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F}; //1~~~~9段选码
uchar code S[3] = {0x44, 0x28, 0x90}; //交通信号灯控制代码
bit Stop_flag = 0; //Stop键的按键
uchar EW = 30, SN = 30; //程序初始化赋值,正常模式,EW是东西停止时间,SN是南北绿灯时间
uchar EW1 = 30, SN1 = 30; //用于存放修改值的变量
//延时子程序
void Delay(uchar a)
{
uchar i;
i = a;
while (i--)
{
;
}
}
//数码管显示子函数
void Display(void)
{
//显示东西方向
char h, l;
h = Time_EW / 10;
l = Time_EW % 10;
P1 = table[l];
EW_LED2 = 1;
Delay(2);
EW_LED2 = 0;
P1 = table[h];
EW_LED1 = 1;
Delay(2);
EW_LED1 = 0;
//显示南北方向
h = Time_SN / 10;
l = Time_SN % 10;
P1 = table[l];
SN_LED2 = 1;
Delay(2);
SN_LED2 = 0;
P1 = table[h];
SN_LED1 = 1;
Delay(2);
SN_LED1 = 0;
//显示当前每次通行时间
h = EW1 / 10;
l = EW1 % 10;
P1 = table[h];
Time_Show_LED1 = 1;
Delay(2);
Time_Show_LED1 = 0;
P1 = table[l];
Time_Show_LED2 = 1;
Delay(2);
Time_Show_LED2 = 0;
}
//外部0中断服务程序
void EXINT0(void)interrupt 0 using 1
{
if (Add_Button == 0) //时间加
{
EW++;
SN++;
EW1++;
SN1++;
}
if (Reduces_Button == 0) //时间减
{
EW++;
SN++;
EW1--;
SN1--;
}
if (Stop_Btton == 0) //测试按键是否按下,按下为紧急停止状态
{
Stop_flag = ~Stop_flag;
if (Stop_flag)
{
//开紧急信Display();号灯
Stop_LED = 1;
//冻结系统
ET0 = 0; //关闭定时中断
Time_EW=EW;
Time_SN=SN;
}
else
{
ET0 = 1; //打开定时中断
//关紧急信号灯
Stop_LED = 0;
}
}
}
//定时器中断服务程序
void timer0(void)interrupt 1 using 1
{
static uchar count;
TH0 = (65536 - 50000) / 256;
TL0 = (65536 - 50000) % 256;
count++;
if (count == 10) //第10份时间判断
{
if (Flag_SN_Yellow == 1) //测试南北黄灯标志位
{
SN_Yellow = 1;
}
if (Flag_EW_Yellow == 1) //测试东西黄灯标志位
{
EW_Yellow = 1;
}
}
if (count == 20)
{
Time_EW--;
Time_SN--;
if (Flag_SN_Yellow == 1) //测试南北黄灯标志位
{
SN_Yellow = 1; //黄灯
}
if (Flag_EW_Yellow == 1) //测试东西黄灯标志位
{
EW_Yellow = 1; //黄灯
}
count = 0;
}
}
//主程序开始
void main(void)
{
Stop_LED = 0; //先关紧急停止灯
IT0 = 1; //INT0负跳变触发
TMOD = 0x01; //定时器工作于方式1
TH0 = (65536 - 50000) / 256; //定时器赋初值
TL0 = (65536 - 50000) % 256;
EA = 1; //CPU开中断总允许
ET0 = 1; //开定时中断
EX0 = 1; //开外部INTO中断
TR0 = 1; //启动定时
while (1)
{
//南北绿灯
Time_EW = EW;
Time_SN = SN;
while (Time_SN >= 0)
{
if (Stop_flag) //如果强制停止
{
P0 = S[0];
}
else
{
P0 = S[2]; //SN通行,EW红灯
}
Display();
}
//黄灯状态
P0 = 0x00;
while (Time_SN >= -3)
{
Flag_SN_Yellow = 1; //SN开黄灯信号位
Flag_EW_Yellow = 1; //EN开黄灯信号位
}
EW = EW1;
SN = SN1;
//东西绿灯
Time_EW = SN;
Time_SN = EW;
while (Time_EW >= 0)
{
if (Stop_flag) //如果强制停止
{
P0 = S[0];
}
else
{
P0 = S[1]; //SN通行,EW红灯
}
Display();
}
//黄灯状态
P0 = 0x00;
while (Time_EW >= -3)
{
Flag_SN_Yellow = 1; //SN开黄灯信号位
Flag_EW_Yellow = 1; //EN开黄灯信号位
}
EW = EW1;
SN = SN1;
}
}