基于51单片机的十字红绿黄交通灯Proteus仿真设计 按键+串口
Posted Sandra_C
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于51单片机的十字红绿黄交通灯Proteus仿真设计 按键+串口相关的知识,希望对你有一定的参考价值。
程序源码PCB参考设计 +QQ2142686503
功能说明:
1.南北绿灯时间11秒 黄灯 3秒 东西红灯时间 14秒;
东西绿灯时间9秒 黄灯3秒 南北红灯时间12秒;
红灯时间 = 另外方向的绿灯时间 + 黄灯时间。
2.设计中有三个按键 分别是正常运行 南北管控 东西管控;
上电正常倒计时,数码管显示当前灯的倒计时。
按下南北管控 无论什么状态下都会进入南北方向绿灯,东西方向红灯。数码管显示00,同时通过串口发射报文NS_ONLY给串口助手。
按下东西管控 无论什么状态下都会进入东西方向绿灯,南北方向红灯。数码管显示00,同时通过串口发射报文WE_ONLY给串口助手。
按下正常运行 无论什么状态下都会进入正常运行情况。数码管显示和灯显示恢复到进入管控模式前的运行情况。
3.串口控制
串口助手发送0执行正常运行状态;
串口助手发送1执行南北管控状态;
串口助手发送2执行东西管控状态。
void main()
{
EA=1; //开总中断
InintTimer0(); //初始化定时器0
init_uart();// 初始化串口
NS_gtime_count=11,WE_rtime_count=14,NS_rtime_count=12,WE_gtime_count =9;//设置时间
//南北绿灯时间 东西红灯时间 南北红灯时间 东西绿灯时间 黄灯时间默认=红灯时间-绿灯时间
while(1)
{
LEDScan(); //数码管即LED扫描
KeyDriver(); //键盘驱动扫描
if(flag1s)//1S执行一次
{
flag1s=0;
NS_time--; //红绿灯倒计时时间减
WE_time--;
}
if((index == 1)&&(NS_time<5)&&(StaSysterm==NormalRun)){//绿灯闪烁,红灯不变
if(FilteFlag){//绿灯闪烁 L0闪烁 L3常亮 其他灭 P2 :0000 1001(0x09) 或 0000 1000(0x08)
P2=0x09;
}else{
P2=0x08;
}
}else if((index == 3)&&((WE_time<5))&&(StaSysterm==NormalRun)){//绿灯闪烁 L5闪烁 L2常亮 其他灭 P2 :0010 0100(0x24) 或 0000 0100(0x04)
if(FilteFlag){
P2=0x24;
}else{
P2=0x04;
}
}
}
}
void InintTimer0()
{
TMOD |=0X01;
TH0=0X4C;
TL0=0X00;
ET0=1;
TR0=1;//打开定时器中断
}
void init_uart(void)
{
SCON = 0x50; // SCON: 方式 1, 8-bit, 允许接收数据
TMOD |= 0x20; // TMOD: 设置定时器1工作在方式2, 8-bit 自动重装
TH1 = 0xFD; // TH1: 初始值为0xFD 波特率:9600 晶振频率:11.0592MHz
TL1 = 0x0;
TR1 = 1; // TR1: 开启定时器1
ES = 1; //打开串口中断
}
void Timer0() interrupt 1
{
TH0=0XBB;
TL0=0X00;
KeyScan();
if(++count500ms<25){
}else{
count500ms = 0;
if(FilteFlag){//闪烁标志位
FilteFlag = 0;
}else{
FilteFlag =1;
}
}
if(++count1s<50) return;
count1s=0;
if(StaSysterm==NormalRun) flag1s=1; //非正常运行时,不红绿灯数值不减一
all_mode_flag1s =1;
}
// 串口中断处理函数 (串口接收到数据,发送数据完毕都可以引起串口中断)
void uart_interrupt(void) interrupt 4 //也叫串行中断服务程序
{
uchar recv_data;// 用来存放接收到的数据
uchar send_data[] = "I received.\\n";// 要发送的信息
uchar send_normal_data[] = "NORMAL\\n";//要发送的信息
uchar send_ns_data[] = "NS_ONLY\\n";//
uchar send_we_data[] = "WE_ONLY\\n";//
if(RI) //接收数据(1字节)完毕,RI会被硬件置1
{
RI = 0; // 将 接收中断标志位 清零(让串口可以继续接收数据)
recv_data = SBUF; //读取接收到的数据,并存放到data
switch(recv_data) //文本模式 9600
{
case '0':
StaSysterm=NormalRun;
uart_send_str(send_normal_data); //收到数据之后,发送字符串给对方
break; //接收到0,正常
case '1':
StaSysterm=NSRun;
uart_send_str(send_ns_data);
break; //接收到1,南北
case '2':
StaSysterm=WERun;
uart_send_str(send_we_data);
break; //接收到2,东西
default:break;
}
}
if(TI)// 发送数据(1字节)完毕
{
TI = 0;// 将 发送中断标志位 清零(让串口可以继续发送数据)
}
}
以上是关于基于51单片机的十字红绿黄交通灯Proteus仿真设计 按键+串口的主要内容,如果未能解决你的问题,请参考以下文章