近期关于基于单片机的交通信号灯模拟控制系统设计的讨论热度持续攀升,我们通过多方渠道收集整理了相关资讯 ,并进行了系统化的梳理 。若这些内容恰好能为您提供参考,将是我们最大的荣幸。
;2位LED数码管显示程序:P0口接数码管段,P2口接数码管位。 P3口接键盘,P1口接发光二极管
ORG 0000H
LJMP MAIN
ORG 0003H
LJMP INT0P
ORG 000BH
LJMP T0INT
ORG 0013H
LJMP INT1P
ORG 001BH
LJMP CTC1
ORG 0100H
MAIN: LCALL CSHIH ;初始化
LOOP: LCALL TONGX ;通行路口
LCALL H_BCD2 ;计算(1位HEX转换为2位BCD码)
LCALL YIMA ;译码
LCALL LED4W ;显示
CLR 00H
JNB 00H,$
DJNZ R6,LOOP
MOV R6,#100
JNB 10H,LOOP1 ;启动特殊功能K0
JB 10H,$
LOOP1: JNB 11H,LOOP2 ;启动特殊功能K1
JB 11H,$
NOP
LOOP2: JNB 12H,LOOP3 ;启动特殊功能K2
JB 12H,$
NOP
LOOP3: DJNZ TIME,LOOP
SETB 02H
SJMP LOOP
TONGX: JB 01H,DONGX
JB 02H,HUANG1
MOV P1,#21H
SJMP TX_OUT
HUANG1: MOV P1,#22H
MOV TIME,#1
DJNZ R5,TX_OUT
MOV R5,200
CLR 02H
CPL 01H
MOV TIME,#15
SJMP TX_OUT
DONGX: JB 02H,HUANG2
MOV P1,#0CH
SJMP TX_OUT
HUANG2: MOV P1,#14H
MOV TIME,#1
DJNZ R5,TX_OUT
MOV R5,200
CLR 02H
CPL 01H
MOV TIME,#15
TX_OUT: RET
LED4W: MOV A,XWEI
MOV B,#3
MUL AB
MOV DPTR,#LED4T
JMP @A+DPTR
LED4T: LJMP LD4W1
LJMP LD4W2
LJMP LD4W3
LJMP LD4W4
LD4W1: MOV LEDD,MLED1
MOV LEDW,#1
INC XWEI
SJMP LED4WE
LD4W2: MOV LEDD,MLED2
MOV LEDW,#2
INC XWEI
SJMP LED4WE
LD4W3: MOV LEDD,MLED3
MOV LEDW,#4
INC XWEI
SJMP LED4WE
LD4W4: MOV LEDD,MLED4
MOV LEDW,#8
MOV XWEI,#0
LED4WE: RET
YIMA: MOV R0,#BLED1 ;四位LED
MOV R1,#MLED1
MOV R7,#2
MOV DPTR,#YIMTAB
YIMA1: MOV A,@R0
MOVC A,@A+DPTR
MOV @R1,A
INC R0
INC R1
DJNZ R7,YIMA1
RET
YIMTAB: DB 3FH,06H,5BH,4FH,66H ;0,1,2,3,4
DB 6DH,7DH,07H,7FH,6FH ;5,6,7,8,9
CSHIH: MOV TIME,#15
MOV XWEI,#0
MOV LEDD,#0
MOV LEDW,#0
MOV R6,#100 ;1秒延时
MOV R5,#200 ;2秒延时
MOV P1,#21H
MOV 20H,#0
MOV 22H,#0
MOV TMOD,#61H ;T0方式1
MOV TTH0,#0D8H ;10ms
MOV TTL0,#0F0H
MOV TL0,TTL0
MOV TH0,TTH0
MOV TL1,#0FFH
MOV TH1,#0FFH
MOV IE,#8FH
SETB TR0
SETB TR1
MOV BLED1,#0
MOV BLED2,#0
MOV MLED3,#0
MOV MLED4,#0
RET
H_BCD2: MOV A,TIME
MOV B,#10
DIV AB
MOV BLED2,A
MOV BLED1,B
MOV MLED3,#0
MOV MLED4,#0
RET
T0INT: MOV TL0,TTL0
MOV TH0,TTH0
SETB 00H
RETI
INT0P: CPL 10H
SETB P1.2
CLR P1.1
CLR P1.0
SETB P1.5
CLR P1.4
CLR P1.3
RETI
INT1P: CPL 11H
CLR P1.2
CLR P1.1
SETB P1.0
SETB P1.5
CLR P1.4
CLR P1.3
RETI
CTC1: CPL 12H
MOV P1,#0CH
RETI
BIAOZ DATA 20H ;标志:.0定时到 。
XWEI DATA 60H ;显示位,4位:0~3
TTL0 DATA 61H
TTH0 DATA 62H
TIME DATA 66H ;倒计时时间
BLED1 DATA 74H ;显示数据BCD
BLED2 DATA 75H
BLED3 DATA 76H
BLED4 DATA 77H
MLED1 DATA 78H ;显示数据译码
MLED2 DATA 79H
MLED3 DATA 7AH
MLED4 DATA 7BH
LEDD EQU P0 ;数码管段
LEDW EQU P2 ;数码管位
END
基于51单片机的交通灯控制设计
ORG 0000H ;主程序的入口地址
LJMP MAIN ;跳转到主程序的开始处
ORG 0003H ;外部中断0的中断程序入口地址
ORG 000BH ;定时器0的中断程序入口地址
LJMP T0_INT ;跳转到中断服务程序处
ORG 0013H ;外部中断1的中断程序入口地址
MAIN : MOV SP,#50H
MOV IE,#8EH ;CPU开中断 ,允许T0中断,T1中断和外部中断1中断
MOV TMOD,#51H ;设置T1为计数方式,T0为定时方式,且都工作于模式1
MOV TH1,#00H ;T1计数器清零
MOV TL1,#00H
SETB TR1 ;启动T1计时器
SETB EX1 ;允许INT1中断
SETB IT1 ;选择边沿触发方式
MOV DPTR ,#0003H
MOV A, #80H ;给8255赋初值 ,8255工作于方式0
MOVX @DPTR, A
AGAIN: JB P3.1,N0 ;判断是否要设定东西方向红绿灯时间的初值,若P3.1为1 则跳转
MOV A,P1
JB P1.7,RED ;判断P1.7是否为1,若为1则设定红灯时间,否则设定绿灯时间
MOV R0,#00H ;R0清零
MOV R0,A ;存入东西方向绿灯初始时间
MOV R3,A
LCALL DISP1
LCALL DELAY
AJMP AGAIN
RED: MOV A,P1
ANL A,#7FH ;P1.7置0
MOV R7,#00H ;R7清零
MOV R7,A ;存入东西方向红灯初始时间
MOV R3,A
LCALL DISP1
LCALL DELAY
AJMP AGAIN
;-------------------------------------------
N0: SETB TR0 ;启动T0计时器
MOV 76H,R7 ;红灯时间存入76H
N00: MOV A,76H ;东西方向禁止 ,南北方向通行
MOV R3,A
MOV DPTR,#0000H ;置8255A口,东西方向红灯亮,南北方向绿灯亮
MOV A,#0DDH
MOVX @DPTR, A
N01: JB P2.0,B0
N02: SETB P3.0
CJNE R3,#00H,N01 ;比较R3中的值是否为0 ,不为0转到当前指令处执行
;------黄灯闪烁5秒程序------
N1: SETB P3.0
MOV R3,#05H
MOV DPTR,#0000H ;置8255A口,东西,南北方向黄灯亮
MOV A,#0D4H
MOVX @DPTR,A
N11: MOV R4,#00H
N12: CJNE R4,#7DH,$ ;黄灯持续亮0.5秒
N13: MOV DPTR,#0000H ; 置8255A口 ,南北方向黄灯灭
MOV A,#0DDH
MOVX @DPTR,A
N14: MOV R4,#00H
CJNE R4,#7DH,$ ;黄灯持续灭0.5秒
CJNE R3,#00H,N1 ;闪烁时间达5秒则退出
;------------------------------------------------------------
N2: MOV R7,#00H
MOV A,R0 ;东西通行,南北禁止
MOV R3,A
MOV DPTR,#0000H ; 置8255A口,东西方向绿灯亮 ,南北方向红灯亮
MOV A,#0EBH
MOVX @DPTR,A
N21: JB P2.0,T03
N22: CJNE R3,#00H,N21
;------黄灯闪烁5秒程序------
N3: MOV R3,#05H
MOV DPTR,#0000H ;置8255A口,东西,南北方向黄灯亮
MOV A,#0E2H
MOVX @DPTR,A
N31: MOV R4,#00H
CJNE R4,#7DH,$ ;黄灯持续亮0.5秒
N32: MOV DPTR,#0000H ; 置8255A口 ,南北方向黄灯灭
MOV A,#0EBH
MOVX @DPTR,A
N33: MOV R4,#00H
CJNE R4,#7DH,$ ;黄灯持续灭0.5秒
CJNE R3,#00H,N3 ;闪烁时间达5秒则退出
SJMP N00
;------闯红灯报警程序------
B0: MOV R2,#03H ;报警持续时间3秒
B01: MOV A,R3
JZ N1 ;若倒计时完毕,不再报警
CLR P3.0 ;报警
CJNE R2,#00H,B01 ;判断3秒是否结束
SJMP N02
;------1秒延时子程序-------
N7: RETI
T0_INT:MOV TL0,#9AH ;给定时器T0送定时10ms的初值
MOV TH0,#0F1H
INC R4
INC R5
CJNE R5,#0FAH,T01 ;判断延时是否够一秒,不够则调用显示子程序
MOV R5,#00H ;R5清零
DEC R3 ;倒计时初值减一
DEC R2 ;报警初值减一
T01: ACALL DISP ;调用显示子程序
RETI ;中断返回
;------显示子程序------
DISP: JNB P2.4,T02
DISP1: MOV B,#0AH
MOV A,R3 ;R3中值二转十显示转换
DIV AB
MOV 79H,A
MOV 7AH,B
DIS: MOV A,79H ;显示十位
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV DPTR,#0002H
MOVX @DPTR,A
MOV DPTR,#0001H
MOV A,#0F7H
MOVX @DPTR,A
LCALL DELAY
DS2: MOV A,7AH ;显示个位
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV DPTR,#0002H
MOVX @DPTR,A
MOV DPTR,#0001H
MOV A,#0FBH
MOVX @DPTR,A
RET
;------东西方向车流量检测程序------
T03: MOV A,R3
SUBB A,#00H ;若绿灯倒计时完毕,不再检测车流量
JZ N3
JB P2.0,T03
INC R7
CJNE R7,#64H,E1
MOV R7,#00H ;中断到100次则清零
E1: SJMP N22
;------东西方向车流量显示程序------
T02: MOV B,#0AH
MOV A,R7 ;R7中值二转十显示转换
DIV AB
MOV 79H,A
MOV 7AH,B
DIS3: MOV A,79H ;显示十位
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV DPTR,#0002H
MOVX @DPTR,A
MOV DPTR,#0001H
MOV A,#0F7H
MOVX @DPTR,A
LCALL DELAY
DS4: MOV A,7AH ;显示个位
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV DPTR,#0002H
MOVX @DPTR,A
MOV DPTR,#0001H
MOV A,#0FBH
MOVX @DPTR,A
LJMP N7
;------延时4MS子程序----------
DELAY: MOV R1,#0AH
LOOP: MOV R6,#64H
NOP
LOOP1: DJNZ R6,LOOP1
DJNZ R1,LOOP
RET
;------字符表------
TAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
END
用单片机模拟控制控制交通信号灯。 题目如下; 只要做出来 ,分不是问题!
#include<reg51.h>
#define uchar unsigned char
#define uint 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;
uchar Flash_Count=0,Operation_Type=1; //闪烁次数,操作类型变量
《单片机C语言程序设计实训100例---基于8051和PROTEUS仿真》案例
5
上海师范大学信息与机电工程学院—倪继锋
//延时
void DelayMS(uint x)
{
uchar i;
while(x--) for(i=0;i<120;i++);
}
//交通灯切换
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;
DelayMS(2000);
Operation_Type=2;
break;
case 2: //东西向黄灯闪烁,绿灯关闭
DelayMS(300);
YELLOW_A=~YELLOW_A;GREEN_A=1;
if(++Flash_Count!=10) return; //闪烁5 次
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;
DelayMS(2000);
Operation_Type=4;
break;
case 4: //南北向黄灯闪烁5 次
DelayMS(300);
YELLOW_B=~YELLOW_B;GREEN_B=1;
if(++Flash_Count!=10) return;
Flash_Count=0;
Operation_Type=1;
}
}
//主程序
void main()
{
while(1) Traffic_Light();
}
参考《51单片机C语言创新教程》温子祺等著。
源码转自:《51单片机C语言创新教程》 。
/*实验名称:交通灯实验
*描述:交通灯实验要求红灯亮15秒,绿灯亮10秒,黄灯亮5秒 ,当红灯切换为绿灯或者绿灯切换为红灯,
要实现灯闪烁。红灯 、绿灯、黄灯的点亮持续时间可以通过串口来修改,
并在下一个循环中更新数值。
*作者:温子祺 *修改日期:2010/5/4 *说明:代码注释与讲解详见《51单片机C语言创新教程》温子祺等著 ,北京航空航天大学出版社 */#include?"stc.h"
typedef?unsigned?charUINT8;
typedef?unsigned?int UINT16;
typedef?unsigned?longUINT32;?
typedef?charINT8;
typedef?int?INT16;
typedef?longINT32;
#define?TIMER0_INITIAL_VALUE?5000
#define?HIGH1
#define?LOW0
#define?ON?1
#define?OFF0
#define?SEG_PORTP0
#define?LS164_DATA(x)?{if((x))P0_4=1;else?P0_4=0;}?
#define?LS164_CLK(x){if((x))P0_5=1;else?P0_5=0;}?
#define?NORTH_R_LIGHT(x){if((x))P2_0=0;else?P2_0=1;}
#define?NORTH_Y_LIGHT(x){if((x))P2_1=0;else?P2_1=1;}
#define?NORTH_G_LIGHT(x){if((x))P2_2=0;else?P2_2=1;}
#define?SOUTH_R_LIGHT(x){if((x))P2_3=0;else?P2_3=1;}
#define?SOUTH_Y_LIGHT(x){if((x))P2_4=0;else?P2_4=1;}
#define?SOUTH_G_LIGHT(x){if((x))P2_5=0;else?P2_5=1;}
#define?TRAFFIC_STATUS_10
#define?TRAFFIC_STATUS_21
#define?TRAFFIC_STATUS_32
#define?UART_MARKER0xEE
UINT8?Timer0IRQEvent=0;
UINT8?Time1SecEvent=0;
UINT8?Time500MsEvent=0;
UINT8?TimeCount=0;
UINT8?SegCurPosition=0;
UINT8?LightOrgCount[4]={15,5,15,5};
UINT8?LightCurCount[4]={15,5,15,5};
UINT8?TrafficLightStatus=0;
code?UINT8?SegCode[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
UINT8?SegBuf[4]?={0};code?UINT8?SegPosition[4]={0x07,0x0b,0x0d,0x0e};
typedef?struct?_LIGHT_VAL
{
UINT8?Head;
UINT8?val[4];?
}LIGHT_VAL;
typedef?union?_LIGHT_VAL_EX
{
LIGHT_VAL?lv; UINT8p[5];?}LIGHT_VAL_EX;
void?LS164Send(UINT8?byte)
{
UINT8?j;
for(j=0;j<=7;j++)
{
if(byte&(1<<(7-j))) {LS164_DATA(HIGH);
?}
?else
?{
LS164_DATA(LOW);
?}
LS164_CLK(LOW);? LS164_CLK(HIGH);}
}
void?RefreshDisplayBuf(UINT8?s1) ?//刷新显示缓存
{
SegBuf[0]?=?s1%10;
SegBuf[1]?=?s1/10;
SegBuf[2]?=?s1%10;
SegBuf[3]?=?s1/10;
}
void?SegDisplay(void)
{
UINT8?t;
t?=?SegCode[SegBuf[SegCurPosition]];?
SEG_PORT?|=?0x0f;
LS164Send(t);?
SEG_PORT?=?(SEG_PORT|0x0f)?&?SegPosition[SegCurPosition];
if(++SegCurPosition>=4)?
{
SegCurPosition=0;
}
?
}
void?TimerInit(void)
{
TH1?=?0;
TL1?=?0;?
TH0?=?(65536-TIMER0_INITIAL_VALUE)/256;
TL0?=?(65536-TIMER0_INITIAL_VALUE)%256;?//定时1MS
TMOD?=?0x51; /*01010001?T1计数,T0定时*/
}
void?Timer0Start(void)
{
TR0?=?1; //启动计时器1??ET0?=?1;
}
void?Timer0Stop(void)
{
TR0?=?0; //启动计时器1? ET0?=?0;?}
void?PortInit(void)
{
?P0=P1=P2=P3=0xFF;
}
void?UartInit(void)
{
SCON=0x40;
T2CON=0x34;
RCAP2L=0xD9;
RCAP2H=0xFF;
REN=1;
ES=1;
}
void?UartSendByte(UINT8?byte)
{
SBUF=byte;
while(TI==0);
TI=0;
}
void?UartPrintfString(INT8?*str)
{
while(str?&&?*str)
{
UartSendByte(*str++);
}
}
void?main(void)
{
UINT8?i=0;
PortInit();
TimerInit();
Timer0Start();
UartInit();
RefreshDisplayBuf(LightCurCount[0]);
EA=1;
NORTH_R_LIGHT(ON);
SOUTH_G_LIGHT(ON);
while(1)
{
if(Timer0IRQEvent)
{?
Timer0IRQEvent=0;
TimeCount++;
if(TimeCount>=200)
{
TimeCount=0;
if(LightCurCount[0])
{
TrafficLightStatus=0;
}
else?if(LightCurCount[1])
{
TrafficLightStatus=1;
}
else?if(LightCurCount[2])
{
TrafficLightStatus=2;
}
else?if(LightCurCount[3])
{
TrafficLightStatus=3;
}
else?
{
for(i=0;i<4;i++)
{
LightCurCount[i]=LightOrgCount[i];}
TrafficLightStatus=0;
}
switch(TrafficLightStatus)
{
case?0:
{
NORTH_R_LIGHT(ON);
SOUTH_R_LIGHT(OFF);
NORTH_G_LIGHT(OFF);
SOUTH_G_LIGHT(ON);
NORTH_Y_LIGHT(OFF);
SOUTH_Y_LIGHT(OFF);
}
break;
case?1:
{
if(LightCurCount[1]%2)
{
NORTH_R_LIGHT(ON);
SOUTH_G_LIGHT(ON);
}
else
{
NORTH_R_LIGHT(OFF);
SOUTH_G_LIGHT(OFF);
}
NORTH_Y_LIGHT(ON);
SOUTH_Y_LIGHT(ON);
}
break;
case?2:
{
NORTH_R_LIGHT(OFF);
SOUTH_R_LIGHT(ON);
NORTH_G_LIGHT(ON);
SOUTH_G_LIGHT(OFF);
NORTH_Y_LIGHT(OFF);
SOUTH_Y_LIGHT(OFF);
}
break;
case?3:
{
if(LightCurCount[3]%2)
{
NORTH_G_LIGHT(ON);
SOUTH_R_LIGHT(ON);
}
else
{
NORTH_G_LIGHT(OFF);
SOUTH_R_LIGHT(OFF);
}
NORTH_Y_LIGHT(ON);
SOUTH_Y_LIGHT(ON);
}
break;?
default:break;?
}
RefreshDisplayBuf(LightCurCount[TrafficLightStatus]);
LightCurCount[TrafficLightStatus]--;
}
SegDisplay();
}
}
}
void?UartIRQ(void)interrupt?4?
{
static?UINT8?cnt=0; static?LIGHT_VAL_EX?LightValEx; if(RI) { RI=0;?LightValEx.p[cnt++]=SBUF;
if(LightValEx.lv.Head?==?UART_MARKER) {?if(cnt>=5)
{
for(cnt=1;cnt<5;cnt++)
{
LightOrgCount[cnt-1]=LightValEx.lv.val[cnt];?
LightCurCount[cnt-1]=LightValEx.lv.val[cnt];
}
cnt=0;
UartPrintfString("设置交通灯完成\r\n");
}
} else {cnt=0;
} }}
void?Timer0IRQ(void)?interrupt?1?
{
ET0 =?0;
TH0?=?(65536-TIMER0_INITIAL_VALUE)/256;
TL0?=?(65536-TIMER0_INITIAL_VALUE)%256;?//定时1MS
Timer0IRQEvent=1;
ET0 =?1;
}
=====================================================================
坐等拿分!
关于基于单片机的交通信号灯模拟控制系统设计的探讨就到这里,您是否还有其他想了解的内容?欢迎在评论区留言告诉我们,同时别忘了点击关注哦!
评论列表(3条)
我是宝凯利的签约作者“admin”
本文概览:近期关于基于单片机的交通信号灯模拟控制系统设计的讨论热度持续攀升,我们通过多方渠道收集整理了相关资讯,并进行了系统化的梳理。若这些内容恰好能为您提供参考,将是我们最大的荣幸。;...
文章不错《基于单片机的交通信号灯模拟控制系统设计》内容很有帮助