#define uchar unsigned char
#define uint unsigned int
#include <reg52.h>
/*****定义控制位**********************/
sbit EW_LED2=P1^1; //EW_LED2控制位
sbit EW_LED1=P1^0; //EW_LED1控制位
sbit SN_LED2=P1^3; //SN_LED2控制位
sbit SN_LED1=P1^2; //SN_LED1控制位
sbit SN_Yellow=P0^0;//SN黄灯
sbit EW_Yellow=P0^3;//EW黄灯
sbit EW_Red=P0^5;//EW红灯
sbit SN_Red=P0^2;//SN红灯
sbit EW_WAIT_Button=P3^0;//EW通行
sbit SN_WAIT_Button=P3^1;//SN通行
sbit Nomor_Button=P3^3;//交通正常按键
sbit SN_Add_Time_Button=P3^4;//南北绿灯时间增加
sbit EW_Add_Time_Button=P3^5;//东西方向绿灯时间增加
sbit Normol_Time_Button=P3^6;//时间恢复正常
bit Flag_SN_Yellow; //SN黄灯标志位
bit Flag_EW_Yellow;//EW黄灯标志位
char Time_EW;//东西方向倒计时单元
char Time_SN;//南北方向倒计时单元
uchar EW=15,SN=10; //程序初始化赋值,正常模式
uchar SN_Add_Time=0,EW_Add_Time=0;
bit EW1=0,SN1=0;//是否调整
bit stop=0;//控制停表
//uchar code table[10]={0x00,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//0-9段选码
uchar code table[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
uchar code S[8]={0XDD,0XDF,0XEB,0XF3};//交通信号灯控制代码
/**********************延时子程序************************/
void Delay(uchar a)
{
uchar i;
i=a;
while(i--){;}
}
/*****************显示子函数**************************/
void Display(void)
{
//设置东西数码管数字
char h,l;
h=Time_EW/10;
l=Time_EW%10;
P2=table[l]; // 设置信号灯数字
EW_LED2=1;
Delay(2);
EW_LED2=0;
P2=table[h];
EW_LED1=1;
Delay(2);
EW_LED1=0;
//设置南北信号灯数字
h=Time_SN/10;
l=Time_SN%10;
P2=table[l];
SN_LED2=1;
Delay(2);
SN_LED2=0;
P2=table[h];
SN_LED1=1;
Delay(2);
SN_LED1=0;
}
/**********************键盘扫描程序************************/
/*
void KeyPush(void)//interrupt 0 using 1
{
if( P3 & 0x1F != 0x1F )
{
Delay(2);
if( P3 & 0x1F != 0x1F )
{
switch( P3 & 0x1F )
{
case 0x1B: //return EW_WAIT_Button;
if(SN1==0)
EW1=1;
break;
case 0x17:// return SN_WAIT_Button;
if(EW1==0)
SN1=1;
break;
case 0x0F:// return Nomor_Button;
SN1=0;
EW1=0;
break;
}
}
}
} */
/**********************外部0中断服务程序************************/
void EXINT0(void)interrupt 0 using 1
{
EX0=0; //关中断
if(SN_WAIT_Button==0) //SN通行
{
if(EW1==0)
{
SN1=1;
}
//P0=0xFF;
//P2=0xFF;
//P0=S[0];
//ET0=0;
}
if(EW_WAIT_Button==0) //EW通行
{
if(SN1==0)
{
EW1=1;
}
//P0=0xFF;
//P2=0xFF;
//P0=S[2];
//ET0=0;
}
if(Nomor_Button==0)//测试按键是否按下,按下为正常状态
{
SN1=0;
EW1=0;
//P0=0xFF;
//ET0=1;
}
if(SN_Add_Time_Button==0)
{
SN_Add_Time += 5;
if(SN_Add_Time>15)
SN_Add_Time=15;
}
if(EW_Add_Time_Button==0)
{
EW_Add_Time += 5;
if(EW_Add_Time>15)
EW_Add_Time=15;
}
if(Normol_Time_Button==0)
{
SN_Add_Time=0;
EW_Add_Time=0;
}
EX0=1;//开中断
}
/******************T0中断服务程序_使得黄灯闪烁,时间前进***************/
void timer0(void)interrupt 1 using 1
{
// KeyPush(); // 扫描按键
static uchar count;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
count++;
if(count==10)
{
if(Flag_SN_Yellow==1) //测试南北黄灯标志位
{SN_Yellow=~SN_Yellow;}
if(Flag_EW_Yellow==1) //测试东西黄灯标志位
{EW_Yellow=~EW_Yellow;}
}
if(count==20)
{
Time_EW--;
Time_SN--;
if(Flag_SN_Yellow==1)//测试南北黄灯标志位
{SN_Yellow=~SN_Yellow;}
if(Flag_EW_Yellow==1)//测试东西黄灯标志位
{EW_Yellow=~EW_Yellow;}
count=0;
}
}
/*********************主程序开始**********************/
void main(void)
{
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)
{
/*******S0状态-南北绿灯亮**********/
Time_EW=EW+SN_Add_Time;
Time_SN=SN+SN_Add_Time;
while(Time_SN>0)
{
P0=S[0]; //SN通行,EW红灯
Display();
}
/*******需要南北通行***************/
if(SN1==1)
{
//stop=1;//停表,时间不动
P0=0xFF;
P2=0x00;
P0=S[0];
}
while(SN1==1);
//stop=0;//继续计时
/*******S1状态-南北黄灯亮**********/
P0=0xFF;
Time_SN=5;
while(Time_SN>=0)
{
//P0=S[1];
Flag_SN_Yellow=1; //SN开黄灯信号位
EW_Red=0; //SN黄灯亮,EW红灯
Display();
}
Flag_SN_Yellow=0; //SN关黄灯显示信号
/*******需要南北通行或东西通行***************/
if(SN1==1)
{
P0=0xFF;
P2=0x00;
P0=S[0];
}
while(SN1==1); //等待
if(EW1==1)
{
P0=0xFF;
P2=0x00;
P0=S[2];
}
while(EW1==1);
/*******S2状态-东西绿灯亮**********/
Time_EW=SN+EW_Add_Time;
Time_SN=EW+EW_Add_Time;
while(Time_EW>0)
{
P0=S[2]; //EW通行,SN红灯
Display();
}
/*******需要东西通行***************/
if(EW1==1)
{
P0=0xFF;
P2=0x00;
P0=S[2];
}
while(EW1==1);
/*******S3状态-东西黄灯亮**********/
P0=0XFF;
Time_EW=5;
while(Time_EW>=0)
{
//P0=S[3];
Flag_EW_Yellow=1;//EW开黄灯信号位
SN_Red=0;//EW黄灯亮,SN红灯
Display();
}
Flag_EW_Yellow=0; //EW关黄灯显示信号
/*******需要南北通行或东西通行***************/
if(SN1==1)
{
P0=0xFF;
P2=0x00;
P0=S[0];
}
while(SN1==1);
if(EW1==1)
{
P0=0xFF;
P2=0x00;
P0=S[2];
}
while(EW1==1);
}
}
嵌入式课程设计-交通灯的实现
5星 · 超过95%的资源 需积分: 11 116 浏览量
2011-07-09
22:54:25
上传
评论 10
收藏 39KB RAR 举报
zzxian
- 粉丝: 110
- 资源: 3
最新资源
- DatabaseWatermarkingBasedonTextFormat
- -移动通信-网络课程设计与研究
- 基于Python的PCA人脸识别算法的原理及实现代码+文档详解.zip
- 甘肃移动全业务工程建设项目管理流程优化研究
- 549springboot + vue 民宿管理平台.zip (可运行源码+数据库文件+文档)
- ZArchiver.Pro_0.9.5.apk
- vmware环境配置.mp4
- 548springboot + vue 大学生社团活动平台.zip(可运行源码+数据库文件+文档)
- 微信小程序 辩论倒计时小程序源码 作业设计demo 计算机专业参考
- 深入探究文件IO,嵌入式Linux
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
- 1
- 2
前往页