单片机交通灯程序流程图
- 格式:doc
- 大小:46.00 KB
- 文档页数:3
用单片机控制交通灯传统的交通灯控制电路一般由数字电路构成,电路复杂、体积大、成本高。
采用单片机控制交通灯不但可以解决上述问题,而且还具有时间显示功能,非常方便。
下面介绍一种用单片机控制交通灯的方法。
一、硬件硬件电路如附图。
AT89C2051的P1.7~P1.5和P1.3~P1.1直接驱动红、黄、绿灯,利用单片机的串口和二片74LS164串/并转换移位寄存器实现时间显示,七段数码管为共阴管,硬件电路极为简单。
二、软件交通灯有红、黄、绿三种。
红灯亮,停止通行;绿灯亮,允许通行;黄灯亮,作过渡。
红灯亮60秒,绿灯亮55秒,黄灯亮5秒。
每组灯的亮暗状态以2分钟为周期循环,故程序采用主、子程序方式,循环结构。
另外,为了简化电路,红、黄、绿灯采用低电平点亮。
源程序清单如下:ORG0000HSTART:MOVDRTR,#TABMOVSCON,#00HMOVP1,#6CH;点亮红、绿灯MOVR0,#0;R0清零LEFT:INCR0CJNER0,#55,LP0;R0<55,转LP0MOVP1,#6AH;R0=55,点亮红、黄灯LJMPLP1LP0:CJNER0,#60,LP1;R0<60,转LP1MOVP1,#0C6H;R0=60,点亮绿、红灯LJMPRIGHTLP1:LCALLDBDBLCALLDISPLJMPLEFT;20H为1,转LEFTRIGHT:DECR0CJNER0,#5,LP2;R0>0,转LP2MOVP1,#0A6H;R0=5,点亮黄、红灯LJMPLP3LP2:CJNER0,#0,LP3MOVP1,#6CH;R0=0,点亮红、绿灯LJMPLEFTLP3:LCALLDBDBLCALLDISPLJMPRIGHTDBDB:MOVA,R0MOVB,#10DIVABMOVR1,AMOVR2,BRETDISP:MOVA,R2MOVCA,@A+DPTRMOVSBUF,AJNBTI,$;查TI位CLRTIMOVA,R1MOVCA,@A+DPTRMOVSBUF,AJNBT1,$CLRTILCALLDEALYRETDELAY:MOVR3,#09HK1:MOVR4,#100K2:MOVR5,#250K3:DJNZR5,K3DJNZR4,K2KJNZR3,K1RETTAB:DB3FH,06H,5BHDB4FH,66HDB6DH,7DH,07HDB7FH,6FH三.实验电路及连线四.实验说明1.因为本实验是交通灯控制实验,所以要先了解实际交通灯的变化规律。
通灯设计交通灯设计方案:1:实现东西路----南北路红绿灯的交通指示。
2:东西路灯变化----红绿黄一南北路灯变化----绿黄红> T3:红灯延时时间---25S绿灯延时时间---20S黄灯延时时间一3S4:数码管显示:红灯---前20S不显示,只在最后5S开始倒计时显示。
绿灯---前15S不显示,只在最后5S开始倒计时显示。
黄灯---3S倒计时显示(若东西路为黄灯,南北路为红灯,那么南北绿的数码管也显示3S)。
5:交通应急事件处理:利用中断分别实现东西路---南北路的交通应急事件处理。
6:延时程序的使用:用循环延时和定时器计时的方法。
注:P1.0---北路绿灯,P1.1--北路黄灯,P1.2---北路红灯cP1.3--东路绿灯,P1.4---东路黄灯,P1.5----东路红灯。
【交通灯流程图】开始延时20秒5秒倒计时结束其他灯不变南北路绿灯亮,红,黄灯灭东西路红灯亮,绿,黄灯灭南北路绿灯数码管开始倒计时5秒南北路绿灯灭,黄灯亮且数码管开始倒计时3秒东西路红灯——数码管开始倒计时3秒3秒倒计时结束延时25秒5秒倒计时结束东西路绿灯亮,黄灯,红灯灭南北路红灯亮,黄灯,绿灯灭东西路数码管开始倒计时5秒其他灯不变东西路绿灯灭,黄灯亮且数码管开始倒计时3秒南北路红灯一一数码管开始倒计时3秒3秒倒计时结束程序如下:ORG 0000HLJMP LOOPORG 000BHLJMP WZDOORG 0013HLJMP WZD1ORG 0030HLOOP:MOV R3,#5MOV R4,#5MOV R2,#20l=LIfc=ER;定时器0中断,实现交通应急事件;下载可编辑亮 oMOV SP,#70H MOV IE,#85HMOV TMOD,#01H ;置T0为工作方式1MOV TH0,#3CH;置T0定时初值50msMOV TL0,#0B0HCLRTF0SETBTR0;启动定时器T0SETB P1.1 ;东---红灯亮,北---绿灯亮SETB P1.2CLR P1.0SETB P1.3SETB P1.4CLR P1.5ACALL DEL30SACALL Y ELLOW1 ; 北---绿灯转黄灯,东---红灯亮 ACALL DEL3S ;延时后北---黄灯火SETB P1.0;东:红灯火,绿灯亮,北:黄灯火,红灯CLR P1.2SETB P1.4SETB P1.5ACALL DEL55S ; 北---红灯不变,东---绿灯转黄灯ACALL Y ELLOW2ACALL DEL3SSJMP LOOPYELLOW1: ; 北---绿灯转黄灯,东---红灯不变SETB P1.0SETB P1.2CLR P1.1SETB P1.3CLR P1.5SETB P1.4RETYELLOW2: ; 东---绿灯转黄灯,北---红灯不变SETB P1.0SETB P1.1CLR P1.2SETB P1.3CLR P1.4RETWZD0: ;实现南北路交通应急事件CLR P1.0 ;(南北路保持畅通,东西路停止通行)SETB P1.1SETB P1.2SETB P1.3SETB P1.4CLR P1.5JNB P3.2,WZD0RETIWZD1: ;实现东西路交通应急事件CLR P1.3 ;(东西路保持畅通,南北路停止通行)CLR P1.2SETB P1.1SETB P1.0SETB P1.4SETB P1.5JNB P3.3,WZD1RETIDEL30S: J红绿灯延时DEL25S:JNB TF0QEL25S ;查询50ms到否CLR TFOMOV TH0,#3CH ;恢复T0定时初值50msMOV TL0,#0B0HDJNZ R2,DEL25S ;判断1s到否?未到继续状态MOV R2,#20 ;置50ms计数初值DJNZ R4,DEL25S ;状态1维持25s取数延时DEL5S:5MOV R2,#6DEL5:MOV A,R2ACALLST ;取数MOV P0,A ;实现数码管显示ACALL DEL1S ;每隔1S减1DJNZ R2,DEL5RETDEL3S:MOV R2,#4HDEL3:MOV A,R2ACALL ST ;取数MOV P2,AMOV P0,A ;数码管显示ACALL DEL1SDJNZ R2,DEL3RETDEL55S:ACALL DEL20SMOV R2,#6 ;倒计时5S DEL55:ACALL DEL1SMOV A,R2ACALLSTMOV P2,A ;数码管显示DJNZ R2QEL55RETDEL1S: ;1S 延时子程序MOV R5,#0BHST1:MOV R6,#0DAH下载可编辑ST2:MOV R7,#0CFHDJNZ R7,$DJNZ R6,ST2DJNZ R5,ST1RETDEL20S: ;20S延时子程序MOV R5,#0BH;#0DCHST3:MOV R6,#0DAHST4:MOV R7,#0CFHDJNZ R7,$DJNZ R6,ST4DJNZ R5,ST3RETST: ;取数MOV DPTR,#TABMOVC A,@A+DPTRRETTAB:DB 0FFH,0FFH,0F9H,0A4H,0B0H,99H,92HEnd.专业.整理.。
51单片机控制交通灯一、实现功能:1、先南北红灯亮,东西绿灯亮。
南北红灯亮维持25秒,在南北红灯亮的同时东西绿灯也亮,并维持20秒;到20秒时,东西绿灯闪亮,闪亮3秒后熄灭。
在东西绿灯熄灭时,东西黄灯亮,并维持2秒。
到2秒时,东西黄灯熄灭,东西红灯亮,同时,南北红灯熄灭,绿灯亮,东西红灯亮维持30秒。
南北绿灯亮维持25秒,然后闪亮3秒后熄灭。
同时南北黄灯亮,维持2秒后熄灭,这时南北红灯亮,东西绿灯亮。
周而复始。
2、用一个按键模拟急救车到达。
急救车到达路口时,四个方向的红灯全亮,10秒钟后恢复正常显示。
3、一辆急救车正在过路口时(即四个方向全红灯10秒倒计时未结束),又来了一辆急救车,重新从10秒开始倒计时。
4、急救车过去之后(即10秒倒计时结束),路灯状态要继续急救车到达之前的状态往下运行。
5、数码管显示绿灯变红灯、红灯变绿灯以及急救车10秒钟的倒计时。
6、急救车从路口过的时候,蜂鸣器响1s停1s的循环报警。
二、proteus仿真电路图注:此图仅作为仿真使用。
实际焊接电路时,由于单片机的驱动能力较弱,所以数码管的位选、LED的控制最好加上三极管进行电流放大,否则即使能实现功能,但是LED和数码管的发光的亮度也不强。
三、C语言程序程序#include <reg51.h>#define uchar unsigned char#define uint unsigned int#define duan P0#define wei P2code uchar tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf}; uchar buff[8] = {10,10,10,10,10,10,10,10};uchar weizhi = 0;uchar alarm = 0;uchar bk_TH1 = 0;uchar bk_TL1 = 0;uchar bk_cnt = 0;uchar bk_cnt_time = 0;uchar cnt_time = 0;uchar cnt = 0;uchar cnt_flash = 0;bit cnt_finish = 0;bit LED = 0;bit beef_flag = 1;sbit Er = P1^0; //东西—红灯sbit Eg = P1^1; //东西—绿灯sbit Ey = P1^2; //东西—黄灯sbit Sr = P1^3; //南北—红灯sbit Sg = P1^4; //南北—绿灯sbit Sy = P1^5; //南北—黄灯sbit beef = P1^6; //蜂鸣器void display(void);void main(void){uchar time = 0;TMOD |= 0x11;TH0 = (65536-2000)/256;TL0 = (65536-2000)%256;TH1 = (65536-50000)/256;TL1 = (65536-50000)%256;ET1 = 1;ET0 = 1;INT0 = 1;EX0 = 1;IP |= 0x02;EA = 1;TR0 = 1;TR1 = 1;Sr = 0;Sg = 0;Sy = 0;Er = 0;Eg = 0;Ey = 0;beef = 0;buff[0] = 11;buff[1] = 11;buff[2] = 11;buff[3] = 11;buff[4] = 11;buff[5] = 11;buff[6] = 10;buff[7] = 10;while(1){while((cnt<20)&&(alarm == 0)){Sr = 1;Sg = 0;Sy = 0;Er = 0;Eg = 1;Ey = 0;time = (25-cnt);buff[7] = time%10;buff[6] = time/10;}while((cnt<23)&&(alarm == 0)){Sr = 1;Sg = 0;Sy = 0;Er = 0;Eg = LED;Ey = 0;time = (25-cnt);buff[7] = time%10;buff[6] = time/10;}while((cnt<25)&&(alarm == 0)) {Sr = 1;Sg = 0;Sy = 0;Er = 0;Eg = 0;Ey = 1;time = (25-cnt);buff[7] = time%10;buff[6] = time/10;}while((cnt<50)&&(alarm == 0)) {Sr = 0;Sg = 1;Sy = 0;Er = 1;Eg = 0;Ey = 0;time = (55-cnt);buff[7] = time%10;buff[6] = time/10;}while((cnt<53)&&(alarm == 0)) {Sr = 0;Sg = LED;Sy = 0;Er = 1;Eg = 0;Ey = 0;time = (55-cnt);buff[7] = time%10;buff[6] = time/10;}while((cnt_finish != 1)&&(alarm == 0)){Sr = 0;Sg = 0;Sy = 1;Er = 1;Eg = 0;Ey = 0;time = (55-cnt);buff[7] = time%10;buff[6] = time/10;}cnt_finish = 0;while(alarm == 1){Er = 1;Eg = 0;Ey = 0;Sr = 1;Sg = 0;Sy = 0;time = (10-cnt);buff[7] = time%10;buff[6] = time/10;if(cnt == 10){TR1 = 0;TH1 = bk_TH1;TL1 = bk_TL1;cnt = bk_cnt;cnt_time = bk_cnt_time;TR1 = 1;alarm = 0;}beef = beef_flag;}beef = 0;}}void int0(void) interrupt 0{TR1 = 0;if(alarm == 0){bk_TH1 = TH1;bk_TL1 = TL1;bk_cnt = cnt;bk_cnt_time = cnt_time;}TH1 = (65536-50000)/256;TL1 = (65536-50000)%256;cnt = 0;cnt_time = 0;alarm = 1;TR1 = 1;}void timer0(void) interrupt 1 {TH0 = (65536-2000)/256;TL0 = (65536-2000)%256;display();}void timer1(void) interrupt 3 {TH1 = (65536-50000)/256;TL1 = (65536-50000)%256;if(++cnt_time == 20){cnt_time = 0;cnt++;beef_flag = ~beef_flag;}if(++cnt_flash == 4){cnt_flash = 0;LED = ~LED;}if(cnt == 55){cnt = 0;cnt_finish = 1;}}void display(void){duan = 0xff;wei = (1<<weizhi);duan = tab[buff[weizhi]];if(++weizhi == 8){weizhi = 0;}}。
实验1 跑马灯实验一、实验目的●初步学会Proteus ISIS和uVision2单片机集成开发环境的使用;●初步掌握采用汇编语言与C语言开发单片机系统的程序结构;●掌握80C51单片机通用I/O口的使用;●掌握单片机内部定时/计数器的使用及编程方法以及中断处理程序的编写方法。
二、实验设备及器件●硬件:PC机,HNIST-1型单片机实验系统●软件:Proteus ISIS单片机仿真环境,uVision2单片机集成开发环境三、实验内容●编写一段程序,采用P1口作为控制端口,使与P1口相接的四个发光二极管〔D1、D2、D3、D4〕按照一定的方式点亮。
如点亮方式为:先点亮D1,延时一段时间,再顺序点亮D2……D4,然后又是D4……D1,同时只能有一个灯亮;然后每隔一段时间一次使相邻两个灯亮,三个灯亮,四个灯亮,最后闪烁三次,接着循环变化。
●基于Proteus ISIS仿真环境完成上述功能的仿真。
●基于uVision2单片机集成开发环境与硬件平台完成程序的脱机运行。
四、实验原理图图3.1 跑马灯实验电路原理图电路原理图如上图3.1所示,AT89S52的P1.0~P1.3控制4个发光二极管,发光二极管按照一定次序发光,相邻发光二极管的发光时间间隔可以通过定时器控制,还可以通过软件延时实现。
五、软件流程图与参考程序●主程序流程图如下:●参考程序#include<reg52.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intuchar aa,num,speed,flag;uchar code table[]={0x0e,0x0d,0x0b,0x07};uchar code table1[]={0x0a,0x05,0x09,0x06};uchar codetable2[]={0x0c,0x09,0x03,0x08,0x01,0x0e,0x0c,0x08,0x00};void delay(uint z)//延时函数{uint x;uchar y;for(x=z;x>0;x--)for(y=200;y>0;y--);}void init()//条件初始化函数{ flag=0;speed=10;//控制跑马灯流水速度TMOD=0x01;//中断方式TH0=(65535-50000)/256;TL0=(65536-50000)%256;//初值EA=1;//翻开总中断ET0=1;//翻开外中断0TR0=1;}void main(){init();//调用初始化函数while(1){if(flag){delay(2000);//调用延时函数for(num=0;num<4;num++)//从左至右间隔一个依次闪烁{P1=table[num];delay(2000);}for(num=3;num>0;num--)//从左至右间隔一个依次闪烁{P1=table[num];delay(2000);}for(num=0;num<4;num++)//从左至右间隔两个依次闪烁{P1=table1[num];delay(2000);}for(num=3;num>0;num--)//从左至右间隔两个依次闪烁{P1=table1[num];delay(2000);}for(num=0;num<6;num++)//两个,三个,四个跑马灯依次闪烁{P1=table2[num];delay(2000);}for(num=0;num<5;num++)//闪烁5次{P1=0xff;//全暗delay(2000);P1=0X00;//全亮delay(2000);}speed=speed-3;//变速if(speed==4){speed=10;}}}}void timer0() interrupt 1//中断函数{TH0=(65535-50000)/256;TL0=(65536-50000)%256;aa++;if(aa==speed){aa=0;flag=1;}}六、实验思考题●请用汇编指令完本钱实验内容,深刻理解汇编语言程序设计结构。
这是我初学单片机,并用Proreus软件自己绘制自己编写程序实现的一个交通红绿灯的系统。
这是硬件连接图和程序,以便今后复习。
左上右下中控制部分,上面一个开关按下时,南北方向绿灯,东西方向红灯黄灯闪烁3秒绿灯设置15秒,红灯设置18秒。
绿灯走完15秒后黄灯闪烁3秒变为红灯,红灯走完18秒后变成绿灯,以此循环。
源程序:COUNT EQU30H;T0中断计数SNLEDDATA EQU31H;存储南北数码管显示的数据SNCOLORFLAG EQU32H;=1时南北绿灯亮,=2时南北黄灯亮,=3时南北红灯亮SNLEDDATAINIT EQU33H;存储南北各颜色灯的初始时间EWLEDDATA EQU34H;存储东西数码管显示的数据EWCOLORFLAG EQU35H;=1时东西红灯亮,=2时东西绿灯亮,=3时东西黄灯亮EWLEDDATAINIT EQU36H;存储东西各颜色灯的初始时间org0000hlJMP MAINorg0003hljmp exint0ORG000BHlJMP INTT0org0013hljmp exint1org0100h;主函数**************************************MAIN:CALL INITSTART:MOV A,COUNTCJNE A,#200,NOT1S;没到1秒跳转MOV COUNT,#00;1秒时间到DEC SNLEDDATAMOV A,SNLEDDATAJNZ checkewleddataMOV SNLEDDATA,SNLEDDATAINITINC SNCOLORFLAGMOV A,SNCOLORFLAGCJNE A,#04,checkewleddataMOV SNCOLORFLAG,#01checkewleddata:DEC EWLEDDATAMOV A,EWLEDDATAJNZ timenotoverMOV EWLEDDATA,EWLEDDATAINITINC EWCOLORFLAGMOV A,EWCOLORFLAGCJNE A,#04,timenotoverMOV EWCOLORFLAG,#01TIMENOTOVER:NOT1S:call ewcolorcheckCALL snCOLORCHECKCALL DISPLAYJMP START;*********************************************;初始化函数***********************************INIT:MOV SP,#60HMOV TMOD,#01HMOV TH0,#0eCHMOV TL0,#078HMOV COUNT,#00HMOV SNLEDDATAINIT,#15MOV EWLEDDATAINIT,#18MOV SNLEDDATA,SNLEDDATAINITMOV EWLEDDATA,EWLEDDATAINITSETB TR0;开定时器0SETB ET0;允许定时器0中断setb ex0;允许外部0中断setb ex1;允许外部1中断setb it0;外部中断0下降沿触发setb it1;外部中断1下降沿触发SETB EA;开总中断MOV P2,#0feHMOV SNCOLORFLAG,#01RET;*****************************************;外部中断0*********************************** exint0:push accpush pswmov a,p0push accmov a,p1push accmov a,p2push accclr ex1clr p2.0clr p2.1clr p2.2clr p2.3setb p1.4clr p1.1clr p1.2setb p1.5clr p1.3clr p1.4jnb p3.2,$setb ex1pop accmov p2,apop accmov p1,apop accmov p0,apop pswpop acc;外部中断1*********************************** exint1:push accpush pswmov a,p0push accmov a,p1push accmov a,p2push accclr ex0clr p2.0clr p2.1clr p2.2clr p2.3setb p1.4setb p1.2clr p1.1clr p1.0setb p1.3clr p1.5clr p1.4jnb p3.3,$setb ex0pop accmov p2,apop accmov p1,apop accmov p0,apop pswpop acc;T0中断函数*******************************INTT0:PUSH ACCPUSH PSWMOV TH0,#0ecH;#0echMOV TL0,#078H;#078hMOV A,P2RL ACJNE A,#11101111B,NOT5MOV A,#0feH;p2.0=0,南北数码管十位亮,p2.1=0,南北数码管个位亮NOT5:MOV P2,A;p2.2=0,东西数码管十位亮,p2.3=0,东西数码管个位亮INC COUNTPOP PSWPOP ACCRETI;****************************************;南北红绿黄灯控制**************************snCOLORCHECK:PUSH ACCPUSH BPUSH PSWsngreen:MOV A,SNCOLORFLAGCJNE A,#01,snYELLOWMOV SNLEDDATAINIT,#03;设置南北黄灯闪烁时间CLR P1.2CLR P1.1SETB P1.0;南北绿灯亮JMP snCOLORCHECKOUTsnYELLOW:;MOV A,SNCOLORFLAGCJNE A,#02,snredMOV SNLEDDATAINIT,#18;设置南北红灯亮时间MOV A,COUNTDIV ABMOV A,BCJNE A,#00H,snNOTFLASHCPL P1.1;南北黄灯闪烁CLR P1.0CLR P1.2snNOTFLASH:JMP snCOLORCHECKOUTsnred:MOV SNLEDDATAINIT,#15;设置南北绿灯亮时间CLR P1.0CLR P1.1SETB P1.2;南北红灯亮snCOLORCHECKOUT:POP PSWPOP BPOP ACCRET;******************************************************;东西红绿黄灯控制**************************************ewCOLORCHECK:PUSH ACCPUSH BPUSH PSWewred:MOV A,ewCOLORFLAGCJNE A,#01,ewyellowMOV ewLEDDATAINIT,#15;设置东西绿灯亮时间CLR P1.3CLR P1.4SETB P1.5;东西红灯亮JMP ewCOLORCHECKOUT;MOV A,ewCOLORFLAGCJNE A,#03,ewgreenMOV ewLEDDATAINIT,#18;设置东西红灯亮时间MOV A,COUNTMOV B,#100DIV ABMOV A,BCJNE A,#00H,ewNOTFLASHCPL P1.4;东西黄灯闪烁CLR P1.3CLR P1.5ewNOTFLASH:JMP ewCOLORCHECKOUTewgreen:MOV ewLEDDATAINIT,#03;设置东西黄灯闪烁时间CLR P1.4CLR P1.5SETB P1.3;东西绿灯亮ewCOLORCHECKOUT:POP PSWPOP BPOP ACCRET;************************************************************;数码管显示**************************************************DISPLAY:PUSH ACCPUSH PSWPUSH BMOV A,SNLEDDATAMOV B,#10DIV ABMOV A,EWLEDDATAMOV B,#10DIV ABMOV R2,BMOV R3,AMOV DPTR,#TABLEMOV A,P2 DISPSNH:CJNE A,#0feH,DISPSNLMOV A,R1MOVC A,@A+DPTRMOV P0,AJMP DISPOUT DISPSNL:CJNE A,#0fdH,DISPEWHMOV A,R0MOVC A,@A+DPTRMOV P0,AJMP DISPOUT DISPEWH:CJNE A,#0fbH,DISPEWLMOV A,R3MOVC A,@A+DPTRMOV P0,AJMP DISPOUT DISPEWL:CJNE A,#0f7H,DISPOUTMOV A,R2MOVC A,@A+DPTRMOV P0,A DISPOUT:POP BRET;************************************************** TABLE:DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH;0123456789END。
电子与信息工程学院课程设计报告(2010—2011学年第2 学期)课程名称:单片机课程设计班级:学号:姓名:指导教师:2011年03月3.过程(如实际程序开发、电子制作,详细说明有关原理、开发过程、调试过程、结果)一.交通灯芯片介绍SST89E58RD:是8位FLASH FLEX51系列单片机。
FLASH FLEX51是在高级FLASH CMOS半导体工艺下设计和生产出来的单片机产品之一。
单片机有40K片内FLASH EEPROM程序存储器,它利用SST的超级FLASH专利技术,这些都是SST的领先技术。
超级FLASH存储器被分为两个独立的程序存储器块,基本FLASH Block0占用32K字节片内程序存储空间,二级FLASH Block1占用8K字节的片内程序存储器空间;8K字节的二级FLASH块能被映射到32K字节低地址空间它也能从程序计数器中被隐藏掉而用做一个独立的类似EEPROM的数据存储器。
其具有以下特点:兼容80C51系列,内置超级FLASH存储器的单片机;工作电压Vdd=4.5~5.5;1K*8的内部RAM(256Bytes+768Bytes,可以放心使用C语言编程)等。
8155:Intel8155是可编程RAM/IO芯片,为40脚双列直插式封装。
有256*8位静态RAM,2个8位和1个6位可编程并行I/O接口,以及1个14位可编程定时器/计数器。
可直与MCS-51单片机相接,是MCS-51单片机应用系统中应用最多的芯片之一其内部结构图和引脚图如图1所示图1在交通灯系统中,四位数码管是用来显示交通灯倒计时时间的,一路显示放行线时间,一路显示禁止线时间四位数码管的电路如图2:图2四位八段数码管,属共阴逆序,高电平有效,所以不带小数点的0-f的段码如下:{0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E0H,0FEH,0F6H,0EEH,3EH,9CH,7AH,9EH,8EH};PROTEUS 仿真图如图3:图3四位数码管的显示使用了并行扩展芯片8155,8155与单片机SST89E58RD的接口如图4图48155的高8位数据地址线与单片机的P0口相连,CE与AD15相连,IO/M与AD8相连数码管的八位段选与PB口相连,四位位选与PA口相连。
摘要随着经济发展,汽车数量急剧增加,城市道路日渐拥挤,交通拥塞已成为一个国际性的问题。
因此,设计可靠、安全、便捷的多功能交通灯控制系统有极大的现实必要性。
根据交通灯在实际控制中的特点,结合单片机的控制功能,提出了一种用单片机自动控制交通灯的简易方法。
设计中包括硬件电路的设计和程序设计两大步骤,对单片机学习中的几个重要内容都有涉足。
单片机的应用正在不断深入,单片机可以用来仿真各个系统。
在自动控制的单片机应用系统中,单片机往往作为一个核心部件来使用,仅单片机方面知识是不够的,还应根据具体硬件结构软硬件结合,加以完善。
十字路口车辆穿梭,行人熙攘,车行车道,人行人道,有条不紊。
那么靠什么来实现这井然秩序呢?靠的就是交通信号灯的自动指挥系统。
交通信号灯控制方式很多。
本系统采用单片机STC89C52为中心器件来设计交通灯控制器,实现了通过P1口设置红、绿灯燃亮时间的功能;红绿灯循环点亮,倒计时剩5秒时黄灯闪烁警示(交通灯信号通过P1口输出,显示时间通过P0口输出至双位数码管)。
本系统设计周期短、可靠性高、实用性强、操作简单、维护方便、扩展功能强。
关键词:单片机交通灯数码管Microcontroller to control traffic lights Abstract: With economic development, a sharp increase in the number of cars, increasingly crowded city roads, traffic congestion has become an international problem. Therefore, the design of reliable, safe, convenient and versatile traffic light control system of great practical necessity.According to the characteristics of the traffic lights in the actual control, combined with the microcontroller control functions, and easy with Auto Control traffic lights. The design includes two steps of the hardware circuit design and programming have to get involved in several important single-chip learning.The application of microcontroller is the deepening of the Microcontroller can be used to simulate systems. In the automatic control of microcomputer application system, the Microcontroller is often used as a core component to use only Microcontroller knowledge is not enough, but also according to the specific hardware architecture hardware and software, to be improved.Crossroads shuttle vehicles, pedestrians bustling Dealers lane, walkways, and orderly. Rely on to achieve this orderly order? Rely on automatic command system of traffic lights. Traffic signal control. The system uses the Microcontroller STC89C52-centric devices to design the traffic signal controller to achieve a set of red, green light to kindle through the P1 port function of time; traffic light cycle lights, countdown 5 seconds left flashing yellow warning (traffic light signals through the P1 the output port, and displays the time through the P0 port output to double-digit LED). The system design cycle, high reliability, practical, simple operation, easy maintenance, strong extensions.Key words:microcontroller traffic light digital tub目录第1章前言 (1)1.1交通灯发展概述 (1)1.2 课题背景及意义 (2)1.3课题任务及主要实现内容 (3)1.4 原理分析 (4)1.4.1交通灯显示时序的理论分析 (4)1.4.2 交通灯显示的理论分析 (5)第2章设计方案分析 (6)2.1 单片机与外围接口部件 (6)2.2 倒计时显示界面 (7)2.3 交通灯 (7)第3章硬件系统设计 (8)3.1 单片机的选择 (8)3.2 硬件电路实现 (11)3.2.1 最小系统设计 (11)3.2.2 显示设计 (13)3.2.3 发光二极管模拟红绿灯 (15)3.2.4 按键模块 (16)第4章软件电路设计 (17)4.1 软件编译环境测试 (17)4.1.1 C语言介绍 (17)4.1.2 Keil uVision4介绍 (17)4.2软件总体设计 (17)第5章电路检测 (21)结论 (24)致谢 (25)参考文献 (26)附录: (27)源程序: (29)第1章前言单片机微型计算机是微型计算机的一个重要分支,也是颇具生命力的机种。
交通灯程序/*********************************************************** 十字路口交通灯控制 C 程序***********************************************************/#include <reg51.h>#define uchar unsigned char#define uint unsigned int/*****定义控制位*******************************************/sbit Time_Show_LED2=P2^5; //Time_Show_LED2(直行时间显示)控制位sbit Time_Show_LED1=P2^4; //Time_Show_LED1(直行时间显示)控制位sbit EW_LED2=P2^3; //EW_LED2控制位sbit EW_LED1=P2^2; //EW_LED1控制位sbit SN_LED2=P2^1; //SN_LED2控制位sbit SN_LED1=P2^0; //SN_LED1控制位sbit SN_Yellow=P1^6; //SN黄灯sbit EW_Yellow=P1^2; //EW黄灯sbit EW_ManGreen=P3^0; //EW人行道绿灯sbit SN_ManGreen=P3^1; //SN人行道绿灯sbit Special_LED=P2^6; //交通特殊指示灯sbit Busy_LED=P2^7; //交通繁忙指示灯sbit Nomor_Button=P3^5; //交通正常按键sbit Busy_Btton=P3^6; //交通繁忙按键sbit Special_Btton=P3^7; //交通特殊按键sbit EW_ManRed=P3^3; //EW人行道红灯sbit SN_ManRed=P3^4; //SN人行道红灯bit Flag_SN_Yellow; //SN黄灯标志位bit Flag_EW_Yellow; //EW黄灯标志位char Time_EW; //东西方向倒计时单元char Time_SN; //南北方向倒计时单元uchar EW=60,SN=40,EWL=19,SNL=19; //程序初始化赋值,正常模式uchar EW1=60,SN1=40,EWL1=19,SNL1=19; //用于存放修改值的变量uchar codetable[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; //0-9段选码uchar code S[8]={0x28,0x48,0x18,0x48,0x82,0x84,0x81,0x84};//交通信号灯控制代码/**********************延时子程序**************************/void Delay(uchar a){uchar i;i=a;while(i--){;}}/*****************显示子函数******************************/ void Display(void){uchar h,l;h=Time_EW/10;l=Time_EW%10;P0=table[l];EW_LED2=1; //点亮EW_LED2Delay(2);EW_LED2=0; //熄灭EW_LED2P0=table[h];EW_LED1=1; //点亮EW_LED1Delay(2);EW_LED1=0;h=Time_SN/10;l=Time_SN%10;P0=table[l];SN_LED2=1; //点亮SN_LED2Delay(2);SN_LED2=0;P0=table[h];SN_LED1=1; //点亮SN_LED1Delay(2);SN_LED1=0;h= EW1/10;l= EW1%10;P0=table[l];Time_Show_LED1=1; //点亮Time_Show_LED1Delay(2);Time_Show_LED1=0;P0=table[h];Time_Show_LED2=1; //点亮Time_Show_LED2Delay(2);Time_Show_LED2=0;}/**********************外部0中断服务程序******************/void INT0_srv(void)interrupt 0 using 1{EX0=0; //关中断if(Nomor_Button==0) //测试按键是否按下,按下为正常状态 {EW1=60;SN1=40;EWL1=19;SNL1=19;Busy_LED=0; //关繁忙信号灯Special_LED =0; //关特殊信号灯}if(Busy_Btton==0) //测试按键是否按下,按下为繁忙状态 {EW1=45;SN1=30;EWL1=14;SNL1=14;Special_LED=0; //关特殊信号灯Busy_LED=1; //开繁忙信号灯}if(Special_Btton==0)//测试按键是否按下,按下为特殊状态 {EW1=75;SN1=55;EWL1=19;SNL1=19;Busy_LED=0; //关繁忙信号灯Special_LED =1;//开特殊信号灯}EX0=1; //开中断}/**********************T0中断服务程序*******************/ void timer0(void)interrupt 1 using 1{static uchar count;TH0=(65536-50000)/256;TL0=(65536-50000)%256;count++;if(count==10){if(Flag_SN_Yellow==1) //测试南北黄灯标志位{SN_Yellow=~SN_Yellow;}if(Flag_EW_Yellow==1) //测试东西黄灯标志位{EW_Yellow=~EW_Yellow;}}if(count==20){Time_EW--;Time_SN--;if(Flag_SN_Yellow==1) //测试南北黄灯标志位{SN_Yellow=~SN_Yellow;}if(Flag_EW_Yellow==1) //测试东西黄灯标志位{EW_Yellow=~EW_Yellow;}count=0;}}/*********************主程序开始***********************/ void main(void){Busy_LED=0;Special_LED=0;IT0=1; //INT0负跳变触发TMOD=0x01; //定时器工作于方式1TH0=(65536-50000)/256; //定时器赋初值TL0=(65536-50000)%256;EA=1; //CPU开中断总允许ET0=1; //开定时中断EX0=1; //开外部INTO中断TR0=1; //启动定时while(1){/*******S0状态**********/SN_ManRed=0;SN_ManGreen=1; //SN人行道通行EW_ManRed=1; //EW人行道禁止EW_ManGreen=0;Flag_EW_Yellow=0; //EW关黄灯显示信号Time_EW=EW;Time_SN=SN;while(Time_SN>=5){P1=S[0]; //SN绿灯,EW红灯Display();}/*******S1状态**********/P1=0x00;while(Time_SN>=0){Flag_SN_Yellow=1; //SN开黄灯信号位P1=P1|0x08; //保持EW红灯Display();}/*******S2状态**********/SN_ManRed=1; //SN人行道禁止SN_ManGreen=0;EW_ManRed=1; //EW人行道禁止EW_ManGreen=0;Flag_SN_Yellow=0; //SN关黄灯显示信号Time_SN=SNL;while(Time_SN>=5){P1=S[2]; //SN左拐绿灯亮,EW红灯Display();}/*******S3状态**********/P1=0x00;while(Time_SN>=0){Flag_SN_Yellow=1; //SN开黄灯信号位P1=P1|0x08; //保持EW红灯Display();}/***********赋值*********/EW=EW1;SN=SN1;EWL=EWL1;SNL=SNL1;/*******S4状态**********/SN_ManRed=1; //SN人行道禁止SN_ManGreen=0;EW_ManRed=0;EW_ManGreen=1; //EW人行道通行Flag_SN_Yellow=0; //SN关黄灯显示信号Time_EW=SN;Time_SN=EW;while(Time_EW>=5){P1=S[4]; //EW通行,SN红灯Display();}/*******S5状态**********/P1=0X00;while(Time_EW>=0){Flag_EW_Yellow=1;//EW开黄灯信号位P1=P1|0x80; //保持SN红灯Display();}/*******S6状态**********/SN_ManRed=1; //SN人行道禁止SN_ManGreen=0;EW_ManRed=1; //EW人行道禁止EW_ManGreen=0;Flag_EW_Yellow=0;//EW关黄灯显示信号Time_EW=EWL;while(Time_EW>=5){P1=S[6]; //EW左拐绿灯亮,SN红灯Display();}/*******S7状态**********/P1=0X00;while(Time_EW>=0){Flag_EW_Yellow=1; //EN开黄灯信号位P1=P1|0x80; //保持SN红灯Display();}/***********赋值********/EW=EW1;SN=SN1;EWL=EWL1;SNL=SNL1;}}。