第一篇: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++);} 单片机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;//重新赋值 } 定时器控制交通指示灯 /* 名称:定时器控制交通指示灯 说明:东西向绿灯亮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);} //闪烁 单片机带应急的交通灯控制实验(汇编) 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 单片机控制交通灯 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第二篇:单片机AT89C52十字路口交通灯控制C语言程序
第三篇:单片机定时器控制交通灯程序1
第四篇:单片机带应急的交通灯控制实验程序(精选)
第五篇:单片机控制交通灯的案例