51单片机交通灯程序设计

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

单片机控制交通灯设计方案

一、单片机设计交通灯的设计要求:

状态一:南北绿灯亮,东西红灯亮,南北人行道绿灯,东西人行道红灯,南北左拐绿灯,东西左拐红灯。(时间为15S)

状态二:南北黄灯亮,东西红灯亮,南北人行道绿灯,东西人行道红灯,南北左拐绿灯,东西左拐红灯。(时间为5S)

状态三:南北红灯亮,东西绿灯亮,南北人行道红灯,东西人行道绿灯,南北左拐红灯,东西左拐绿灯。(时间为15S)

状态四:南北红灯亮,东西黄灯亮,南北人行道红灯,东西人行道绿灯,南北左拐红灯,东西左拐绿灯。(时间为5S)

二、设计原理分析

1、首先了解实际交通灯的变化情况和规律。假设一个十字路口如上图所以,

为东南西北走向。初始状态0:为东西绿灯亮,南北红灯亮;然后转状态1:东西绿灯亮黄灯亮,南北红灯亮黄灯亮;过后转状态2:东西红灯亮,南北绿灯亮;再转状态3:东西红灯亮黄灯亮,南北绿灯亮黄灯亮。一段时间后,又循环至状态0。中间可通过中断按钮产生中断,跳入中断程序执行中断。2、对于交通信号灯来说,应该有东西南北共四组灯,但由于同一道上的两组的信号灯的显示情况是相同的,所以只要用两组就行了,因此,采用单片机内部的I/O口上的P1口中的6个引脚即可来控制6个信号灯。

3、通过编写程序,实现对发光二极管的控制,来模拟交通信号灯的管理。每延时一段时间,灯的显示情况都会按交通灯的显示规律进行状态转换。

4、通过延时时间送显,可以在原有的交通信号灯系统的基础上,增添其倒计时间的显示功能,实现其功能的扩展。

5.通过脉冲中断编写中断程序,可实现中断。

三、设计的仿真图如下;

其接法为:P0接数码管的端选段,

P1接数码管的位选端,

P2接交通灯,接法如下:

P20,P21,P22,分别接南北向的红黄绿灯,

P23接南北左拐绿灯,

P24,P25,P26,分别接东西向的红黄绿灯,

P27接东西左拐红灯

东西人行到红绿灯和南北红绿灯接到一起

南北人行到红绿灯和东西红绿灯接到一起

四、AT89C51的KILL程序

#include "reg51.h"

#define uchar unsigned char

#define uint unsigned int

uchar code wei[]={0x01,0x02,0x04,0x08}; //位码选择

uchar code duan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//段码选择

uchar table[4]={0,0,0,0};//四位为选端赋值区间

uchar num=0;

uchar ID=1;

uchar sec=15;

uchar n=0;

void init(void)

{

P0=0xff;//端口初始化

P1=0x00;//端口初始化

P2=0x00;//端口初始化

TMOD=0x01;//使用定时器0的工作方式

EA=1;//开总中断

ET0=1;//开定时器0的中断

TH0=(65536-10000)/256;//定时10毫秒

TL0=(65536-10000)%256;

TR0=1;

}

void main(void)

{

init();

while(1)

{

switch(ID)//选择函数

{

case 1:P2=0x14;break;//东西红,南北绿,

case 2:P2=0x12;break;//东西红,南北黄,

case 3:P2=0x41;break;//东西绿,南北红,

case 4:P2=0x21;break;//东西黄,南北红,

default:break;

}

}

}

void timer0() interrupt 1//对应中断定时器0

{

TH0=(65536-10000)/256;

TL0=(65536-10000)%256;

P1=wei[num];//位选端送值

P0=duan[table[num]];//端选端送值

num++;

if(num==4)

num=0;

table[0]=(sec-1)/10;

table[1]=(sec-1)%10;

table[2]=(sec-1)/10;

table[3]=(sec-1)%10;

n++;

if(n==100)//10毫秒执行一百次为一秒

{

n=0;

sec--;

if(sec==0)

{

ID++;

if(ID==5)//

ID=1;

switch(ID)

{

case 1:sec=15;break; //

case 2:sec=3;break;//

case 3:sec=15;break;//

case 4:sec=3;break;//

default:break;/*default就是默认情况,这个是用在switch中,意思是若case都不满足,则执行default后面的语句*/

}

}

}

}

相关文档
最新文档