C51代码 交通灯 Proteus原理图
- 格式:docx
- 大小:136.92 KB
- 文档页数:15
protues仿真单片机模拟交通灯部门: xxx时间: xxx制作人:xxx整理范文,仅供参考,可下载自行修改主电路图<图一)Static Display子图<图二)仿真效果<图三)仿真效果<图四)仿真效果<图五)仿真效果<图六)汇编语言程序:SECOND1 EQU 30HSECOND2 EQU 31HDBUF EQU 40HTEMP EQU 44HLED_G1 BIT P2.1 。
东西路口绿灯LED_Y1 BIT P2.2 。
东西路口黄灯LED_R1 BIT P2.3 。
东西路口红灯LED_G2 BIT P2.4 。
南北路口绿灯LED_Y2 BIT P2.5 。
南北路口黄灯LED_R2 BIT P2.6 。
南北路口红灯ORG 0000HLJMP STARTORG 0100HSTART: MOV TMOD,#01H 。
置T0为工作方式1MOV TH0,#3CH 。
置T0定时初值50msMOV TL0,#0B0HCLR TF0SETB TR0 。
启动T0CLR AMOV P1,A 。
关闭不相关地LED。
***************************************************b5E2RGbC APLOOP: M OV R2,#20 。
置1s计数初值,50ms*20=1sMOV R3,#20 。
红灯亮20sMOV SECOND1,#25 。
东西路口计时显示初值25sMOV SECOND2,#25 。
南北路口计时显示初值25sLCALL D ISPLAYLCALL S TATE1 。
调用状态1WAIT1: JNB TF0,WAIT1 。
查询50ms到否CLR TF0MOV TH0,#3CH 。
恢复T0定时初值50msMOV TL0,#0B0HDJNZ R2,WAIT1 。
判断1s到否?未到继续状态1MOV R2,#20 。
置50ms计数初值DEC SECOND1 。
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;}}。
这是我初学单片机,并用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。
摘要本系统由单片机系统、键盘、LED 显示、交通灯演示系统组成。
系统包括人行道、左转、右转、以及基本的交通灯的功能。
系统除基本交通灯功能外,还具有倒计时、时间设置、紧急情况处理、分时段调整信号灯的点亮时间、违规车辆检测以及根据具体情况手动控制等功能。
关键词:AT89S51,交通规则,LEDAbstractThis system is made up of single-chip microcomputer , keyboard ,led displaying module and Traffic lights system .The system includes pavement ,left turning ,right turning ,and the basic traffic lights function .Excepting the basic traffic lights function ,it also includes counting ,time installing , emergency disposing ,speech cluing, LCD information displaying ,adjusting the lighting time of lights based on different time and controlling with hand in accordance with circumstances and so on.Key Words: AT89S51 , Traffic regular,LED .目录第一章序言……………………………………………………………………∙∙∙∙∙∙∙∙∙∙∙41.1 交通灯的形成……………………………………………………………………………∙∙∙41.2芯片简介……………………………………………………………………………………∙51.3论文研究内容与章节安排…………………………………………………………………∙6 第二章方案比较、设计与论证………………………………………………………∙∙72.1电源提供案……………………………………………………………………………∙∙∙∙∙∙∙∙∙72.2 显示界面方案……………………………………………………………………………∙∙∙72.3 输入方案…………………………………………………………………………………∙∙∙8 第三章理论分析与计算………………………………………………………∙∙∙……∙∙∙93.1交通灯显示时序的理论分析与计算∙ (9)3.2交通灯显示时间的理论分析与计算……………………………………………………∙∙∙∙12 第四章电路图及设计文件……………………………………………………∙∙∙……∙∙134.1 灯控制电路设计…………………………………………………………………………∙∙∙134.2倒计时显示电路设计………………………………………………………………………∙134.3违规车辆检测电路设计…………………………………………………………………∙∙∙∙15 第五章程序设计思路与流程图………………………………………………………∙∙175.1主程序流程图……………………………………………………………………………∙∙∙∙175.2.按键子程序流程图………………………………………………………………………∙∙20 第六章测试、数据及结果分析………………………………………………∙∙……∙∙246.1状态灯显示测试……………………………………………………………………………∙246.2数码管的测试……………………………………………………………………………∙∙∙∙246.3整体电路测试.......................................................................................∙∙24 总结.........................................................................................................∙∙∙ (25)附录:......................................................................................................∙∙ (26)第一章序言1.1 交通灯的形成当今,红绿灯安装在各个道口上,已经成为疏导交通车辆最常见和最有效的手段。
我编写了一个:P1.0—P1.2分别为南北方向的红,黄,绿灯;P1.3——P1.5为东西方向的红,黄,绿灯;共阴极数码管的a,b,c,d,e,f,g,dp分别接P0.0-P0.7;数码管V0-V2分别接P2.0——P2.2(V0为百位,V1为10位,V2为个位);南北为主干道,能行时间180秒,黄灯亮3秒,东西为乡村道,通行时间为60秒,黄灯亮3秒;采用T0为中断源,扫描显示数码管,T1为定时器,每次定时0.5秒,两次计数1秒。
打字难打,我在实验板上试过,但不知是不是你想要的。
#include<reg52.h>#define uint unsigned int#define uchar unsigned char#define led P0 //数码管7段显示由P0控制uchar count, times#define sec times%10 //个位#define tse time/10%10 //十位#define hse times/100 //百位bit n_s, w_e; //南北,东西sbit n_red=P1^0; //南北红灯sbit n_ylw=P1^1; //南北黄灯sbit n_grn=P1^2; //南北绿灯sbit w_red=P1^3; //东西红灯sbit w_ylw=P1^4; //....sbit w_grn=P1^5; //....uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //数码管显示码存表/*中断函数,供数码管显示用*/T0_srv() interrupt 1 using 1{TH0=-(5000/256);TL0=-(5000%256);led=0xff;P2=((0xfe<<count)|(0xfe>>(8-count)));count++;if(count==3) count=0;if((P2|0xf0)==0xfe){led=table[hse];}else{if((P2|0xf0)==0xfd{led=table[tse];}else{led=table[sec];}}/*延时函数(延时i秒)*/void delay(uint i){uint j,k;TR1=1;for(j=i*2;j>0;j--){for(k=10;k>0;k--){TH1=0x3c; //TH与TL写入初值,0.05秒Tl1=0xb0;while(TF1==0);TF1=0;}if((j<7)&&(n_s==1)) //n_s为南北通行标致n_grn=~n_grn; //n_s最后3秒,绿灯闪烁if((j<7)&&(w_e==1)) //w_e为东西通行标致w_grn=~w_grn; //w_e最后3秒,绿灯闪烁if(j%2==0) times--; /*计时2次0.5秒,time减1*/ }TR1=0; //停止计时}void north_south() //南北通行函数{n_s=1;times=180; //通行180秒P1=0xf3; //南北亮绿灯,东西亮红灯delay(180);n_s=0;}void nor_yellow() //南北黄灯函数{times=3; //黄灯亮3秒P1=0xf5;delay(3);}void west_east() //东西通行函数{w_e=1;times=60; //通行60秒P1=0xde; //东西绿灯,南北红红灯delay(60);w_e=0;}void wst_yellow() //东西黄灯函数{times=3;P1=0xee; //东西黄灯,南北红灯delay(3);}void main(void){TMOD=0x11; //T0与T1工作在方式1TH0=-(5000/256); //T0装入初值TL0=-(5000%256);IE=0x82; //允许T0中断TR0=1; //开能T0P2=0xfe; //数码管扫描初值(从百位开始)count=0; //计数初值为0while(1) //无限循环{north_south(); //调用南北通行函数nor_yellow(); //调用南北黄灯函数west_east(); //调用东西通行函数wst_yellow(); //调用东西黄灯函数}}。
任务一延时实现交通灯控制一、制作展示1、要想控制好LED不简单2、单片机控制作用很强大二、交通灯展示三、训练目的1、进一步熟悉应用仿真软件调试2、进一步熟悉汇编语言程序设计方法3、进一步掌握对P1口各位的控制4、学习模拟交通灯控制的实现方法四、训练内容用单片机P1做输出口,控制十二个发光二极管燃灭,模拟交通灯管理。
五、交通灯规律六、简易交通灯设计单片机P1.0、P1.1口控制2组灯,一组亮的时候另一组不亮ORG 0000H SJMP L1 ORG 0100H L1: SETB P1.0 CLR P1.1LCALL DELAY CLR P1.0 SETB P1.1LCALL DELAY SJMP L1 DELAY: … … … … 七、交通灯设计11、实验步骤设定P1.0控制东西方向“绿灯”,P1.1控制东西方向“黄灯”,P1.2控制东西方向“红灯”,P1.3控制南北方向“绿灯”,P1.4控制南北方向“黄灯”,P1.5控制南北方向“红灯”。
主程序执行对P1口各使用位的控制,并调用相应的延时子程序实现。
2、程序框图:3、实验步骤设定P1.0控制东西方向“绿灯”,P1.1控制东西方向“黄灯”,P1.2控制东西方向“红灯”,P1.3控制南北方向“绿灯”,P1.4控制南北方向“黄灯”,P1.5控制南北方向“红灯”。
主程序执行对P1口各使用位的控制,并调用相应的延时子程序实现。
4、程序清单:ORG 0000HLJMP MAINORG 0030H MAIN: MOV SP,#70H LOOP: SETB P1.1SETB P1.2CLR P1.0SETB P1.3SETB P1.4CLR P1.5ACALL DEL90SACALL YELL1ACALL DEL2SSETB P1.0SETB P1.1CLR P1.2SETB P1.4SETB P1.5CLR P1.3ACALL DEL90SACALL YELL2ACALL DEL2SSJMP LOOP YELL1: SETB P1.0SETB P1.2CLR P1.1SETB P1.3SETB P1.4CLR P1.5RETYELL2: SETB P1.0SETB P1.1CLR P1.2SETB P1.3SETB P1.5CLR P1.4RETDEL2S: MOV R5,#10HF3: MOV R6,#0FFHF2: MOV R7,#0E1HF1: DJNZ R7,F1DJNZ R6,F2DJNZ R5,F3RETDEL90S: MOV R5,#03HF6: MOV R6,#0F0HF5: MOV R7,#0F0HF4: MOV R0,#0F0HDJNZ R0,$DJNZ R7,F4DJNZ R6,F5DJNZ R5,F6RETEND5、扩展同时满足以下条件:1、全亮,检测有无坏灯;2、先东西红灯亮,南北绿灯亮;3、灯亮暗程序都改成子程序。
52单片机简易交通灯proteus仿真设计原理交通灯作为日常生活中必不可少的交通标志,它的设计是单片机初学者必不可少要接受的一项课题,下面简单介绍用proteus 仿真一个由52单片机控制的简易交通灯。
本设计主要要求以下几个方面:一是根据系统控制要求设计硬件电路,这里是用PROTEU S件来完成;二是根据硬件电路编写相应的程序流程图然后编写相关程序,这里程序的编制主要是用KeilC51软件来完成;三是在KEIL上用已经编好的程序生成.hex 文件载入到PROTEU中,实现PROTEU与 KEIL的联调,完成调试和仿真,观察调试结果是否满足设计要求,。
一:设计方案及重点:首先南北方向红灯、东西方向绿灯亮,南北方向红灯35秒、东西方向绿灯35秒,相应的数码管显示对应的数字并读秒,同时南北方向红色的交通灯和东西方向的绿色交通灯接通点亮显示,当东西方向的绿灯时间到,则东西方向的绿灯转为黄灯,同时数码管显示黄灯的时间3秒,东西方向的黄色二极管接通点亮,此时南北方向的红灯不变。
南北方向的红灯和东西方向的黄灯时间同时到,此时南北方向的红灯跳转为绿灯,时间同北方向的绿灯时间到,南北绿灯跳转为黄灯,东西方向的红灯不变,当南北方向的黄灯和东西方向的红灯时间到,南北方向的黄灯跳转为红灯,东西方向的红灯跳转为绿灯。
设计重点:1. 数码显示管的计时2. 数码管控制交通灯的转换3. 锁存器与位选器端口的选择4. 电路连接与程序编写二:仿真器件的介绍:1. 单片机芯片:AT89C52, AT89C52是一个低电压,高性能CMOS 8位单片机,AT89C52单片机在电子行业中有着广泛的应用。
2. 数码管:7SEG-MPX2-CC这是一个两位数共阴极的数码管,1就是左边数码管的阴极2就是右边数码管的阴极,a,b,c,d,e,f,g, 就是数码管的段码,dp就是数码管的小数点八、、3. 锁存器与位选器:74HC573具体作用:74HC573锁存器在数码管显示时作用的确是为了节省IO 口,单片机P0 口先发送abcdefghp段选信号,这时使用一个74HC573将段选信号保存住,单片机P0 口再发送位选信号,此时单片机 P0 口信号不影响被锁存住的段选信号。
吉首大学单片机交通灯设计原理图局部放大程序代码#include<reg51.H>#define uchar unsigned char#define uint unsigned intuchar code table[]={ //共阴极数码管码表0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0xC9,0xFF,0x40};//设置码,测试码,不计时码void delay(uint x);//延时函数void display(uchar,uchar,uchar,uchar); //数码管显示函数void mkeys(); //键盘函数void traffic(); //交通灯函数uchar num,num1,num2, //1南北 2东西shi1,ge1,shi2,ge2,value1,value2,//南北绿灯时间黄灯时间value3,value4,//东西绿灯时间黄灯时间count1,count2,flag1,flag2; //南北标记东西标记void main(){TMOD=0x01;TH0=(65536-45872)/256;TL0=(65536-45872)%256;EA=1;ET0=1;TR0=1;/*初状态*/value1=15; //南北黄绿灯默认值value2=5;value3=10; //东西黄绿灯默认值value4=5;num1=value1; //南北数码管先绿灯时间num2=value2+value1;//东西红灯时间shi1=num1/10;ge1=num1%10;shi2=num2/10;ge2=num2%10;P1=0x41;//初始状态:东西红灯南北绿灯 20 15while(1){if(num==20) //定时器1s{num=0;num1--;num2--;traffic();shi1=num1/10;ge1=num1%10;shi2=num2/10;ge2=num2%10;}mkeys();display(shi1,ge1,shi2,ge2);}}void traffic() //红绿灯主控制程序{if(num1==0){count1++;if(count1==1){P1=0x42;//东西红灯南北黄灯 5 5num1=value2;}if(count1==2){num1=value3+value4;//东西绿灯南北红灯10 15P1=0x14;}if(count1==3){P1=0x41;// 东西黄灯南北红灯 5 5num1=value4;count1=0;}}if(num2==0){count2++;if(count2==1){//P1=0x14;//东西绿灯南北红灯num2=value3;}if(count2==2){P1=0x24;//东西黄灯南北红灯num2=value4;}if(count2==3){num2=value1+value2; //东西红灯南北绿灯num1=value1;count2=0;}}}void display(uchar shi1,uchar ge1,uchar shi2,uchar ge2) //数码管显示子函数{uchar temp;temp=P2;P2=0xfe;P0=table[shi1];delay(5);P2=0xfd;P0=table[ge1];delay(5);P2=0xfb;P0=table[shi2];delay(5);P2=0xf7;P0=table[ge2];delay(5);}void delay(uint x)//延时子函数{uint i,j;for(i=x;i>0;i--)for(j=110;j>0;j--);}void mkeys() //4*4矩阵键盘功能子函数{uchar temp,key;P3=0xfe;//第一行线temp=P3;temp=temp&0xf0;if(temp!=0xf0){delay(10);temp=P3;temp=temp&0xf0;if(temp!=0xf0){temp=P3;switch(temp){case 0xee:key=0;break;case 0xde:key=1;break;case 0xbe:key=2;break;case 0x7e:key=3;break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}if(key==0) {//按键1:暂停TR0=~TR0; //定时器取反flag1=~flag1;//南北能够设置标志 0有效flag2=~flag2;//东西能够设置标志}if(key==1&&flag1==0){ //按键2:设置时间按钮TR0=0;P1=0x44;//禁止东南西北车辆全为红灯可以设置shi1=ge1=shi2=ge2=16;}if(key==2&&flag2==0){//按键3:设置完成重启TR0=1;num=0; //定时器初始化P1=0x41; //重新开始初状态num1=value1; //南北数码管先绿灯时间num2=value2+value1;//东西红灯时间shi1=num1/10;ge1=num1%10;shi2=num2/10;ge2=num2%10;}if(key==3&&P1==0x44){ //按键4:测试交通灯各个设备的好坏P1=0xff;delay(1000);P1=~P1;shi1=ge1=shi2=ge2=17;P1=0x44;}}}P3=0xfd;//第二行线temp=P3;temp=temp&0xf0;if(temp!=0xf0){delay(10);temp=P3;temp=temp&0xf0;if(temp!=0xf0){temp=P3;switch(temp){case 0xed:key=0;break;case 0xdd:key=1;break;case 0xbd:key=2;break;case 0x7d:key=3;break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}if(key==0&&P1==0x44){ //按键5:设置南北绿灯时间+num1=value1;if(num2!=159){ //@@@@保证交通合理,红灯最大值计时159s,绿灯不再增加num1++;value1=num1;}shi1=num1/10;ge1=num1%10;num2=value1+value2;//显示东西红灯时间shi2=num2/10;ge2=num2%10;}if(key==1&&P1==0x44){ //按键6:设置南北黄灯时间+num1=value2;if(num2!=159){num1++;value2=num1;}shi1=num1/10;ge1=num1%10;num2=value1+value2;//显示东西红灯时间shi2=num2/10;ge2=num2%10;}if(key==2&&P1==0x44&&value1>3){ //按键7:设置南北绿灯时间- @@@@保证交通合理,绿灯最小值计时3s,绿灯不再减少num1=value1;num1--;value1=num1;shi1=num1/10;ge1=num1%10;num2=value1+value2;//显示东西红灯时间shi2=num2/10;ge2=num2%10;}if(key==3&&P1==0x44&&value2>3){ //按键8:设置南北黄灯时间-num1=value2;num1--;value2=num1;shi1=num1/10;ge1=num1%10;num2=value1+value2;//显示东西红灯时间shi2=num2/10;ge2=num2%10;}}}////||||||||||||||||||P3=0xfb;//第三行线temp=P3;temp=temp&0xf0;if(temp!=0xf0){delay(10);temp=P3;temp=temp&0xf0;if(temp!=0xf0){temp=P3;switch(temp){case 0xeb:key=0;break;case 0xdb:key=1;break;case 0xbb:key=2;break;case 0x7b:key=3;break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}if(key==0&&P1==0x44){ //按键9:设置东西绿灯时间+num2=value3;if(num1!=159){num2++;value3=num2;}shi2=num2/10;ge2=num2%10;num1=value3+value4;//显示南北红灯时间shi1=num1/10;ge1=num1%10;}if(key==1&&P1==0x44){ //按键10:设置东西黄灯时间+ num2=value4;if(num1!=159){num2++;value4=num2;}shi2=num2/10;ge2=num2%10;num1=value3+value4;//显示南北红灯时间shi1=num1/10;ge1=num1%10;}if(key==2&&P1==0x44&&value3>3){ //按键11:设置东西绿灯时间- num2=value3;num2--;value3=num2;shi2=num2/10;ge2=num2%10;num1=value3+value4;//显示南北红灯时间shi1=num1/10;ge1=num1%10;}if(key==3&&P1==0x44&&value4>3){ //按键12:设置东西黄灯时间- num2=value4;num2--;value4=num2;shi2=num2/10;ge2=num2%10;num1=value3+value4;//显示南北红灯时间shi1=num1/10;ge1=num1%10;}}}P3=0xf7;//第四行线 2未用temp=P3;temp=temp&0xf0;if(temp!=0xf0){delay(10);temp=P3;temp=temp&0xf0;if(temp!=0xf0){temp=P3;switch(temp){case 0xe7:key=0;break;case 0xd7:key=1;break;case 0xb7:key=2;break;case 0x77:key=3;break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}if(key==0&&P1==0x44){ //按键13:南北紧急情况:南北绿灯常亮东西红灯常亮P1=0x41;shi1=ge1=shi2=ge2=18;}if(key==1&&P1==0x44){ //按键14:东西紧急情况:东西绿灯常亮南北红灯常亮P1=0x14;shi1=ge1=shi2=ge2=18;}if(key==2&&P1==0x44){//按键15:}if(key==3&&P1==0x44){//按键16:}}}}void T0_time() interrupt 1 //定时器T0 中断子程序{TH0=(65536-45872)/256;TL0=(65536-45872)%256;num++;}。