51单片机交通灯(十字路口演示)

您所在的位置:网站首页 十字路口红绿灯顺序启动控制电路图 51单片机交通灯(十字路口演示)

51单片机交通灯(十字路口演示)

2024-07-17 09:23| 来源: 网络整理| 查看: 265

51单片机交通灯(十字路口演示),包括紧急情况

系统仿真图: 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 本项目中采用单片机 AT89C52为中心器件来设计交通信号灯控制器, 系统实用性强、操作简单、扩展性强。本设计系统就是由单片机最小系统、交通灯状态显示系统、 LED数码显示系统、复位电路和按键操作电路等几大部分组成。系统除具有基本的交通信号灯功能外,还具有倒计时和紧急情况处理功能,较好的模拟实现了十字路口可能出现的状况。软件上采用 KEIL C 编程,主要编写了主程序, LED数码管显示程序,中断程序,延时程序等。经过整机调试,实现了对十字路口交通灯的模拟。 组合完成效果图: 在这里插入图片描述 系统硬件框图: 在这里插入图片描述 在这里插入图片描述 主程序框图: 在这里插入图片描述 程序代码:

#include #define uchar unsigned char #define uint unsigned int #define ON 0 #define OFF 1 sbit NS_G=P2^5; // 南北绿灯 sbit NS_Y=P2^4; // 南北黄灯 sbit NS_R=P2^3; // 南北红灯 sbit EW_G=P2^2; // 东西绿灯 sbit EW_Y=P2^1; // 东西黄灯 sbit EW_R=P2^0; // 东西红灯 sbit LED_D1=P3^7; // 南北方向数码管位控制 sbit LED_C1=P3^6; // 南北方向数码管位控制 sbit LED_B1=P3^1; // 东西方向数码管为控制 sbit LED_A1=P3^0; // 东西方向数码管位控制 sbit key1=P3^2; //开关位定义 sbit key2=P3^3; /********* 倒计时赋初值 *************/ uchar EWF=30,NSF=25,X=30,Y=25,Z=30,SHU=30; uchar count; void keyscan1() //南北紧急制动按键函数 { if(!key1) { while(!key1); //松手检测 } } void keyscan2() //东西紧急制动按键函数 { if(!key2) { while(!key2); //松手检测 } } void init(void) { TMOD=0x01; TH0=(65536-40000)/256; TL0=(65536-40000)%256; EA=1; ET0=1; TR0=1; } void timer1(void) interrupt 1 { TMOD=0x01; TH0=(65536-40000)/256; TL0=(65536-40000)%256; EA=1; ET0=1; TR0=1; count++; if(count>29) { EWF--; NSF--; X--; Y--; Z--; SHU--; count=0; } } /****************** 延时 **********************/ void delay(uchar z) { uchar x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } /******************led 控制 *******************/ unsigned char table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 共阴极数码管赋值 void display1(uchar num1,uchar num2) //控制东西方向 led 显示 { P0=table[num1]; LED_A1=ON; delay(1); LED_A1=OFF; P0=table[num2]; LED_B1=ON; delay(1); LED_B1=OFF; if(!key1)//南北紧急制动 { while(1) { P0=0x00; EW_G=EW_Y=OFF; NS_G=NS_Y=OFF; EW_R=NS_R=ON; keyscan1(); EW_R=NS_R=OFF; EW_Y=NS_Y=OFF; NS_G=ON; EW_R=ON; break; } } } void display2(uchar num3,uchar num4) // 控制南北方向 led 显示 { P0=table[num3]; LED_C1=ON; delay(1); LED_C1=OFF; P0=table[num4]; LED_D1=ON; delay(1); LED_D1=OFF; if(!key2)//东西紧急制动 { while(1) { P0=0x00; EW_G=EW_Y=OFF; NS_G=NS_Y=OFF; EW_R=NS_R=ON; keyscan2(); EW_R=NS_R=OFF; EW_Y=NS_Y=OFF; EW_G=ON; NS_R=ON; break; } } } void main() { int i; /************ 初始状态东西南北禁止通行 ************/ NS_R=ON; //南北方向红灯打开 EW_R=ON; //东西方向红灯打开 for(i=0;i


【本文地址】


今日新闻


推荐新闻


    CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3