交通信号灯Proteus仿真


//                       蝙蝠龙51单片机开发学习系统                       //

//                          7天学会51单片机开发                           //

//                合肥万里眼电子科技有限公司  www.hfmee.com               //



#include<AT89X52.h>       //调用51单片机的头文件
#define INT8U unsigned char
#define INT16U unsigned int
sbit RED_A=P1^0;
sbit YELLOW_A=P1^2;
sbit GREEN_A=P1^1;
sbit RED_B=P1^3;
sbit YELLOW_B=P1^5;
sbit GREEN_B=P1^4;
INT8U Flash_Count=0,Operation_Type=1;


void delay_ms(INT16U x)
{
INT8U t;
while(x--)
for(t=0;t<120;t++);
}


void INIT0(void) interrupt 0 
{


    //***此处用户自行添加外部INT0中断处理程序***
Operation_Type=0;
    //******************************************


}


void INIT1(void) interrupt 2 
{


    //***此处用户自行添加外部INT1中断处理程序***
Operation_Type=1;
    //******************************************


}


void Traffic_Light()
{
switch(Operation_Type)
{
case 1:
RED_A=1;YELLOW_A=1;GREEN_A=0;
RED_B=0;YELLOW_B=1;GREEN_B=1;
delay_ms(2000);
Operation_Type=2;

break;
case 2:
delay_ms(300);
YELLOW_A=~YELLOW_A;GREEN_A=1;
if(++Flash_Count!=10) return;
Flash_Count=0;
Operation_Type=3;

break;
case 3:
RED_A=0;YELLOW_A=1;GREEN_A=1;
RED_B=1;YELLOW_B=1;GREEN_B=0;
delay_ms(2000);
Operation_Type=4;

break;
case 4:
delay_ms(300);
YELLOW_B=~YELLOW_B;GREEN_B=1;
if(++Flash_Count!=10) return;
Flash_Count=0;
Operation_Type=1;

break;
}
}
//---------------------------------------
//名称: 主函数
//适用:蝙蝠龙51单片机开发学习系统
//公司:合肥万里眼电子科技有限公司
//网址:www.hfmee.com
//日期:20150201
//---------------------------------------
void main(void)            //主函数,单片机开机后就是从这个函数开始运行
{
//***外部中断INT0初始化***
    IT0=1;                 //下降沿触发方式
    EX0=1;                 //外部INT0中断允许
    //**********************
    //***外部中断INT1初始化***
    IT1=1;                 //下降沿触发方式
    EX1=1;                 //外部INT1中断允许
    //**********************
    //***开全局中断设置****
    //外部中断INT1设置了中断允许,此处要开全局中断
    EA=1;                  //开全局中断
    //*********************
    while(1)  Traffic_Light();
}



//                       蝙蝠龙51单片机开发学习系统                       //

//                          7天学会51单片机开发                           //

//                合肥万里眼电子科技有限公司  www.hfmee.com               //



#include<AT89X52.h>       //调用51单片机的头文件
#define INT8U unsigned char
#define INT16U unsigned int
sbit RED_A=P0^0;
sbit YELLOW_A=P0^1;
sbit GREEN_A=P0^2;
sbit RED_B=P0^3;
sbit YELLOW_B=P0^4;
sbit GREEN_B=P0^5;
INT8U Time_Count=0,Flash_Count=0,Operation_Type=1;
INT16U Tc=1;


void delay_ms(INT16U x)
{
INT8U t;
while(x--)
for(t=0;t<120;t++);
}


void INIT0(void) interrupt 0 
{


    //***此处用户自行添加外部INT0中断处理程序***
//Operation_Type=0;
    //******************************************
if(++Tc==100)
{
Tc=1;
}
}


void T0_INT() interrupt 1
{
TL0 = 0x00; //设置定时初值
TH0 = 0xDC; //设置定时初值
switch(Operation_Type)
{
case 1:
RED_A=1;YELLOW_A=1;GREEN_A=0;
RED_B=0;YELLOW_B=1;GREEN_B=1;
if(++Time_Count!=Tc*100) return;
Time_Count=0;
Operation_Type=2;

break;
case 2:
if(++Time_Count!=8) return;
Time_Count=0;
YELLOW_A=~YELLOW_A;GREEN_A=0;
if(++Flash_Count!=10) return;
Flash_Count=0;
Operation_Type=3;

break;
case 3:
RED_A=0;YELLOW_A=1;GREEN_A=1;
RED_B=1;YELLOW_B=1;GREEN_B=0;
if(++Time_Count!=Tc*100) return;
Time_Count=0;
Operation_Type=4;

break;
case 4:
if(++Time_Count!=8) return;
Time_Count=0;
YELLOW_B=~YELLOW_B;GREEN_B=1;
if(++Flash_Count!=10) return;
Flash_Count=0;
Operation_Type=1;

break;
}
}


void INIT1(void) interrupt 2 
{


    //***此处用户自行添加外部INT1中断处理程序***
Operation_Type=1;
    //******************************************
if(--Tc==0)
{
Tc=99;
}
}


void Traffic_Light()
{
switch(Operation_Type)
{
case 1:
RED_A=1;YELLOW_A=1;GREEN_A=0;
RED_B=0;YELLOW_B=1;GREEN_B=1;
delay_ms(2000);
Operation_Type=2;

break;
case 2:
delay_ms(300);
YELLOW_A=~YELLOW_A;GREEN_A=1;
if(++Flash_Count!=10) return;
Flash_Count=0;
Operation_Type=3;

break;
case 3:
RED_A=0;YELLOW_A=1;GREEN_A=1;
RED_B=1;YELLOW_B=1;GREEN_B=0;
delay_ms(2000);
Operation_Type=4;

break;
case 4:
delay_ms(300);
YELLOW_B=~YELLOW_B;GREEN_B=1;
if(++Flash_Count!=10) return;
Flash_Count=0;
Operation_Type=1;

break;
}
}


//---------------------------------------
//名称: 主函数
//适用:蝙蝠龙51单片机开发学习系统
//公司:合肥万里眼电子科技有限公司
//网址:www.hfmee.com
//日期:20150201
//---------------------------------------
void main(void)            //主函数,单片机开机后就是从这个函数开始运行
{


    //***定时器Timer0初始化***
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
TL0 = 0x00; //设置定时初值
TH0 = 0xDC; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
    ET0 = 1;                 //Timer0中断允许


//***外部中断INT0初始化***
    IT0=1;                 //下降沿触发方式
    EX0=1;                 //外部INT0中断允许
    //**********************
    //***外部中断INT1初始化***
    IT1=1;                 //下降沿触发方式
    EX1=1;                 //外部INT1中断允许
    //**********************
    //***开全局中断设置****
    //外部中断INT1设置了中断允许,此处要开全局中断
    EA=1;                  //开全局中断
    //*********************
    while(1);
}

硬件设计:采用Proteus进行电路原理图设计与仿真 1)单片机选用AT89C51,它与8051系列单片机全兼容,但其内部带有4KB的FLASH ROM,设计时无需外接程序存储器。 2)显示部分:南北向和东西向各采用2个LED数码管计时,对该方向的指示灯的点亮时间进行倒计时,最长计时范围为99秒。 3)键盘部分:设置键、增加键、减少键。 本系统的工作流程: 1)系统启动后,系统按程序给定的时间工作,即东西向通行60秒,南北向通行40秒,黄灯亮4秒,工作模式如表1所示。首先东西向通行,然后南北向通行,如此循环。 2)通行时间的设置:当需要更改主、次干道的通行时间时,可以用设置键、增加键、减少键”进行设置。 第一次按“设置键”时,东西向的绿灯亮,东西向的LED数码管显示当前东西向的通行时间,并且按每秒3次的频率闪烁(每秒钟亮3次暗3次),其余的信号指示灯和南北向的LED数码管熄灭,此时可以用“增加键”和“减少键”来改变南北向的通行时间,每按一次键,数码管的显示时间增加1秒或减少1秒,长按键(按下的时间超过1秒钟以上),则数码管显示的时间按每秒钟增加或减少10的速度快速变化。 第二次按“设置键”时,东西向的黄灯亮,东西向的数码管显示当前东西向黄灯的点亮时间,并且按每秒3次的频率闪烁,其余的信号指示灯和南北向的数码管熄灭,此时可以用“增加键”和“减少键”来改变东西向黄灯的点亮时间。 第三次按“设置键”时,南北向的绿灯亮,南北向的数码管显示当前南北向绿灯的通行时间,并且按每秒3次的频率闪烁,其余的信号指示灯和东西向的数码管熄灭,此时可以用“增加键”和“减少键”来改变南北向绿灯的通行时间。 第四次按“设置键”时,南北向的黄灯亮,南北向的数码管显示当前南北向黄灯的点亮时间,并且按每秒3次的频率闪烁,其余的信号指示灯和东西向的数码管熄灭,此时可以用“增加键”和“减少键”来改变南北向黄灯的点亮时间。 第五次按“设置键”时,系统退出设置状态,回到交通信号灯状态,并且东西向先通行,南北向后通行 软件设计:采用Keil C开发环境与语言 1)软件模块:根据上述工作流程和设计要求,软件设计可以分为以下几个功能模块: 主程序:初始化及键盘监控。 计时程序模块:为定时器的中断服务子程序。 显示程序模块:完成12个发光二极管和4个LED数码管的显示驱动。 键盘扫描程序模块:判断是否有键按下,并求取键号。 键处理程序模块:分别是“设置键”、“增加键”、“减少键”的处理子程序。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值