-
2019-07-21 17:59:54
花了一个星期制作的交通灯仿真程序+原理图,通过数码管显示路口的时间,通过led显示红绿灯。@[TOC]
#include<reg51.H> // 对单片机的口进行了定义#define uint unsigned int
#define uchar unsigned char
uchar code a[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};//段码组合,共阳极
uchar code b[4]={0x01,0x02,0x04,0x08}; //位码组合
uchar code c[4]={0xcc,0xd4,0x78,0xb8};/P1 绿红、黄红、红绿、红黄/
//12MHz
//*************************************************************************************
uchar NB=25,DX=30,NBG=25,DXG=15,H=5; /数码管显示值设置/
uchar i,k=0,cnt=0,j=0;
sbit K0=P3^4; /支干道通行/
sbit K1=P3^5; /主干道通行/
sbit K4=P3^6; /返回/
sbit K3=P3^2; /设置时间/
sbit K2=P3^3; /紧急刹车/
void delay(uchar t); /定义延时程序/
void key(); /定义键盘程序/
void display(); /定义显示程序/
void settime(); /定义时间设置显示程序/
//程序初始********************
void init(void)
{
TMOD=0x01; /使用定时器0模式一/
TH0=0x3c; /(65536-5000)/256/
TL0=0xb0; /(65536-5000)%256/
IT0=1; //开中断
ET0=1;
TR0=1;
EA=1;
EX0=1;
EX1=1;
P1=c[k]; //开启交通灯
}
//中断0处理程序**************
void int0(void) interrupt 0 // 通行时间设置
{
EA=0;
P1=0xd8; /红灯全亮/
for(;?
{
settime(); if(K1==0) /*P3^6=0设置主干道通行时间*/ { delay(40); if(K1==0) { while(!K1) {settime();} DXG++; /*主干道通行时间加1*/ if(DXG==100) DXG=0; } } if(K0==0) /*P3^5=0设置支干道通行时间*/ { delay(40); if(K0==0) { while(!K0) {settime();} NBG++; /*支干道通行时间加1*/ if(NBG==100) NBG=0; } } if(K4==0) /*P3^7=0返回*/ { delay(40); if(K4==0) { while(!K4) { } k=0;P1=c[k]; NB=NBG,DX=NBG+H; display(); EA=1; break; } } }
}
//***************中断1处理程序
void int1(void) interrupt 2 //紧急情况
{
/*东西南北红灯亮*/
EA=0;
TR0=!TR0; /停止计数/
for(;? /主支干道显示全为0/
{
P1=0xd8,
P0=a[0];
P2=b[0]; delay(20); P2=b[1]; delay(20); P2=b[2]; delay(20); P2=b[3]; delay(20); if(K4==0) /*返回*/
{
delay(20);
EA=1;
P1=c[k]; /返回紧急前状态开始计数/
TR0=!TR0; /重启计数/
break;
}
}
}
void time1(void) interrupt 1 /交通灯控制程序/
{
TH0=0x3c; /定时50ms/
TL0=0xb0;
cnt++;
if(cnt>=20) /每2050ms=1s自减一*/
{
NB–;
DX–;
cnt=0;
if(NB0||DX0)
{
k++;
if(k>3) /k取0,1,2,3/
k=0;
switch(k)
{
case 0:NB=NBG,DX=NBG+H;j=0;P1=c[k];break; /*主干道通行显示绿红*/ case 1:NB=H;j=1;P1=c[k];break; /*主干道黄灯闪烁*/ case 2:NB=DXG+H,DX=DXG;j=0;P1=c[k];break; /*支干道通行显示红绿*/ case 3:DX=H;j=2;P1=c[k];break; /*支干道黄灯闪烁*/
}
}
}
}
void delay(uchar t) //延时程序延时0.1*nms
{
uchar i;
do
{
for(i=0;i<20;i++) ;;;
} while(t–);
}
void settime()
{
P2=b[0],P0=a[(NBG+H)%10]; /*显示主干道通行时间 */ delay(20); P2=b[1],P0=a[(NBG+H)/10]; delay(20); P2=b[2],P0=a[(DXG+H)%10]; /*显示支干道通行时间*/ delay(20); P2=b[3],P0=a[(DXG+H)/10]; delay(20);
}
void key() //键盘程序用KO K1模拟一道有车一道无车
{
if(K1==0) /*主干道有车支干道无车*/ { delay(40); if(K1==0) { while(!K1) { display(); } k=0,P1=c[k];cnt=0; NB=NBG, DX=NBG+H; display(); } } if(K0==0) /*支干道有车主干道无车*/ { delay(40); if(K0==0) { while(!K0) { display(); } k=2,P1=c[k];cnt=0; NB=DXG+H,DX=DXG; display(); }
}
}
void display() //显示程序
{
P2=b[0],P0=a[NB%10]; /由k的不同值进入确定显示数值/
delay(20);
P2=b[1],P0=a[NB/10];
delay(20);
P2=b[2],P0=a[DX%10];
delay(20);
P2=b[3],P0=a[DX/10];
delay(20);
}
void main(void)
{ //主程序
init();
for(;?
{
display();
key();
//黄灯闪烁程序
while(j==1) /主干道黄灯闪烁/
{ P1=0xdc; /*给黄灯一高电平黄灯灭*/ for(i=83;i>0;i--){display();} /*执行for循环延时*/ P1=c[k]; /*再给黄灯一低电平黄灯亮*/ for(i=83;i>0;i--){display();}
}
while(j==2)
{ /*支干道黄灯闪烁*/ P1=0xf8; for(i=83;i>0;i--){display();} P1=c[k]; for(i=83;i>0;i--){display();}
}
}
}
更多相关内容 -
51单片机交通灯设计代码及仿真
2021-02-19 12:53:37适用于初学嵌入式单片机,设计交通灯的代码及仿真 -
51单片机实现交通灯.hex
2020-06-10 15:58:41交通灯 -
51单片机 交通灯
2018-04-11 20:04:56学校实训项目,51单片控制交通灯,有需要的可以下载下来参考。 -
51单片机交通灯 源代码+proteus仿真图
2014-10-07 22:18:40模拟十字路口交通灯,设有紧急按钮,当有紧急情况能改变红绿灯状态。(如救护车需优先通过时) -
基于AT89C51单片机交通灯(带仿真图)
2018-08-19 12:01:03基于AT89C51单片机交通灯,带数码管倒计时功能;带Proteus仿真图。代码内有详细注释,适合新手学习。 -
51单片机交通灯实训
2020-10-19 14:48:40基于51单片机的实训代码,已经经过测试可以直接使用,如果有需要硬件电路以及对代码有疑问可留言或联系博主 -
基于51单片机的交通灯显示系统设计-完整程序.zip
2020-03-26 17:01:47本系统采用单片机AT80C51为中心器件来模拟十字路口交通灯的各种状态显示以及倒计时时间,系统实用性强、操作简单、扩展性强。 附件为程序C代码 -
51单片机交通灯.zip
2019-12-04 19:25:01这是51单片机做的仿真交通灯,总共16个灯,每一个方向4个灯,分别为红灯绿灯黄灯和转向灯。代码简易逻辑清晰,供初学者参考。有什么问题评论区评论,共同进步,共同学习。 -
51单片机交通信号灯程序源码(汇编).rar
2021-03-04 10:28:00JD51交通信号灯实验 -
设计分享|51单片机交通灯(汇编)
2021-09-22 00:12:05设计介绍 单片机介绍 51单片是一种低功耗、高性能CMOS8位微控制器,具有 8K 在系统可编程Flash 存储器。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得STC89C51为众多嵌入式控制应用系统提供高灵活、超...具体实现功能
具体实现功能:
(1)南北绿灯,东西红灯60S倒计时;
(2)60S将结束时,南北绿灯闪烁两次,转换为黄灯,南北黄灯与东西黄灯持续2S;
(3)南北红灯,东西绿灯30S倒计时。
设计介绍
单片机介绍
51单片是一种低功耗、高性能CMOS8位微控制器,具有 8K 在系统可编程Flash 存储器。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得STC89C51为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。具有以下标准功能:8k字节Flash,512字节RAM,32 位I/O 口线,看门狗定时器,内置4KB EEPROM,MAX810复位电路,三个16 位 定时器/计数器,一个6向量2级中断结构,全双工串行口。另外 STC89X51 可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU 停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。最高运作频率35Mhz,6T/12T可选。
设计思路
文献研究法:搜集整理相关单片机智能手环系统相关研究资料,认真阅读文献,为研究做准备;
调查研究法:通过调查、分析、具体试用等方法,发现单片机智能手环系统的现状、存在问题和解决办法;
比较分析法:比较不同单片机智能手环系统的具体原理,以及同一类传感器性能的区别,分析单片机智能手环系统的研究现状与发展前景;
软硬件设计法:通过软硬件设计实现具体硬件实物,最后测试各项功能是否满足要求。
仿真实现
本设计利用protues8.7软件实现仿真设计,具体如图。
Protues也是在单片机仿真设计中常用的设计软件之一,通过设计出硬件电路图,及写入驱动程序,就能在不实现硬件的情况进行电路调试。另外,protues还能实现PCB的设计,在仿真中也可以与KEIL实现联调,便于程序的调试,且支持多种平台,使用简单便捷。
汇编程序
本设计由汇编语言编写,主代码具体如下:
ORG 0000H
LJMP MAIN ;转向主程序
ORG 0003H
LJMP INTT0 ;转向紧急车辆中断服务程序
ORG 0013H
LJMP INTT1 ;转向有车车道中断服务程序
ORG 0200H
MAIN:MOV SP,#30H
SETB PX0 ;置外部中断0为高优先级中断
MOV TCON,#00H ;置外部中断0、1为电平触发
MOV TMOD,#10H ;置定时器1为方式1
MOV IE,#85H ;开CPU中断,开外中断0、1中断
LOOP: MOV P1,#0F3H ;A道绿灯放行,B道红灯禁止
MOV R1,#90 ;置0.5秒循环次数(0.5×90=45S)
DIP1: ACALL DELAY ;调用0.5秒延时子程序
DJNZ R1,DIP1 ;45秒不到继续循环
MOV R1,#06 ;置A绿灯闪烁循环次数
WAN1: CPL P1.2 ;A绿灯闪烁
ACALL DELAY
DJNZ R1,WAN1 ;闪烁次数未到继续循环
MOV P1,#0F5H ;A黄灯警告,B红灯禁止
MOV R1,#04H ;置0.5秒循环次数(0.5×4=2S)
YL1:ACALL DELAY
DJNZ R1,YL1 ;2秒未到继续循环
MOV P1,#0DEH ;A红灯,B绿灯
MOV R1,#32H ;置0.5秒循环次数(0.5×50=25S)
DIP2: ACALL DELAY
DJNZ R1,DIP2 ;25秒未到继续循环
MOV R1,#06H
WAN2: CPL P1.5 ;B绿灯闪烁
ACALL DELAY
DJNZ R1,WAN2
MOV P1,#0EEH ;A红灯,B黄灯
MOV R1,#04H
YL2: ACALL DELAY
DJNZ R1,YL2
AJMP LOOP ;循环执行主程序
INTT0:PUSH P1 ;P1口数据压栈保护
PUSH ACC ;ACC寄存器压栈保护
PUSH TH1 ;TH1压栈保护
PUSH TL1 ;TL1压栈保护
MOV P1,#0F6H ;A、B道均为红灯
MOV R2,#40 ;置0.5秒循环初值(20S)
DEY0: ACALL DELAY
DJNZ R2,DEY0 ;15秒未到继续循环
POP TL1 ;弹栈恢复现场
POP TH1
POP ACC
POP P1
RETI ;返回主程序
INTT1: CLR EA ;关中断
PUSH P1 ;压栈保护现场
PUSH ACC
PUSH TH1
PUSH TL1
SETB EA ;开中断
JB P3.0,BOP ;A道无车转向B道
MOV P1,#0F3H ;A道绿灯,B道红灯
SJMP DEL1 ;转向15秒延时
BOP: JB P3.1,EXIT ;B道无车退出中断
MOV P1,#0DEH ;A红灯,B绿灯
DEL1: MOV R5,#30 ;置0.5秒循环初值(15S)
NEXT: ACALL DELAY
DJNZ R5,NEXT ;15秒未到继续循环
EXIT: CLR EA
POP TL1 ;弹栈恢复现场
POP TH1
POP ACC
POP P1
SETB EA
RETI
DELAY: MOV R3,#0AH ;0.5秒子程序(50ms×10=0.5s)
MOV TH1,#3CH ;置50ms初值X=3CB0H
MOV TL1,#0B0H
SETB TR1 ;启动T1
LP1: JBC TF1,LP2 ;查询计数溢出
SJMP LP1
LP2:MOV TH1,#3CH ;置50ms初值X=3CB0H
MOV TL1,#0B0H
DJNZ R3,LP1
RET
END
更多资料欢迎关注“电子工程师成长日记”
-
单片机课程设计 交通灯(源代码,proteus仿真)
2021-03-28 17:42:53单片机课程设计,交通灯。数码管显示,LED灯指示,按键调节红绿灯时间。源代码,proteus仿真,全面的学习资料源文件都有。可以用来学习 -
51单片机实现交通信号灯
2022-04-07 21:44:3751单片机实现交通信灯包括红绿灯,转向灯,倒计时以及紧急模式,使用计时器处理倒计时,包含两位8段阳极数码管的使用。51单片机实现交通信号灯
实验环境
软件: Keil5+Proteus7
元件
(主要)
:AT89C51 * 1,
BUTTON * 1,
7SEG-MPX2-CA * 1,
LED-GREEN * 8,
LED-RED * 4,
LED-YELLOW * 4
仿真图
实验原理
7SEG-MPX2-CA数码管
7SEG-MPX2-CA数码管是一个两位数的阳极数码管,有10个针脚,通过标号a-dp八个针脚控制,LED灯的显示,通过标号为1,2的针脚控制显示的是个位或是十位的数码管。
要通过数码管显示具体数字,7SEG-MPX2-CA由于是一个阳极的数码管,所以需要接收在针脚上接收相应的低电平来显示,如如果要显示数字0,则标号a-dp的针脚需要接收1100 0000也就是0xF9的信号,同时如果不设置针脚1,2信号,便会个,十位都显示相同的数字1,于是需要通过对针脚1设置低电平,针脚2设置为高电平实现个位的发光,相反设置则十位的发光。
通过人眼的余晖效应,我们可以设置1,2信号变化,来让两个单片机显示自己想要的不同数字,由于人眼的分辨频率,远远跟不上数码管闪烁的频率,虽然是个十位数码管,不同时间进行闪烁,但在人眼看来仿佛是一起亮起来的。
计时器/计数器
定时/计数器T0和T1分别是由两个8位的专用寄存器组成,即定时/计数器T0由TH0和TL0组成,T1由TH1和TL1组成。此外,其内部还有2个8位的特殊功能寄存器TMOD和TCON,TMOD负责控制和确定T0和T1的功能和工作模式,TCON用来控制T0和T1启动或停止计数,同时包含定时/计数器的状态。
16位的定时器/计数器实质上就是一个加1计数器,其控制电路受软件控制、切换。 当定时器/计数器为定时工作方式时,计数器的加1信号由振荡器的12分频信号产生,即每过一个机器周期,计数器加1,直至计满溢出为止。
定时器的定时时间与系统的振荡频率有关。因一个机器周期等于12个振荡周期,所以计数频率fcount=1/12osc。
-
两个字节最大数据为65536(十进制),或者0FFFFH。
-
高字节为TH0=(65536-X)/256,就是除以256后的整数部分。
-
低字节为TL0=(65536-X)%256,减去高字节后余下的部分。
代码实现
//名称: LED模拟交通灯 #include <reg51.h> #define uint unsigned int #define uchar unsigned char #define SEG P3 sbit E_RED=P0^0; //东西红灯 sbit E_YELLOW=P0^1; //东西黄灯 sbit E_GREEN=P0^2; //东西绿灯 sbit N_RED=P0^3; //南北红灯 sbit N_YELLOW=P0^4; //南北黄灯 sbit N_GREEN=P0^5; //南北绿灯 sbit E_LEFT=P0^6; //南转东向绿灯亮,北转西向绿灯亮 sbit N_LEFT=P0^7; //东转北绿灯亮,西转南的绿灯亮 sbit btn = P1^0; //外部中断开关 /*sbit P30=P3^0; //测试led灯是否能亮 sbit P31=P3^1; sbit P32=P3^2; sbit P33=P3^3; sbit P34=P3^4; sbit P35=P3^5; sbit P36=P3^6; sbit P37=P3^7;*/ sbit SCON1 = P2^0; //控制数码管个位十位显示 sbit SCON2 = P2^1; uchar num=10,ge,shi; //定义倒计时初始值 uchar a=0; //定义交通灯种类 uchar count=0; //控制两位数码管 uchar flag; //计时器是否达到1s //定义表格存放共阳极LED的点阵码 unsigned char code ledTab[]={ 0xC0, // 1100 0000 数字0 0xF9, // 1111 1001 数字1 0xA4, // 1010 0100 数字2 0xB0, // 1011 0000 数字3 0x99, // 1001 1001 数字4 0x92, // 1001 0010 数字5 0x82, // 1000 0010 数字6 0xF8, // 1111 1000 数字7 0x80, // 1000 0000 数字8 0x90 // 1001 0000 数字9 }; //type = 1; //操作类型变量 //i = 0; //循环变量 //1毫秒延迟子程序 void Delay_Ms(uint x){ uchar t; while(x--) { for(t=50;t>0;t--); } } int0()interrupt 0 { TR0=~TR0; } //紧急暂停函数 void stop(){ //当按钮接受到低电平的时候,停止倒计时,所有路口变成红灯 if(btn==0){ Delay_Ms(1000); //取消抖动 TR0=~TR0; //停止倒计时 N_RED = 0;N_YELLOW = 1;N_GREEN = 1; N_LEFT=1; E_RED = 0;E_YELLOW = 1;E_GREEN = 1; E_LEFT=1; } } //交通灯切换程序 此程序采用共阳极接法,所以低电平0有效 /*void traffic_light() { switch (type) { case 1: //南北绿,东西红 N_RED = 1;N_YELLOW = 1;N_GREEN = 0; N_LEFT=1; E_RED = 0;E_YELLOW = 1;E_GREEN = 1; E_LEFT=1; Delay_Ms(5000); type = 2; break; case 2: //南北闪黄灯,东西红灯 N_RED=1;N_YELLOW = 0; N_GREEN=1; N_LEFT=1; E_RED=0; E_YELLOW =1; E_GREEN=1; E_LEFT=1; Delay_Ms(5000); type = 3; break; case 3: //南转东向绿灯亮,北转西向绿灯亮 N_RED = 1; N_YELLOW = 1;N_GREEN = 1; N_LEFT=0; E_RED = 0; E_YELLOW =1; E_GREEN=1; E_LEFT=1; Delay_Ms(5000); type = 4; break; case 4: //南北闪黄灯,东西红灯 N_RED = 1;N_YELLOW = 0; N_GREEN = 1; N_LEFT=1; E_RED = 0; E_YELLOW =1; E_GREEN=1; E_LEFT=1; Delay_Ms(5000); type = 5; break; case 5: //南北应该亮红灯,东西要亮绿灯 N_RED = 0;N_YELLOW = 1; N_GREEN = 1; N_LEFT=1; E_RED = 1; E_YELLOW =1; E_GREEN=0; E_LEFT=1; Delay_Ms(5000); type = 6; break; case 6: //东西闪黄灯,南北亮红灯 N_RED = 0;N_YELLOW = 1; N_GREEN = 1; N_LEFT=1; E_RED = 1; E_YELLOW =0; E_GREEN=1; E_LEFT=1; Delay_Ms(5000); type = 7; break; case 7: //东转北绿灯亮,西转南的绿灯亮 N_RED = 0;N_YELLOW = 1; N_GREEN = 1; N_LEFT=1; E_RED = 1; E_YELLOW =1; E_GREEN=1; E_LEFT=0; Delay_Ms(5000); type = 8; break; case 8: //东西闪黄灯,南北亮红灯 N_RED = 0;N_YELLOW = 1; N_GREEN = 1; N_LEFT=1; E_RED = 1; E_YELLOW =0; E_GREEN=1; E_LEFT=1; Delay_Ms(5000); type = 1; break; } }*/ void T0INTinit() //定时器T0初始化1秒 { TMOD=0x01; TH0=(65536-50000)/256; TL0=(65536-50000)%256; EA=1; ET0=1; TR0=1; } void T0INT() interrupt 1 { TH0=(65536-50000) / 256; TL0=(65536-50000) % 256; flag++; if(flag==20)//当定时到1秒时执行花括号里面的语句 { flag=0; num--; if (num == 0 && a%2 == 0) //控制黄灯倒计时 { num = 5; a++; } else if (num == 0 && a%2 == 1){ //控制红绿灯倒计时 num =10; a++; } switch (a%8) { case 0: //南北绿,东西红 N_RED = 1;N_YELLOW = 1;N_GREEN = 0; N_LEFT=1; E_RED = 0;E_YELLOW = 1;E_GREEN = 1; E_LEFT=1; break; case 1: //南北闪黄灯,东西红灯 N_RED=1; N_YELLOW = ~N_YELLOW; N_GREEN=1; N_LEFT=1; E_RED=0; E_YELLOW = 1; E_GREEN=1; E_LEFT=1; break; case 2: //南转东向绿灯亮,北转西向绿灯亮 N_RED = 1; N_YELLOW = 1;N_GREEN = 1; N_LEFT=0; E_RED = 0; E_YELLOW =1; E_GREEN=1; E_LEFT=1; break; case 3: //南北闪黄灯,东西红灯 N_RED = 1;N_YELLOW = ~N_YELLOW; N_GREEN = 1; N_LEFT=1; E_RED = 0; E_YELLOW =1; E_GREEN=1; E_LEFT=1; break; case 4: //南北应该亮红灯,东西要亮绿灯 N_RED = 0;N_YELLOW = 1; N_GREEN = 1; N_LEFT=1; E_RED = 1; E_YELLOW =1; E_GREEN=0; E_LEFT=1; break; case 5: //东西闪黄灯,南北亮红灯 N_RED = 0;N_YELLOW = 1; N_GREEN = 1; N_LEFT=1; E_RED = 1; E_YELLOW = ~E_YELLOW; E_GREEN=1; E_LEFT=1; break; case 6: //东转北绿灯亮,西转南的绿灯亮 N_RED = 0;N_YELLOW = 1; N_GREEN = 1; N_LEFT=1; E_RED = 1; E_YELLOW =1; E_GREEN=1; E_LEFT=0; break; case 7: //东西闪黄灯,南北亮红灯 N_RED = 0;N_YELLOW = 1; N_GREEN = 1; N_LEFT=1; E_RED = 1; E_YELLOW = ~E_YELLOW; E_GREEN=1; E_LEFT=1; break; } } } //主程序 void main(){ T0INTinit(); while(1){ //死循环 stop(); SEG=0xff; //消影,不然只显示一位 shi = num / 10; ge = num % 10; switch(count){ //通过余晖效应,虽然是不同时间,但人眼感觉是一起亮的 case 0: SCON1=0; SCON2=1; SEG=ledTab[ge]; break; case 1: SCON1=1; SCON2=0; SEG=ledTab[shi]; break; } count++; if(count>1) count=0; //traffic_light(); //不断执行交通灯切换程序 } }
成果图
当倒计时结束时候,进入黄灯闪烁,后在进入红灯
当按下紧急暂停按钮后,所有路口变为红灯,倒计时停止,再次点击后恢复
资源下载
还是不会的小伙伴可以到这里下载【实现代码 + 仿真图 + 报告】,就当请我一杯奶茶好了:)
-
-
单片机交通灯课程设计.zip
2020-06-08 18:12:09利用C51单片机做的一个关于交通灯的设计,其中包含按键中断的扩展,压缩文件内包含代码、Proteus仿真和实验报告。(C语言) -
51单片机交通灯
2022-01-14 20:50:1451单片机交通灯设计交通灯
一、 系统功能分析
-
交通灯由AT89C52单片机、13个LED灯,4个7SEG—COM数码管,2个按键构成。一组红绿灯由一个数码管和红黄绿的led灯构成,有东西南北四组。
-
北方和南方的数码管接P2口,西方和东方的数码管接P0口,P3口主要接LED灯。即北方和南方控制显示相同,东方和西方控制相同。
-
规则指定:红灯亮15秒,黄灯亮3秒,绿灯亮12秒,按下紧急停止按键时,所有的交通灯熄灭,紧急灯(红灯)亮。当按下恢复的按钮时,交通灯开始恢复:开始状态,南北方向绿灯12秒,西北方向红灯15秒。
二、 系统方案设计(功能框图)
电路图
简要说明
- 按下紧急停止按键时,所有的交通灯熄灭,紧急灯(红灯)亮。当按下恢复的按钮时,交通灯开始恢复:开始状态,南北方向绿灯12秒,西北方向红灯15秒。
- 在实现操作的时候感觉,交通灯有点卡,可能是代码问题,可能还需要进一步的优化吧。
源代码
红绿灯转换过程主要是标志量来转换
#include<reg52.h> //定义数码管位选择 #define LSE_choice P1 //急停与恢复 sbit Key_stop=P3^2; sbit Key_continue=P3^3; //红绿灯 sbit Led1_g=P3^0;//上下绿灯 sbit Led1_y=P3^1;//上下黄灯 sbit Led1_r=P3^6;//上下红灯 sbit Led2_g=P3^7;//左右绿灯 sbit Led2_y=P3^4;//黄灯 sbit Led2_r=P3^5;//红灯 sbit RED_LED=P1^7;//警告灯 //定义按键 sbit Key_0=P3^2;// sbit Key_1=P3^3; typedef unsigned char u8;//8指8位,1个字节 typedef unsigned int u16;//定义关键字;16指16位,2字节 sbit L0=P1^0; sbit L1=P1^1; u8 second0=15;//上下起始秒 u8 second1=12;//左右起始秒 u8 key=0;//键值 //全局标志量 u8 sign0=0;//上下全局标志 u8 sign1=2;//左右 u8 sign_0=2;//上下:2表示绿到红,1表示红到绿 u8 sign_1=1;//左右 u8 timer0=0;//中断0次数 u8 timer1=0;//中断1次数 u8 code smgduan[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; void delay(u16 i)//延时函数 { while(i--); } void Statu()//停止和是否继续判断 { if(Key_stop==0)//停止判断 key=1; if(Key_continue==0)//继续 key=2; } void Get(u8 led11,u8 led12)//数码管显示 { TR0=1;//定时器0开启 LSE_choice=0xf5;//位选 led11=0;//上下led led12=0;//左右 P0=smgduan[second1/10];//上下十位数 P2=smgduan[second0/10];//左右 delay(100); LSE_choice=0xfa; P0=smgduan[second1%10];//上下个位数 P2=smgduan[second0%10]; delay(100); } void Choice_sign()//标志 { if(second0==0 && sign0==0)//判断上下绿灯时间是否为0 { TR0=0; sign0=1;//黄灯 second0=3;//转黄灯3S } if(second1==0 && sign1==0)//判断左右时间绿灯时间 { sign1=1; second1=3; } if(second0==0 && sign0==1)//判断上下黄灯 { if(sign_0==2)//判断黄到红 { TR0=0; sign0=2; second0=15;//红灯15S sign_0=1; } else//等价sign_0=1;判断黄到绿 { TR0=0; sign0=0; second0=12;//绿灯12S sign_0=2; } } if(second1==0 && sign1==1)//判断左右黄灯 { if(sign_1==2)//判断黄到红 { sign1=2; second1=15;//红灯15S sign_1=1; } else//等价sign_1=1;判断黄到绿 { sign1=0; second1=12;//绿灯12S sign_1=2; } } if(second0==0 && sign0==2)//判断上下红灯 { TR0=0; sign0=1;//黄灯 second0=3;//转黄灯3S } if(second1==0 && sign1==2)//判断左右红灯 { sign1=1;//黄灯 second1=3;//转黄灯3S } } void Display()//显示函数 { if(sign0==0 && sign1==0)//上下绿,左右绿 { Led1_g=0;Led2_g=0; Get(Led1_g,Led2_g); Led1_g=1;Led2_g=1; } if(sign0==0 && sign1==1)//上下绿,左右黄 { Led1_g=0;Led2_y=0; Get(Led1_g,Led2_y); Led1_g=1;Led2_y=1; } if(sign0==0 && sign1==2)//上下绿,左右红 { Led1_g=0;Led2_r=0; Get(Led1_g,Led2_r); Led1_g=1;Led2_r=1; } if(sign0==1 && sign1==0)//上下黄,左右绿 { Led1_y=0;Led2_g=0; Get(Led1_y,Led2_g); Led1_y=1;Led2_g=1; } if(sign0==1 && sign1==1)//上下黄,左右黄 { Led1_y=0;Led2_y=0; Get(Led1_y,Led2_y); Led1_y=1;Led2_y=1; } if(sign0==1 && sign1==2)//上下黄,左右红 { Led1_y=0;Led2_r=0; Get(Led1_y,Led2_r); Led1_y=1;Led2_r=1; } if(sign0==2 && sign1==0)//上下红,左右绿 { Led1_r=0;Led2_g=0; Get(Led1_r,Led2_g); Led1_r=1;Led2_g=1; } if(sign0==2 && sign1==1)//上下红,左右黄 { Led1_r=0;Led2_y=0; Get(Led1_r,Led2_y); Led1_r=1;Led2_y=1; } if(sign0==2 && sign1==2)//上下红,左右红 { Led1_r=0;Led2_r=0; Get(Led1_r,Led2_r); Led1_r=1;Led2_r=1; } Choice_sign(); Statu(); } void main() { TMOD=0x01; EA=1; ET0=1; TH0=0xee;//一次5ms TL0=0x00; TR0=1; while(1) { switch(key) { case 0:Display();break; case 1://全面停止 { Statu(); RED_LED=0; TR0=0; LSE_choice=0x7f; break; } case 2: { ET0=1; TH0=0xee; TL0=0x00; TR0=1; second0=15;//上下起始秒 second1=12;//左右起始秒 sign0=0;//上下全局标志 sign1=2;//左右 sign_0=2; sign_1=1;//左右 key=0; break; } } } } void Int_T0() interrupt 1 { timer0++; if(timer0==200)//判断一秒 { timer0=0; second0--; second1--; } TH0=0xee;//一次5ms TL0=0x00; }
-
-
基于51单片机的十字路口交通灯控制系统设计(含源码及仿真图)
2020-03-05 17:24:35基于51单片机的十字路口交通灯控制系统设计(含源码及仿真图) (1)东西、南北方向各设有一个绿、黄、红指示灯,两个显示数码管。 (2)两个方向交替允许通行,基本放行时间为25s,另外有黄灯闪烁5s。 (3)控制人员可以... -
DSP大作业(51单片机设计交通灯,含有代码)
2019-03-08 21:21:11本系统采用STC89C52单片机以及单片机最小系统和三极管驱动电路以及外围的按键和数码管显示等部件,设计一个基于单片机的交通灯设计。设计通过两位一体共阴极数码管显示,并能通过按键对定时进行设置。本系统实用性强... -
基于MCS-51的交通灯程序设计(c语言控制直行左转)
2020-07-17 15:24:09本文为基于MCS-51的交通灯程序设计(c语言控制直行左转),希望对你的学习有所帮助。 -
AT89C51单片机交通灯仿真图+代码
2021-02-09 19:16:55交通灯一、实验内容二、电路仿真图三、代码四、效果图1.状态12.状态23.按键 一、实验内容 模拟简单交通灯工作情况: 1、当单片机开始工作后,东西和南北各方向分别采用2个数码管显示倒计时间(倒计时时间可自行设定,... -
C51单片机C语言编程实现交通灯
2021-06-28 00:40:29设计一个交通灯控制器 使用keil4 和 proteus 8 安装包: Proteus 8 链接: https://pan.baidu.com/s/1Qd6pMuK_Lwf1f_zVScLuSQ 提取码:nlui Keil4 链接:https://pan.baidu.com/s/1QPmBQZb442qk9XZ1xub8kw 提取码:... -
51单片机交通灯电路及代码
2017-08-27 18:54:39基于51单片机的交通灯,在基本的十字路口交通灯的基础下,加了一些功能 -
基于51单片机模拟交通灯程序
2021-01-06 13:23:10基于51单片机模拟交通灯程序 系统概要:由于该交通系统设计一个十字路口,A道为主干道,B道为支干道。由于主干道的交通压力较大车流量大,所以A道的通行时间(即A道的绿灯与黄灯的时间应该比B道的绿灯与黄灯时间长)... -
51单片机实现交通灯压缩文件.rar
2019-11-05 17:10:38使用51单片机控制二极管,实现交通灯的循环点亮以及控制,具体功能可以在我的博客里面看到,里面有具体的电路图等 -
十字路口交通灯 51单片机代码 proteus仿真电路原理图.rar
2020-01-23 12:52:41模拟十字路口的红绿灯以及数码管倒计时时间显示,51单片机代码附带proteus仿真电路,原理图 直观实验现象 -
基于C51单片机交通灯代码运行出错,看不出哪里错误
2021-12-08 20:59:350 WARNING(S), 2 ERROR(S) 错误代码2 我想要达到的结果 开始所有灯闪烁三次,先南北红灯,东西绿灯,并倒计时20秒;倒计时结束南北红灯不变,东西黄灯闪烁三次并倒计时3秒;然后东西红灯,南北绿灯,并倒计时20秒;... -
单片机_十字路口交通灯报告+代码+实物效果图
2021-02-19 12:50:24资源包含了十字路口交通灯的项目设计报告,单片机运行代码、仿真代码。还包括实物效果图等。 -
51单片机交通灯设计(汇编语言)
2022-06-04 22:56:34PDF报告里含有汇编代码和proteus仿真图,中断实验,参照实验电路,设计交通灯控制系统。模拟交通信号灯控制:一般情况下正常显示,东西-南北交替放行,各方向通行时间为 30 秒。有救护车或警车到达时,两个方向交通... -
基于51单片机的交通灯设计
2019-01-14 13:07:47Deli软件基于语言,利用51单片机开发板外接电路实现模拟十字路口交通灯状况,TL-1到TL-5功能逐步完善。TL-5能实现自己设置各个路口的亮灯时间。具体外接电路设计图也在压缩包中可配套使用。 -
51单片机 时间控制的不同时段交通灯控制设计(简单版)
2021-01-06 12:16:09这个交通灯的设计时简单版,只有一个路口(不是十字路口)的那种(想要实现十字路口可以对代码稍加修改) 使用的开发软件:Keil uVision5 单片机类型为:C51 语言类型:C语言 在这里说一下实现的功能 STC12C5A60S2... -
基于AT89C51单片机的交通灯控制系统设计与仿真
2020-08-26 05:52:33AT89C51单片机的交通灯控制系统是由AT89C51单片机、键盘电路、LED倒计时、交通灯显示等模块组成。系统除基本交通灯功能外,还具有通行时间手动设置、可倒计时显示、急车强行通过、交通特殊情况处理等相关功能,实验...