第一篇:单片机带应急的交通灯控制实验程序(精选)
单片机带应急的交通灯控制实验(汇编)
org 00h ajmp main org 0003h ajmp int_
red_we equ p1.1 yel_we equ p1.2 gre_we equ p1.3 red_sn equ p1.5 yel_sn equ p1.6 gre_sn equ p1.7 org 0030h main: mov sp ,#65h call init_int clr red_we clr red_sn call delay3 loop: clr gre_we setb red_we call delay5
setb gre_we clr yel_we mov r4,#10 sight:call delay_200ms cpl yel_we djnz r4,sight setb yel_we
call delay_200ms clr gre_sn setb red_sn clr red_we call delay5 setb gre_sn
clr yel_sn mov r4,#10 sight1:
call delay_200ms cpl yel_sn djnz r4,sight1 setb yel_sn
clr red_sn clr red_we call delay_200ms sjmp loop
;;;;;;;;;;;;;;;;;;;;;;;;;;;中断服务程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;int_: push psw push 04h setb gre_sn setb yel_sn setb gre_we setb yel_we clr red_sn clr red_we call delay5 call init_int pop 04h pop psw reti;;;;;;;;;;;;;;;;;;;;;;;;;;外部中断初始化
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;init_int: setb ex0 setb it0 setb ea ret
;;;;;;;;;;;;;;;;;;;;;;;5秒延时
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;delay5: mov r4,#5 delay5_ : call delay_1s djnz r4,delay5_ ret;;;;;;;;;;;;;;;;;;;;;;;3秒延时
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;delay3: mov r4,#3 delay3_: call delay_1s djnz r4,delay3_ ret
;;;;;;;;;;;;;;;;;;;;;;
delay_200ms: mov r5,#20 s: call delay_10ms djnz r5,s ret
0.2秒延时
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;
非中断精确1MS定时程序
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;delay_1ms: push 07h MOV R7 ,#249 signed:
;循环部分4机器周期 nop
nop djnz R7 ,signed pop 07h ret
;返回指令2机器周期
;2+249*4+2=1000us 可以精确定时1MS,假设外部晶振是12M
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;非中断精确10MS定时程序
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;delay_10ms: push 06h mov r6,#9
;2个机器周期用2us
delay_10ms_sined:;9次循环共用9(1ms+4us)=9036us acall delay_1ms djnz r6,delay_10ms_sined
MOV r6 ,#240
;2个机器中期用2us signed_10ms :
;循环部分4机器周期 共240次 nop
nop djnz r6 ,signed_10ms pop 06h ret
;返回指令要2us;2us+9036us+240*4us+2us = 10ms 即可精确定时10ms;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
非中断精确定时1s
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
delay_1s: push 05h mov r5,#99
;两个机器周期2us
delay_1s_signed:
;循环指令周期为4us,加上延时10ms
;(10ms+4us)*99 = 990.396ms acall delay_10ms djnz r5,delay_1s_signed mov r5 ,#9
;两个机器周期2us signed_1s:
;循环指令周期为4us,加上延时1ms
;(1ms+4us)*9 = 9ms+36us acall delay_1ms djnz r5 ,signed_1s
mov r5 ,# 140
;机器周期2us signed_1s_:
;一次循环4us共有140次。140us*4 = 560us nop nop djnz r5,signed_1s_ pop 05h ret
;2us
;2us+990ms+396us+2us+9ms+36us+2us+560us+2us = 999ms+1000us = 1s
end
第二篇:单片机AT89C52十字路口交通灯控制C语言程序
单片机AT89C52十字路口交通灯控制程序
东西方向60秒,南北方向57秒
#include
#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;//东方向数码管位控制
/*********倒计时赋初值*************/ uchar EWF=20,NSF=17,X=20,Y=17,Z=20,SHU=20;uchar count;
void Init(void){ TMOD=0x01;TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;ET0=1;TR0=1;} /*******************中断服务程序**************************/ void timer1(void)interrupt 1 {
TMOD=0x01;TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;ET0=1;TR0=1;
count++;if(count>19){
EWF--;
NSF--;
X--;
Y--;
Z--;
SHU--;
count=0;
}
} /******************延时**********************/
void Delay10uS(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;
Delay10uS(1);
LED_A1=OFF;
P0=table[num2];
LED_B1=ON;
Delay10uS(1);
LED_B1=OFF;
} void display2(uchar num3,uchar num4)//控制南北方向led显示 {
P0=table[num3];
LED_C1=ON;
Delay10uS(1);
LED_C1=OFF;
P0=table[num4];
LED_D1=ON;
Delay10uS(1);
LED_D1=OFF;
} void main(){ int i;/************初始状态东西南北禁止通行************/
NS_R=ON;//南北方向红灯打开
EW_R=ON;
//东西方向红灯打开
for(i=0;i<600;i++)
{
Delay10uS(20);
} NS_R=OFF;//南北方向红灯关闭
EW_R=OFF;//东西方向红灯关闭
while(1)
{
Init();
// 初始化计时器
/****************状态1:东西绿灯(57s),南北红灯(60s)**************/ /***************状态2:东西黄灯(3s),南北红灯(60s)****************/
EW_G=ON;//东西方向的绿灯打开
NS_R=ON;//南北方向的红灯打开
while(EWF!=0)
{
display1(EWF/10,EWF%10);// 东西方向红灯(60s)
display2(NSF/10,NSF%10);// 南北方向绿灯(57s)
while(EWF==3)
{
while(X!=0)
{
display1(EWF/10,EWF%10);// 东西方向红灯(3s)
display2(X/10,X%10);// 南北方向黄灯(3s)
EW_G=OFF;// 东西方向的绿灯关闭
EW_Y=ON;// 东西方向的黄灯打开
}
}
}
NS_R=OFF;// 南北方向的红灯关闭
EW_G=OFF;// 东西方向的绿灯关闭
EW_Y=OFF;// 东西方向的黄灯打?
/*=*************状态3:东西红灯(60s),南北绿灯(57s)************/ /****************状态4:东西红灯(60s),南北黄灯(3s)***************/
EW_R=ON;// 东西方向的红灯打开
NS_G=ON;// 南北方向的绿灯打开
while(Z!=0)
{
display2(Z/10,Z%10);// 南北方向红灯(57s)
display1(Y/10,Y%10);// 东西方向绿灯(57s)
while(Z==3)
{
while(SHU!=0)
{
display2(Z/10,Z%10);// 东西红灯(3s)
display1(SHU/10,SHU%10);// 南北绿灯(3s)
NS_G=OFF;//南北方向的绿灯关闭
NS_Y=ON;// 南北方向的黄灯打开
}
}
}
} EW_R=OFF;// 东西方向的红灯关闭
NS_G=OFF;// 南北方向的绿灯关闭
NS_Y=OFF;// 南北方向的黄灯关闭
EWF=60,NSF=57,X=60,Y=57,Z=60,SHU=60;//重新赋值
}
第三篇:单片机定时器控制交通灯程序1
定时器控制交通指示灯
/* 名称:定时器控制交通指示灯
说明:东西向绿灯亮5s后,黄灯闪烁,闪烁5次亮红灯,红灯亮后,南北向由红灯变成绿灯,5s后南北向黄灯闪烁,闪烁5次后亮红灯,东西向绿灯亮,如此往复。*/ #include
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 Time_Count=0,Flash_Count=0,Operation_Type=1;//定时器0中断函数 void T0_INT()interrupt 1 { TL0=-50000/256;TH0=-50000%256;switch(Operation_Type){
case 1: //东西向绿灯与南北向红灯亮5s
RED_A=0;YELLOW_A=0;GREEN_A=1;
RED_B=1;YELLOW_B=0;GREEN_B=0;
if(++Time_Count!=100)return;//5s(100*50ms)切换
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: //东西向红灯与南北向绿灯亮5s
RED_A=1;YELLOW_A=0;GREEN_A=0;
RED_B=0;YELLOW_B=0;GREEN_B=1;
if(++Time_Count!=100)return;//5s(100*50ms)切换
Time_Count=0;
Operation_Type=4;
break;
case 4: //南北向黄灯开始闪烁,绿灯关闭
if(++Time_Count!=8)return;
Time_Count=0;
YELLOW_B=~YELLOW_B;GREEN_A=0;
if(++Flash_Count!=10)return;
Flash_Count=0;
Operation_Type=1;
break;}
} //主程序 void main(){ TMOD=0x01;
//T0方式1 IE=0x82;TR0=1;while(1);}
//闪烁
第四篇:单片机控制交通灯的案例
单片机控制交通灯
AT89C51单片机及由Keil 软件编写单片机程序,并且通过Proteus仿真测试,设计一个交通灯系统,实现简单的交通灯的管理功能。在交通灯系统的管理中,用发光二极管模拟交通信号灯,用逻辑电平开关模拟控制开关。在交通繁忙时,交通信号灯控制系统应有手控开关,可人为地改变信号灯的状态,以缓解交通拥挤状况。
工作内容及最终成果:
十字路口的交通指挥信号灯控制要求如下:
(1)信号灯受一个起动开关控制,当起动开关接通时,信号系统开始工作,且先南北红灯亮,东西绿灯亮。当起动开关断开时,所有信号灯都熄灭。(2)南北绿灯和东西绿灯不能同时亮,如果同时亮时应关闭信号灯系统,并报警。
(3)南北红灯亮维持25S。在南北红灯亮的同时东西绿灯也亮,并维持20S。到20S时,东西绿灯闪烁,闪烁3S后熄灭。在东西绿灯熄灭时,东西黄灯亮,并维持2S。到2S时,东西黄灯熄,东西红灯亮。同时,南北红灯熄灭,南北绿灯亮。
(4)东西红灯亮维持30S。南北绿灯亮维持25S。然后闪烁3S,熄灭。同时南北黄灯亮,维持2S后熄灭,这时南北红灯亮,东西绿灯亮。(5)周而复始。
ORG
0000H
LJMP START
ORG
0040H START:
MOV
SP,#60H
LCALL STATUS0;初始状态(都是红灯)CIRCLE:
LCALL STATUS1;南北绿灯,东西红灯
LCALL STATUS2;南北绿灯闪转黄灯,东西红灯
LCALL STATUS3;南北红灯,东西绿灯
LCALL STATUS4;南北红灯,东西绿灯闪转黄灯
LJMP CIRCLE STATUS0:
;南北红灯,东西红灯
MOV DPTR,#8300H
MOV A,#0FH
MOVX @DPTR,A
MOV R2,#10
;延时1秒
LCALL DELAY
RET STATUS1:
;南北绿灯,东西红灯
MOV DPTR,#08300H
MOV A,#96H
;南北绿灯,东西红灯
MOVX @DPTR,A
MOV R2,#200
;延时20秒
LCALL DELAY
RET STATUS2:
;南北绿灯闪转黄灯,东西红灯
MOV DPTR,#8300H
MOV R3,#03H
;绿灯闪3次 FLASH:
MOV A,#9FH
MOVX @DPTR,A
MOV R2,#03H
LCALL DELAY
MOV A,#96H
MOVX @DPTR,A
MOV R2,#03H
LCALL DELAY
DJNZ R3,FLASH
MOV A,#06H
;南北黄灯,东西红灯
MOVX @DPTR,A
MOV R2,#10
;延时1秒
LCALL DELAY
RET STATUS3:
;南北红灯,东西绿灯
MOV DPTR,#8300H
MOV A,#69H
MOVX @DPTR,A
MOV R2,#200
;延时20秒
LCALL DELAY
RET STATUS4:
;南北红灯,东西绿灯闪转黄灯
MOV DPTR,#8300H
MOV R3,#03H
;绿灯闪3次 FLASH1:
MOV A,#6FH
MOVX @DPTR,A
MOV R2,#03H
LCALL DELAY
MOV A,#69H
MOVX @DPTR,A
MOV R2,#03H
LCALL DELAY
DJNZ R3,FLASH1
MOV A,#09H
;南北红灯,东西黄灯
MOVX @DPTR,A
MOV R2,#10
;延时1秒
LCALL DELAY
NOP
RET DELAY:
;延时子程序
PUSH 2
PUSH 1
PUSH 0 DELAY1:
MOV 1,#00H DELAY2:
MOV 0,#0B2H
DJNZ 0,$
DJNZ 1,DELAY2;延时 100 mS
DJNZ 2,DELAY1
POP 0
POP 1
POP 2
RET
END
第五篇:51单片机控制交通灯原理图及C语言程序
Proteus仿真原理图:
Keil C源程序:
#include
unsigned
int sbit
RED_DONGXI
= P1^0;//南北方向红灯亮 sbit
YELLOW_DONGXI = P1^1;//南北方向黄灯亮 sbit
RED_NANBEI
= P1^3;//东西方向红灯亮 sbit
GREEN_DONGXI = P1^2;//南北方向绿灯亮 sbit
YELLOW_NANBEI = P1^4;//东西方向黄灯亮 sbit
GREEN_NANBEI = P1^5;//东西方向绿灯亮
sbit
DXweixuan1
= P1^6;//南北方向数码管位选1 sbit
DXweixuan2
= P1^7;//南北方向数码管位选2 sbit
NBweixuan1
= P3^0;//东西方向数码管位选1 sbit
NBweixuan2
= P3^1;//东西方向数码管位选2 sbit
L1=P3^5;sbit
L2=P3^6;sbit
L3=P3^7;uint aa, bai,shi,ge,bb;uint shi1,ge1,shi2,ge2;uint code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};uint code table1[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6};void delay(uint z);void init(uint a);void display(uint shi1,uint ge1,uint shi2,uint ge2);void xtimer0();void init1();void init2();void init3();void init4();void init5();void xint1();void xint0();void LED_ON();void LED_OFF();
void main(){ P0=0xFF;P1=0xFF;P2=0x00;
P3=0xFF;EA=1;EX0=1;IT0=0;
init1();while(1)
{
init2();//第2个状态
init3();//第3个状态
init4();//第4个状态
init5();//第5个状态
} } void init1()//第一个状态:东西、南北方向均亮红灯5S { uint temp;temp=5;TMOD=0x01;TH0=(65535-50000)/256;TL0=(65535-50000)%256;EA=1;ET0=1;TR0=1;while(1){
RED_DONGXI=0;
//第一个状态东西、南北均亮红灯5S
RED_NANBEI=0;
GREEN_DONGXI=1;
GREEN_NANBEI=1;
YELLOW_DONGXI=1;
YELLOW_NANBEI=1;
if(aa==20)//定时20*50MS=1S
{
aa=0;
temp--;
}
shi1=shi2=temp/10;
ge1=ge2=temp%10;
if(temp==0)
{
temp=5;
break;
}
display(ge1,shi1,ge2,shi2);} } void init2()//第二个状态:东西亮红灯30S~5S、南北亮绿灯25~0S;{ uint temp;temp=26;TMOD=0x01;TH0=(65535-50000)/256;TL0=(65535-50000)%256;EA=1;ET0=1;TR0=1;while(1){
RED_DONGXI=1;
RED_NANBEI=0;
GREEN_DONGXI=0;
GREEN_NANBEI=1;
YELLOW_DONGXI=1;//第二个状态:东西亮绿灯25S、南北亮红灯
YELLOW_NANBEI=1;
if(aa==20)//定时20*50MS=1S
{
aa=0;
temp--;
shi1=(temp+5)/10;
}
}
} ge1=(temp+5)%10;shi2=temp/10;ge2=temp%10;if(temp==0){ temp=26;break;} display(ge1,shi1,ge2,shi2);void init3()//第三个状态:东西绿灯变为黄灯闪5次、南北亮红灯5S { uint temp;temp=6;TMOD=0x01;TH0=(65535-50000)/256;TL0=(65535-50000)%256;EA=1;ET0=1;TR0=1;while(1){
RED_NANBEI=0;
GREEN_DONGXI=1;
if(aa==20)//定时20*50MS=1S
{
aa=0;
temp--;
YELLOW_DONGXI=~YELLOW_DONGXI;
shi1=temp/10;
shi2=shi1;
ge1=temp%10;
ge2=ge1;
}
if(temp==0)
{
temp=6;
break;
}
display(ge1,shi1,ge2,shi2);} } void init4()//第四个状态:东西亮绿灯25~0S,南北方向亮红灯30~5S; { uint temp;temp=26;TMOD=0x01;TH0=(65535-50000)/256;TL0=(65535-50000)%256;EA=1;ET0=1;TR0=1;while(1){
RED_DONGXI=0;
RED_NANBEI=1;
YELLOW_DONGXI=1;//第一个状态东西、南北均亮红灯5S
GREEN_NANBEI=0;
if(aa==20)
{
aa=0;
temp--;
shi1=temp/10;
shi2=(temp+5)/10;
ge1=temp%10;
ge2=(temp+5)%10;
if(temp==0)
{
temp=26;
break;
}
}
display(ge1,shi1,ge2,shi2);} } void init5()//第五个状态:东西亮红灯、南北绿灯闪5次转亮黄灯5S { uint temp;temp=6;TMOD=0x01;TH0=(65535-50000)/256;TL0=(65535-50000)%256;EA=1;ET0=1;TR0=1;while(1){
RED_NANBEI=1;
RED_DONGXI=0;
GREEN_DONGXI=1;
GREEN_NANBEI=1;
if(aa==20)
{
aa=0;
temp--;
YELLOW_NANBEI=~YELLOW_NANBEI;
shi1=temp/10;
shi2=shi2;
ge1=temp%10;
ge2=ge1;
if(temp==0)
{
temp=6;
break;
}
}
display(ge1,shi1,ge2,shi2);} }
void display(uint shi1,uint ge1,uint shi2,uint ge2){ DXweixuan1=0;DXweixuan2=1;NBweixuan1=1;NBweixuan2=1;P0=table[ge1];delay(5);DXweixuan1=1;DXweixuan2=0;NBweixuan1=1;NBweixuan2=1;P0=table[shi1];delay(5);DXweixuan1=1;DXweixuan2=1;NBweixuan1=0;NBweixuan2=1;P0=table[ge2];delay(5);DXweixuan1=1;DXweixuan2=1;NBweixuan1=1;NBweixuan2=0;P0=table[shi2];delay(5);} void xint0()interrupt 0 { RED_NANBEI=0;RED_DONGXI=0;GREEN_NANBEI=1;GREEN_DONGXI=1;
YELLOW_NANBEI=1;YELLOW_DONGXI=1;P0=0x00;NBweixuan1=0;NBweixuan2=0;DXweixuan1=0;DXweixuan2=0;delay(2);return;} void xint1()interrupt 2 { RED_NANBEI=1;RED_DONGXI=1;GREEN_NANBEI=0;GREEN_DONGXI=0;
YELLOW_NANBEI=1;YELLOW_DONGXI=1;P0=0x00;NBweixuan1=0;NBweixuan2=0;DXweixuan1=0;DXweixuan2=0;delay(2);return;} void xtimer0()interrupt 1 { TH0=(65535-50000)/256;TL0=(65535-50000)%256;aa++;} void delay(uint z){uint x,y;for(x=0;x for(y=0;y<110;y++);}