C51代码 交通灯 Proteus原理图
51单片机设计交通灯仿真图

}
void init1()//第一个状态:主干道、支干道均亮红灯5S
{
uint temp;
temp=6;//变量赋初值
TMOD=0x01;//定时器0工作于方式1
TH0=0x4c;
TL0=0x00;//定时器赋初值
EA=1;//开外部中断
ET0=1;//开定时中断
TR0=1;//开定时器0
while(1)
#define uchar unsigned char//宏定义
#define uint unsigned int//宏定义
sbit RED_ZHU = P1^0;
sbit YELLOW_ZHU = P1^1;
sbit GREEN_ZHU = P1^2;
sbit RED_ZHI = P1^3;
sbit YELLOW_ZHI = P1^4;
delay0(5);
}
void xint0() interrupt 0 //外部中断0,这里用2是INT1的优先级为0
{
LED_ON();
}
void LED_ON()//外部中断0显示子程序
{
RED_ZHI=0;
RED_ZHU=0;
GREEN_ZHI=1;
GREEN_ZHU=1;
YELLOW_ZHI=1;
}
/*********************************************************
500ms延时函数
晶振:11.0592MHz
*********************************************************/
void delay(unsigned char j)
protues仿真单片机模拟交通灯

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单片机交通灯(加急救车)

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;}}。
Proteus实现单片机交通灯_图+程序(调试可用)

这是我初学单片机,并用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。
51单片机交通灯程序及PROTEUS仿真 集合

unsigned i;
for(i=0;i<30000;i++);
}
===========================================
# include<reg51.h>
unsigned char i=0,j=0;
unsigned char count=0,m,n;
unsigned char temp;
ET0=1;
while(1)
{
if(j%2==0)
{
P3=p3[j];P1=p1[(temp1[m][n]-temp)/10];
}
else
{
P3=p3[j];P1=p1[(temp1[m][n]-temp)%10];
}
switch(count)
{
case 0:P2=0x01;m=0;temp=0;break; // 1号绿灯亮
case 120:P2=0x30;m=5;temp=0;break; // 3号黄灯亮
case 135:P2=0x40;m=6;temp=0;break; // 4号绿灯亮
case 165:P2=0xc0;m=7;temp=0; // 4号黄灯亮
}
}
}
void time0() interrupt 1
{
j=j+1;
if(j%2==0)n++;
if(n==4)n=0;
if(j==8)j=0;
i++;
TH0=(65536-2500)/256;
TL0=(65536-2500)%256;
if(i==160)
{
i=0;
count++;
51单片机用C语言实现交通灯_红绿灯_源程序

c o d eu n s i g n e dc h a rt a b [ ] = { 0 x 3 f , 0 x 0 6 , 0 x 5 b , 0 x 4 f , 0 x 6 6 , 0 x 6 d , 0 x 7 d , 0 x 0 7 , 0 x 7 f , 0 x 6 f } ; / / 共阴数码管 0 9 u n s i g n e dc h a rD i s _ S h i w e i ; / / 定义十位 u n s i g n e dc h a rD i s _ G e w e i ;/ / 定 g n e di n tc n t ) { w h i l e ( c n t ) ; } m a i n ( ) { T M O D| = 0 x 0 1 ; / / 定时器设置 1 0 m si n1 2 Mc r y s t a l 定时器 0 ,工作方式 1 ,1 6 位定时器 T H 0 = 0 x d 8 ; / / 6 5 5 3 5 1 0 0 0 0 = 5 5 5 3 5 = D 8 F 0 (十六进制) T L 0 = 0 x f 0 ; I E =0 x 8 2 ;/ / 中断控制,E A = 1 开总中断,E T 0 = 1 :定时器 0 中断允许 T R 0 = 1 ; / / 开定时器 0 中断 P 1 = 0 x f c ; / / 红灯亮,根据红黄绿接灯的顺序。 r e d= 1 ; w h i l e ( 1 ) { P 0 = D i s _ S h i w e i ; / / 显示十位,这里实现用 8 位数码管,即左 1 位 P 2 = 0 ; d e l a y ( 3 0 0 ) ; / / 短暂延时 P 0 = D i s _ G e w e i ;/ / 显示个位,左数,2 位 P 2 = 1 ;
交通灯控制c51

摘要本系统由单片机系统、键盘、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 交通灯的形成当今,红绿灯安装在各个道口上,已经成为疏导交通车辆最常见和最有效的手段。
C51交通灯

我编写了一个: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、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
吉首大学单片机交通灯设计原理图局部放大程序代码#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++;}。