感悟网 导航

单片机交通灯的设计 单片机课程设计:交通灯控制!

作者&投稿:宇文盼 (若有异议请与网页底部的电邮联系)
用单片机设计交通灯怎么做啊?~

你们实验箱是什么样的?可以将LED连接到单片机的任意I/O口吗?如果可以的话给你一个例子电路图如下程序如下:#include #define RED 0#define YELLOW 1#define GREEN 2sbit P2_0 = P2^0;sbit P2_1 = P2^1;sbit P2_2 = P2^2;sbit P2_3 = P2^3;sbit P2_4 = P2^4;sbit P2_5 = P2^5;#define E2W_LED_RED_ON P2_3 = 0 //东西方向红灯亮#define E2W_LED_RED_OFF P2_3 = 1#define E2W_LED_YELLOW_ON P2_4 = 0#define E2W_LED_YELLOW_OFF P2_4 = 1#define E2W_LED_GREEN_ON P2_5 = 0#define E2W_LED_GREEN_OFF P2_5 = 1#define S2N_LED_RED_ON P2_0 = 0 //南北方向红灯亮#define S2N_LED_RED_OFF P2_0 = 1#define S2N_LED_YELLOW_ON P2_1 = 0#define S2N_LED_YELLOW_OFF P2_1 = 1#define S2N_LED_GREEN_ON P2_2 = 0#define S2N_LED_GREEN_OFF P2_2 = 1unsigned char Status_E2W; //东西方向的交通灯状态unsigned char Status_S2N; //南北方向的交通灯状态unsigned int T10sCnt=0;unsigned int T3sCnt=0;void InitTimer1(void) //定时器1定时50ms{ TMOD = 0x10; TH1 = 0x3C; TL1 = 0xB0; EA = 1; ET1 = 1; TR1 = 1;}void main(){ Status_E2W = GREEN; Status_S2N = RED; E2W_LED_GREEN_ON; S2N_LED_RED_ON; InitTimer1(); while(1) { } }void Timer1Interrupt(void) interrupt 3{ TH1 = 0x3C; TL1 = 0xB0;if(Status_E2W == GREEN){ if(++T10sCnt >= 200)//10s时间到 { T10sCnt = 0; Status_E2W = YELLOW; //东西方向变为黄灯状态 E2W_LED_GREEN_OFF;//东西方向绿灯关 E2W_LED_YELLOW_ON;//东西方向黄灯亮 S2N_LED_RED_OFF;//南北方向红灯关 S2N_LED_YELLOW_ON;//南北方向黄灯亮 }}else if(Status_E2W == YELLOW){ if(++T3sCnt >= 60) //3s时间到 { T3sCnt = 0; Status_E2W = RED;//东西方向变为红灯状态 Status_S2N = GREEN;//南北方向 变为绿灯状态 E2W_LED_YELLOW_OFF; //东西方向黄灯关 E2W_LED_RED_ON;//东西方向绿灯亮 S2N_LED_YELLOW_OFF;//南北方向黄灯关 S2N_LED_GREEN_ON;//南北方向绿灯亮 }}else if(Status_S2N == GREEN){ if(++T10sCnt >= 200)//10s时间到 { T10sCnt = 0; Status_S2N = YELLOW; //南北方向变为黄灯状态 S2N_LED_GREEN_OFF;//南北方向绿灯关 S2N_LED_YELLOW_ON; //南北方向黄灯亮 E2W_LED_RED_OFF;//东西方向红灯关 E2W_LED_YELLOW_ON;//东西方向黄灯亮 }}else if(Status_S2N == YELLOW){ if(++T3sCnt >= 60) //3s时间到 { T3sCnt = 0; Status_S2N = RED;//南北方向变为红灯状态 Status_E2W = GREEN; //东西方向变为绿灯状态 S2N_LED_YELLOW_OFF; //南北方向黄灯关 S2N_LED_RED_ON; //南北方向红灯亮 E2W_LED_GREEN_ON; //东西方向绿灯亮 E2W_LED_YELLOW_OFF; //东西方向黄灯关 }}}

#include
#define uchar unsigned char
#define uint unsigned int
sbit RED_A=P3^0; //东西向指示灯
sbit YELLOW_A=P3^1;
sbit GREEN_A=P3^2;
sbit RED_B=P3^3; //南北向指示灯
sbit YELLOW_B=P3^4;
sbit GREEN_B=P3^5;
sbit KEY1=P1^0;
sbit KEY2=P1^1;
sbit KEY3=P1^2;
//延时倍数,闪烁次数,操作类型变量
uchar Flash_Count=0,Operation_Type=1,LEDsng,LEDsns,LEDewg,LEDews,discnt;
uint Time_Count=0,time;
uchar ledtab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff};
void displaysn()
{
LEDsng=((time-Time_Count)/20)%10;
LEDsns=((time-Time_Count)/20)/10;
LEDewg=0x10;
LEDews=0x10;
}
void displayew()
{
LEDewg=((time-Time_Count)/20)%10;
LEDews=((time-Time_Count)/20)/10;
LEDsng=0x10;
LEDsns=0x10;
}
//定时器0 中断函数
void T0_INT() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
switch(Operation_Type)
{
case 1: //东西向绿灯与南北向红灯亮
if((Time_Count%20)==0)displayew();
RED_A=0;YELLOW_A=0;GREEN_A=1;
RED_B=1;YELLOW_B=0;GREEN_B=0;
if(++Time_Count!=time) return;
Time_Count=0;
Operation_Type=2;
break;
case 2: //东西向黄灯开始闪烁,绿灯关闭
LEDewg=0x0;
LEDews=0x0;
if(++Time_Count!=8) return;
Time_Count=0;
YELLOW_A=~YELLOW_A;GREEN_A=0;
if(++Flash_Count!=6) return; //闪烁
Flash_Count=0;
Operation_Type=3;
break;
case 3: //东西向红灯与南北向绿灯亮
if((Time_Count%20)==0)displaysn();
RED_A=1;YELLOW_A=0;GREEN_A=0;
RED_B=0;YELLOW_B=0;GREEN_B=1;
if(++Time_Count!=time) return;
Time_Count=0;
Operation_Type=4;
break;
case 4: //南北向黄灯开始闪烁,绿灯关闭
LEDsng=0x0;
LEDsns=0x0;
if(++Time_Count!=8) return;
Time_Count=0;
YELLOW_B=~YELLOW_B;GREEN_A=0;
if(++Flash_Count!=6) return; //闪烁
Flash_Count=0;
Operation_Type=1;
break;
}
}
void t1_isr() interrupt 3
{
TR1=0;
TH1=(65536-3000)/256;
TL1=(65536-3000)%256;
TR1=1;
switch(discnt)
{
case 0:
P2=0x02;
P0=ledtab[LEDewg];
break;
case 1:
P2=0x01;
P0=ledtab[LEDews];
break;
case 2:
P2=0x08;
P0=ledtab[LEDsng];
break;
case 3:
P2=0x04;
P0=ledtab[LEDsns];
break;
default:discnt=0;break;
}
discnt++;
discnt&=0x03;
}
void delay()
{
uint i;
for(i=0;i<1000;i++);
}
//主程序
void main()
{
TMOD=0x11; //T0 方式1
EA=1;
ET0=1;
TR0=1;
TH1=(65536-3000)/256;
TL1=(65536-3000)%256;
TR1=1;
ET1=1;
time=120;
Time_Count=100;
Time_Count=0;
Operation_Type=1;
while(1)
{
if(KEY1==0) //按一下加1S
{
delay();
if(KEY1==0)
{
while(KEY1==0);
TR0=0;
time+=20;
LEDsng=(time/20)%10;
LEDsns=(time/20)/10;
LEDewg=0x10;
LEDews=0x10;
}
}
if(KEY2==0) //按一下减1S
{
delay();
if(KEY2==0)
{
while(KEY2==0);
TR0=0;
time-=20;
if(time==0)time=20;
LEDewg=(time/20)%10;
LEDews=(time/20)/10;
LEDsng=0x10;
LEDsns=0x10;
}
}
if(KEY3==0) //启动
{
delay();
if(KEY3==0)
{
while(KEY2==0);
TR0=1;
Time_Count=0;
}
}
}
}

  4.2.3 系统工作原理
  (1)开关键盘输入交通灯初始时间,通过8051单片机P1输入到系统
  (2) 由8051单片机的定时器每秒钟通过P0口向8255的数据口送信息,由8255的PA 口显示红、绿、黄灯的燃亮情况;由8255的PC口显示每个灯的燃亮时间。
  (3)8051通过 设置 各个信号等的燃亮时间、通过8031设置,绿、红时间分别为60秒、80秒循环由8051的 P0口向8255的数据口输出。
  (4) 通过8051单片机的P3.0位来控制系统是工作或设置初值,当.牌位0就对系统进行初始化,为1系统就开始工作。
  (5)红灯倒计时时间,当有车辆闯红灯时,启动蜂鸣器进行报警,3S后然后恢复正常。
  (6)增加每次绿灯时间车流量检测的功能,并且通过查询P2.0端口的电平是否为低,开关按下为低电平,双位数码管显示车流量,直到下一次绿灯时间重新记入。
  (7)绿灯时间倒计时完毕,重新循环。

  5.5.2 程序源代码

  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

我的博客上有一个比较好的,但你还要加一点点.

《单片机编程 交通灯的控制(求wave软件的程序源程序*.asm)》
答:五、设计说明 1. 因为本设计是交通灯控制设计,所以要先了解实际交通灯的变化规律。假设一个十字路口为东西南北走向。初始状态0为东西红灯,南北红灯,然后转状态l南北绿灯通车,东西红灯;过一段时间转状态2,南北绿灯闪几次转亮黄灯,延时3秒,东西仍然红灯;再转状态3,东西绿灯通车,南北红灯;过一...

《单片机控制交通灯论文》
答:要保证高效安全的交通秩序,除了制定一系列的交通规则,还必须通过一定的科技手段加以实现。本文在对目前交通控制进行深入分析的基础上,运用检测传感、实时调整智能化控制的实现技术,将传感器监测、实时调整车辆通行时间的算法与单片机控制作用相结合,提出了基于单片机的交通控制系统设计方案。8051单片机的交通灯...

《单片机控制的交通灯》
答:(2)通过课程设计提高应用能力,分析问题和解决问题的能力。 (3)培养查阅资料的习惯,训练和提高自学,独立思考的能力。 2、课程设计要求 交通灯控制系统的设计 1) 掌握在单片机系统中扩展简单I/O接口的方法。 2) 掌握数据输出程序的设计方法。 3) 掌握模拟交通灯控制的实现方法。 4) 掌握外部中断...

《单片机设计急救车优先的交通灯控制》
答:CLR P3.2 ;;主黄灯亮 CLR P3.3 SETB P3.1 mov 32H,#05H MOV R4 ,#05H L3:setb p3.3 CALL DIS1 ;;调用显示 CALL YS DEC R4 CLR p3.3 DJNZ 32H,L3 CLR P3.1 CLR P3.4 SETB P3.0 SETB P3.5 mov 33H ,#020H ;;主干红灯 次道绿灯20秒 MOV...

《设计一个以单片机为核心的交通灯控制器。要求红黄绿灯,各自闪烁时间...》
答:给你一个想法:假设是一个简单的交通灯,黄灯,红灯30秒,绿灯30秒。需要两个状态变量,迪尔(1:东西,南北)方向,一些光色LightcolorEW,南北浅色LightcolorNS。目前,红色的东西,然后DIR = 1 LightcolorEW =红色LightcolorNS =绿色的方向。分配到相应的端口。只需要南北方向东西方向相反。假设有...

《简单单片机交通灯c程序设计(89c51)(最好加点注释)求位哥哥指教...》
答: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; //闪烁次数,操作类型变量 //延时 void DelayMS(uint x){ uchar i;while(x--) for(i=0;i<120;i++);} //交通灯切换 ...

《急需一个单片机交通灯程序设计》
答:/ Keil C 89S51 交通信号控制程序 (C) 版权所有 Dai_Weis@hotmail.com / include "reg51.h"define UINT unsigned int define ULONG unsigned long define UCHAR unsigned char / 信号灯变量 南北方向绿灯 sbit n_bike_g = P1^0; //自行车 sbit n_right_g = P1^1; //右转 sbit n_up_g ...

《c51单片机c语言交通灯的程序》
答:sbit Yellow_nb=P2^5; //南北黄灯标志 sbit Yellow_dx=P2^2; //东西黄灯标志 sbit Green_nb=P2^4;sbit Green_dx=P2^1;sbit Buzz=P3^7;bit Buzzer_Indicate;bit time=0;//灯状态循环标志 bit set=1;//调时方向切换键标志 uchar code table[11]={ //共阴极字型码 0x3f...

《急求单片机设计《急救车优先的交通灯控制》》
答:/*没有使用中断,硬件包括单片机、电源、晶振、复位电路、六个led灯、一个开关。单片机使用11.0592M晶振*/ include<reg51.h> define uchar unsigned char define uint unsigned int sbit sw=P3^3; //模拟救护车的开关 uint x;void delay10ms(){ uint i;for(i=120;i>0;i--) //改变i...

《单片机的交通灯课程设计,希望大神能帮我!》
答:include<reg51.h> define uint unsigned int define uchar unsigned char define red (~0x01)define yellow (~0x02)define green (~0x04)define left (~0x08)define nbred (~0x10)define nbyellow (~0x20)define nbgreen(~0x40)define nbleft (~0x80)uint num2;uchar dx_js,nb_js;uchar...

   

返回顶部
本页内容来自于网友发表,若有相关事宜请照下面的电邮联系
感悟网