51单片机用C语言实现交通灯(红绿灯)源程序
- 格式:doc
- 大小:30.00 KB
- 文档页数:3
#include<reg52.h>#define uint unsigned int#define uchar unsigned charchar TAB[11]={0x5f,0x44,0x9d,0xd5,0xc6,0xd3,0xdb,0x45,0xdf,0xd7,0x00}; //数码管状态表void delay_100ms(uint );void delay(uint );void display(uint );void yejian(void);int i,k,t,flag=0;sbit A1=P1^0;sbit A2=P1^1;sbit A3=P1^2;sbit A4=P1^3;sbit SB=P3^7;void main () //主程序{EA=1;//初始化,开所有中断ET1=1;//开定时器T1中断TMOD=0x10;//设置定时器工作方式2TH1=(65536-50000)/256;//设置定时器初值TL1=(65536-50000)%256;while(1){if(SB==0) flag=1;if(flag==1) yejian();P2=0x69;k=8;while(k>0)//状态1南北红灯,东西绿灯{if(SB==0) flag=1;if(flag==1) yejian();TR1=1;//开启T1while(t!=10) display(k); //显示倒计时if(t==10) t=0;k--;TR1=0;//关闭T1}if(k==0) k=3;while(k>=0)//状态2南北红灯,东西绿灯闪烁三次{if(SB==0) flag=1;if(flag==1) yejian();P2=0x69;delay_100ms(5);P2=0x41;delay_100ms(5);k--;}k=2;flag=1;while(k>=0)//状态3南北红灯,东西黄灯{if(SB==0) flag=1;if(flag==1) yejian();P2=0x7d;delay_100ms(10);k--;}P2=0x96;k=8;while(k>0)//状态4南北绿灯,东西红灯{if(SB==0) flag=1;if(flag==1) yejian();TR1=1;//开启T1while(t!=10) display(k);// 显示倒计时if(t==10) t=0;k--;TR1=0;//关闭T1}k=3;while(k>=0)//状态5东西红灯,南北绿灯闪烁三次{if(SB==0) flag=1;if(flag==1) yejian();P2=0x96;delay_100ms(5);P2=0x14;delay_100ms(5);k--;}k=2;while(k>=0)//状态6东西红灯,南北黄灯{if(SB==0) flag=1;if(flag==1) yejian();P2=0xd7;delay_100ms(10);k--;}}}void yejian(void){uint m=k;while(flag==1){if(SB==1) flag=0;k=11;P2=0xff;delay_100ms(5);P2=0x00;delay_100ms(5);}k=m;}void delay_100ms(uint z)//显示数码管延时100ms {TR1=1;//开启T1while(t!=z) display(k);if(t==z){t=0;TR1=0;//关闭T1}}void exter0() interrupt 3//定时器中断程序{TH1=(65536-50000)/256;TL1=(65536-50000)%256;t++;}void display(uint i)//倒计时显示{A1=A2=A3=A4=0;A4=1;P0=TAB[i];//显示第一位数值delay(4);A4=0;A3=1;P0=TAB[i];//显示第二位数值delay(4);A3=0;A2=1;P0=TAB[i];//显示第三位数值delay(4);A2=0;A1=1;P0=TAB[i];//显示第四位数值delay(4);A1=0;}void delay(uint z)//软件延时{uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}。
用C语言实现红绿灯源程序如下:#include <reg52.h>bit red,green,yellow,turnred; //定义红、黄、绿及转红标志code unsigned char tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共阴数码管 0-9unsigned char Dis_Shiwei;//定义十位unsigned char Dis_Gewei; //定义个位void delay(unsigned int cnt) //用于动态扫描数码管的延时程序{while(--cnt);}main(){TMOD |=0x01;//定时器设置 10ms in 12M crystal定时器0,工作方式1,16位定时器TH0=0xd8; //65535-10000=55535=D8F0(十六进制) TL0=0xf0;IE= 0x82; //中断控制,EA=1开总中断,ET0=1:定时器0中断允许TR0=1; //开定时器0中断P1=0xfc;//红灯亮,根据红黄绿接灯的顺序。
red =1;while(1){P0=Dis_Shiwei;//显示十位,这里实现用8位数码管,即左1位P2=0;delay(300);//短暂延时P0=Dis_Gewei; //显示个位,左数,2位P2=1;delay(300);}}/********************************//* 定时中断 *//********************************/void tim(void) interrupt 1 using 1{static unsigned char second=60,count; //初值60TH0=0xd8;//重新赋值,10毫秒定时TL0=0xf0;count++;if (count==100){count=0;second--;//秒减1if(second==0){ //这里添加定时到0的代码,可以是灯电路,继电器吸合等,或者执行一个程序if(red) //红灭,先转黄{red=0;yellow=1;second=4;P1=0xF3;//黄灯亮4秒,黄灯为过渡灯,再根据情况转绿或转红 }else if(yellow && !turnred){yellow=0;green=1;second=25;P1=0xCF;//绿灯亮25秒,}else if(green){yellow=1;green=0;second=4;P1=0xF3;//黄灯亮4秒turnred=1;}else if(yellow && turnred) //绿灯灭,转黄灯,后红灯,turnred=1时{red=1;yellow=0;P1=0xFC;//红灯亮60秒second=60;turnred=0; //接下来是转黄,绿。
#include <reg51.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned intsbit SH_CP=P2^0;sbit DS=P2^1;sbit ST_CP=P2^2;uchar temp;uchar code DSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff}; void NB_tong();void DX_tong();void NBY_show();void DXY_show();sbit RED_A=P1^0;//A代表NB南北sbit YELLOW_A=P1^1;sbit GREEN_A=P1^2;sbit RED_B=P1^3;//B代表DX东西sbit YELLOW_B=P1^4;sbit GREEN_B=P1^5;sbit K1=P3^0;sbit K2=P3^1;sbit K3=P3^3;sbit SPK=P3^7;//蜂鸣器uchar time=0,Count=0;//--------------------------------//延时//--------------------------------void DelayMS(uint x){uchar t;while(x--) for(t=0;t<120;t++);}//---------------------------------------//74HC595的驱动//---------------------------------------void In_595(){uchar i;for(i=0;i<8;i++){temp<<=1;DS=CY;SH_CP=1;_nop_();_nop_();SH_CP=0;}void Out_595(){ST_CP=0;_nop_();ST_CP=1;_nop_();ST_CP=0;}//---------------------------------------//T0定时器定时及各种情况下灯亮的调用//---------------------------------------void Timer0() interrupt 1{TH0=(65536-50000)/256;TL0=(65536-50000)%256;Count++;time=time%60;if(Count==20){time++;Count=0;}if(time<=30) NB_tong();if((time>30)&&(time<=35)) NBY_show();if((time>35)&&(time<=55)) DX_tong();if((time>55)&&(time<=60)) DXY_show();}//------------------------------------//按键处理//------------------------------------void EX_INT0() interrupt 0{if(K1==0) //K1按下强制NB南北通行,倒计时黑屏暂停;断开继续以前动作。
51单片机用C语言实现交通灯(红绿灯)源程序2009-10-29 23:00交通灯,红黄绿灯交替亮,怎样实现呢?其实就是根据单片机定时器及倒计时的程序修改。
源程序如下:/*1、程序目的:使用定时器学习倒计时红绿灯原理主要程序和倒计时一样2、硬件要求:数码管、晶振12M*/#include <reg52.h>bit red,green,yellow,turnred; //定义红、黄、绿及转红标志code unsigned char tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共阴数码管 0-9unsigned char Dis_Shiwei;//定义十位unsigned char Dis_Gewei; //定义个位void delay(unsigned int cnt) //用于动态扫描数码管的延时程序{while(--cnt);}main(){TMOD |=0x01;//定时器设置 10ms in 12M crystal定时器0,工作方式1,16位定时器TH0=0xd8; //65535-10000=55535=D8F0(十六进制)TL0=0xf0;IE= 0x82; //中断控制,EA=1开总中断,ET0=1:定时器0中断允许TR0=1; //开定时器0中断P1=0xfc;//红灯亮,根据红黄绿接灯的顺序。
red =1;while(1){P0=Dis_Shiwei;//显示十位,这里实现用8位数码管,即左1位P2=0;delay(300);//短暂延时P0=Dis_Gewei; //显示个位,左数,2位P2=1;delay(300);}}/********************************//* 定时中断 *//********************************/void tim(void) interrupt 1 using 1{static unsigned char second=60,count; //初值60TH0=0xd8;//重新赋值,10毫秒定时TL0=0xf0;count++;if (count==100){count=0;second--;//秒减1if(second==0){ //这里添加定时到0的代码,可以是灯电路,继电器吸合等,或者执行一个程序 if(red) //红灭,先转黄{red=0;yellow=1;second=4;P1=0xF3;//黄灯亮4秒,黄灯为过渡灯,再根据情况转绿或转红}else if(yellow && !turnred){yellow=0;green=1;second=25;P1=0xCF;//绿灯亮25秒,}else if(green){yellow=1;green=0;second=4;P1=0xF3;//黄灯亮4秒turnred=1;}else if(yellow && turnred) //绿灯灭,转黄灯,后红灯,turnred=1时{red=1;yellow=0;P1=0xFC;//红灯亮60秒second=60;turnred=0; //接下来是转黄,绿。
51单片机红绿灯设计报告一、引言红绿灯是城市道路交通管理中非常重要的设备,它能够有效地控制车辆和行人的通行,维护交通秩序,提高交通效率。
本报告将介绍一种基于51单片机的红绿灯设计,利用单片机的强大功能,实现了智能化、自动化的红绿灯控制系统。
二、设计原理1.硬件设计本设计使用了51单片机,通过其IO口控制LED灯的亮灭。
红绿灯的控制通过三个IO口分别连接到红、黄、绿三个LED灯,通过控制这三个IO口的电平,实现红绿灯的切换。
2.软件设计设计中使用了C语言进行程序开发。
程序通过设置IO口的状态和延时函数,控制红绿灯的切换和延时时间。
三、电路设计1.电路图电路图给出了51单片机、LED灯和电流限制电阻之间的连接关系。
单片机的P1口连接到红、黄、绿三个LED灯上,通过改变P1口的电平,控制LED的亮灭。
2.电路元件说明-51单片机:中央处理器,负责控制整个系统的运行和信号的处理。
-LED灯:用于显示红、黄、绿三种不同的状态。
-电流限制电阻:用于限制电流大小,保护51单片机和LED灯。
四、程序设计程序设计中,通过无限循环实现红绿灯系统的连续运行,程序中设置了红绿灯切换的时间间隔和黄灯亮灭的时间间隔。
五、实验结果经过测试,本设计能够正常地实现红绿灯的切换,各种状态都能够正确显示。
红灯亮10秒,黄灯亮3秒,绿灯亮15秒,然后循环重复。
六、总结本设计利用51单片机的强大功能,实现了红绿灯的自动切换。
通过控制IO口的电平和延时函数,能够实现红绿灯的各种状态的切换。
该设计简单、实用、可靠,适用于城市交通管理中的红绿灯设备。
课程设计任务书专业计算机科学与技术班级09计(嵌入式系统方向)姓名江海洋学号0905101072指导教师刘钰金陵科技学院教务处制摘要本文介绍了一个基于MCS-51及PROTEUS的十字路口交通灯控制系统的设计与仿真,通过对现实路况交通灯的分析研究,理解交通控制系统的实现方法。
十字路口交通灯控制系统通常要实现自动控制和在紧急情况下禁止普通车辆,而让紧急车辆优先通行。
本文还对MCS-51单片机的结构特点和重要引脚功能进行了介绍,同时对智能交通灯控制系统的设计进行了详细的分析。
最后介绍了PROTEUS嵌入式系统仿真与开发平台的使用方法,利用Proteus 软件对交通灯控制系统进行了仿真,仿真结果表明系统工作性能良好。
关键字:单片机,proteus仿真,中断,十字路口交通灯控制系统前言1,十字路口的交通控制系统指挥着人和各种车辆的安全运行,对交叉口实行科学的管理与控制是交通控制工程的重要研究课题,是保障交叉口的交通安全和充分发挥交叉口的通行能力的重要措施,是解决城市交通问题的有效途径。
交通灯信号灯的出现是人类历史上的一次重大改革,使人类的聚居生活,产生了深远的影响。
使交通得以有效管制,对于疏导交通流量,提高道路通行能力,减少交通事故有明显效果。
如何采用合适的控制方法,最大限度利用好耗费巨资修建的城市高速道路,缓解主干道与匝道、城区同周边地区的交通拥堵状况,越来越成为交通运输管理和城市规划部门亟待解决的主要问题。
随着电子技术的发展,利用单片机技术对交通灯进行智能化管理,已成为目前广泛采用的方法。
2,此十字路口交通灯控制系统,分东西道和南北道,设东西道为A道,南北道为B 道。
规定:A道放行时间为2分钟,B道放行1.5分钟;绿灯放行,红灯停止;绿灯转红灯时,黄灯亮2秒钟;若有紧急车辆要求通过时,此系统应能禁止普通车辆,而让紧急车辆通过。
3,应用单片机实现对交通灯的控制,在十字路口用红,黄,绿的指示灯,加上四个以倒计时显示的数码管来控制交通。
xxxxxxxxx基于AT89S52交通灯设计学院:电子信息工程专业班级: xxxxxxxxxxxxxx姓名: xx xx学号: xxxxxxxxxxx指导老师: xxxxxxxxxx摘要交通灯在我们日常生活中随处可见,它在交通系统中处于至关重要的位置。
交通灯的使用大大减少了交通繁忙路口的事故发生,给行人和车辆提供一个安全的交通环境,人们的生命和财产安全有了保障。
本设计旨在模拟十字路口的交通灯,以AT89S51单片机为基础,结合按键和数码管等元器件设计出一个简单且完全的交通灯系统。
关键词:交通灯 AT89S52 单片机目录一、设计任务 (4)二、AT89S52单片机及其他元器件简介 (4)(1)AT89S52单片机 (4)三、系统硬件电路设计 (6)(1)时钟电路设计 (6)(2)复位电路设计 (6)(3)灯控制电路设计 (7)(4)按键控制电路设计 (7)四、元件清单及实物图 (8)1、程序清单 (8)2、原理图 (9)五、实验心得 (9)附1 源程序代码 (10)附2 原理图 (16)一、设计任务(1)、设计一个十字路口的交通灯控制电路,要求南北方向和东西方向两条交叉道路上的车辆交替运行,每次通行时间都设30秒,时间可设置修改。
(2)、在绿灯转为红灯时,要求黄灯先亮5秒钟,才能变换运行车道,且黄灯亮时,要求每秒亮一次。
(3)、有紧急车辆要求通过时,系统要能禁止东西和南北两条路上所有的车辆通行。
二、AT89S52单片机及其他元器件简介(1)AT89S52单片机AT89S52是一种低功耗、高性能CMOS8位微控制器。
片上Flash允许程序存储器在系统可编程,亦适于常规编程器。
在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使得AT89S52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。
AT89S52具有以下标准功能:8K字节Flash,256字节RAM,32位I/O口线,看门狗定时器,2个数据指针,三个16位定时器/计数器,一个6位向量2级中断结构,全双工串行口,片内晶振及时钟电路。
51单片机用C语言实现交通灯51 单片机用C 语言实现交通灯(红绿灯)源程序交通灯,红黄绿灯交替亮,怎样实现呢?其实就是根据单片机定时器及倒计时的程序修改。
源程序如下:#include bit red,green,yellow,turnred; //定义红、黄、绿及转红标志code unsigned char tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共阴数码管0- 9unsigned char Dis_Shiwei;//定义十位unsigned char Dis_Gewei; //定义个位void delay(unsigned int cnt) //用于动态扫描数码管的延时程序{while(--cnt);}main() {TMOD |=0x01;//定时器设置10ms in 12M crystal 定时器0,工作方式1,16 位定时器TH0=0xd8; //65535-10000=55535=D8F0(十六进制)TL0=0xf0;IE= 0x82; //中断控制,EA=1 开总中断,ET0=1:定时器0 中断允许TR0=1; //开定时器0中断P1=0xfc;//红灯亮,根据红黄绿接灯的顺序。
red =1;while(1) {P0=Dis_Shiwei;//显示十位,这里实现用8 位数码管,即左1 位P2=0;delay(300); //短暂延时P0=Dis_Gewei; //显示个位,左数,2 位P2=1;delay(300);}}void tim(void) interrupt 1 using 1{static unsigned char second=60,count; //初值60TH0=0xd8;//重新赋值,10 毫秒定时TL0=0xf0;count++;if (count==100) {count=0;second--;//秒减1if(second==0){ //这里添加定时到0 的代码,可以是灯电路,继电器吸合等,或者执行一个程序if(red) //红灭,先转黄{red=0;yellow=1;second=4;P1=0xF3;//黄灯亮4 秒,黄灯为过渡灯,再根据情况转绿或转红}else if(yellow && !turnred){yellow=0;green=1;second=25;P1=0xCF;// 绿灯亮25 秒,}else if(green){yellow=1;green=0;second=4;P1=0xF3;//黄灯亮4 秒turnred=1;}else if(yellow && turnred) //绿灯灭,转黄灯,后红灯,turnred=1 时{red=1;yellow=0;P1=0xFC;//红灯亮60 秒second=60;turnred=0; //接下来是转黄,绿。
交通灯的控制摘要:本设计以AT89C51单片机为主控模块,主要由按钮开关,数码管,发光二极管组成,利用汇编语言编写程序来模拟对十字路口的交通管理,系统包括左右拐,直行,人行道四个基本的交通等功能。
南北方向亮绿灯60s,然后黄灯闪烁3次,每次一秒(亮灭各40ms),红灯40s,同时东西方向红灯65s,绿灯35s,黄灯闪烁3s。
各路灯用LED模拟显示,同时用七段数码管显示两路的倒计时时间。
利用键盘可修改灯亮时间PC机设置灯亮时间,利用PC与单片机串口通信实现。
为防止出现紧急情况(如119,110通过时),该系统还设置了中断,可通过按键使各个路口为红灯其它车辆禁行,特殊车辆通行的状态,当东西方向为通行状态时,南北方向有突发情况,也可通过手动按键使东西方向为红灯,南北方向为绿灯。
在对系统的分析基础上,提出了几种设计方案,经比较选择各方较好的LED 动态循环显示方案进行设计,设计包括硬件和软件两大部分单片机最小系统,时间显示,交通等显示三部分。
以AT89C51为控制核心,东西南北各设置3个交通灯,东西,南北方向各设置一个2位的数码管时间显示器,交通灯显示则采用红绿黄三色高亮发光二极管模拟,软件采用模块化的设计方法,主要分为主程序,定时中断服务子程序,倒计时显示子程序,交通灯模拟显示子程序。
软件设计完成,经过对该设计程序模拟测试,可实现对十字路口交通的良好管理,预期目标全部达到,该系统操作简单,实用性强,扩展功能好。
关键词:AT89C51 数码管光二极管中断模拟目录1前言 (5)1.1该课程选题背景 (5)1.2该课程选题现实意义 (5)1.3单片机交通灯研究任务 (5)2设计方案 (6)2.1方案设计目的 (6)2.2方案设计思路 (6)2.3方案设计原理 (7)3系统硬件设计 (8)3.1 AT89C51芯片简介 (8)3.2 74LS47芯片简介 (11)3.3系统总框图 (12)3.4、交通灯硬件线路 (12)3.5、系统工作原理 (12)4.软件设计 (13)4.1每秒钟的设定 (13)4.2秒的方法 (13)4.3相应程序代码 (13)4.4、键盘显示流程图 (14)4.5、软件延时 (14)5 Proteus软件仿真 (15)5.1正常运行时状态 (15)5.2黄灯亮时状态 (16)5.3应急情况下状态 (16)6 设计心得体会 (17)附录1:源程序代码 (18)附录2:硬件连接图 (23)参考文献 (23)1前言1.1单片机交通控制系统的选题背景世界上第一盏正式投入使用的交通信号灯出现在1868年12月10日,这盏身高7米,由德哈特设计的红绿两色煤气灯出现在议会大厦前的十字路口。
Proteus仿真原理图:Keil C源程序:#include<reg51.h>#define uchar unsigned char#define uint unsigned intsbit RED_DONGXI = P1^0;//南北方向红灯亮sbit YELLOW_DONGXI = P1^1;//南北方向黄灯亮sbit RED_NANBEI = P1^3;//东西方向红灯亮sbit GREEN_DONGXI = P1^2;//南北方向绿灯亮sbit YELLOW_NANBEI = P1^4;//东西方向黄灯亮sbit GREEN_NANBEI = P1^5;//东西方向绿灯亮sbit DXweixuan1 = P1^6;//南北方向数码管位选1sbit DXweixuan2 = P1^7;//南北方向数码管位选2sbit NBweixuan1 = P3^0;//东西方向数码管位选1sbit NBweixuan2 = P3^1;//东西方向数码管位选2sbit L1=P3^5;sbit L2=P3^6;sbit L3=P3^7;uint aa, bai,shi,ge,bb;uint shi1,ge1,shi2,ge2;uint code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; uint code table1[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6};void delay(uint z);void init(uint a);void display(uint shi1,uint ge1,uint shi2,uint ge2);void xtimer0();void init1();void init2();void init3();void init4();void init5();void xint1();void xint0();void LED_ON();void LED_OFF();void main(){P0=0xFF;P1=0xFF;P2=0x00;P3=0xFF;EA=1;EX0=1;IT0=0;init1();while(1){init2();//第2个状态init3(); //第3个状态init4(); //第4个状态init5();//第5个状态}}void init1()//第一个状态:东西、南北方向均亮红灯5S {uint temp;temp=5;TMOD=0x01;TH0=(65535-50000)/256;TL0=(65535-50000)%256;EA=1;ET0=1;TR0=1;while(1){RED_DONGXI=0; //第一个状态东西、南北均亮红灯5SRED_NANBEI=0;GREEN_DONGXI=1;GREEN_NANBEI=1;YELLOW_DONGXI=1;YELLOW_NANBEI=1;if(aa==20)//定时20*50MS=1S{aa=0;temp--;}shi1=shi2=temp/10;ge1=ge2=temp%10;if(temp==0){temp=5;break;}display(ge1,shi1,ge2,shi2);}}void init2()//第二个状态:东西亮红灯30S~5S、南北亮绿灯25~0S;{uint temp;temp=26;TMOD=0x01;TH0=(65535-50000)/256;TL0=(65535-50000)%256;EA=1;ET0=1;TR0=1;while(1){RED_DONGXI=1;RED_NANBEI=0;GREEN_DONGXI=0;GREEN_NANBEI=1;YELLOW_DONGXI=1;//第二个状态:东西亮绿灯25S、南北亮红灯YELLOW_NANBEI=1;if(aa==20)//定时20*50MS=1S{aa=0;temp--;shi1=(temp+5)/10;ge1=(temp+5)%10;shi2=temp/10;ge2=temp%10;if(temp==0){temp=26;break;}}display(ge1,shi1,ge2,shi2);}}void init3() //第三个状态:东西绿灯变为黄灯闪5次、南北亮红灯5S {uint temp;temp=6;TMOD=0x01;TH0=(65535-50000)/256;TL0=(65535-50000)%256;EA=1;ET0=1;TR0=1;while(1){RED_NANBEI=0;GREEN_DONGXI=1;if(aa==20)//定时20*50MS=1S{aa=0;temp--;YELLOW_DONGXI=~YELLOW_DONGXI;shi1=temp/10;shi2=shi1;ge1=temp%10;ge2=ge1;}if(temp==0){temp=6;break;}display(ge1,shi1,ge2,shi2);}}void init4()//第四个状态:东西亮绿灯25~0S,南北方向亮红灯30~5S;{uint temp;temp=26;TMOD=0x01;TH0=(65535-50000)/256;TL0=(65535-50000)%256;EA=1;ET0=1;TR0=1;while(1){RED_DONGXI=0;RED_NANBEI=1;YELLOW_DONGXI=1;//第一个状态东西、南北均亮红灯5SGREEN_NANBEI=0;if(aa==20){aa=0;temp--;shi1=temp/10;shi2=(temp+5)/10;ge1=temp%10;ge2=(temp+5)%10;if(temp==0){temp=26;break;}}display(ge1,shi1,ge2,shi2);}}void init5()//第五个状态:东西亮红灯、南北绿灯闪5次转亮黄灯5S {uint temp;temp=6;TMOD=0x01;TH0=(65535-50000)/256;TL0=(65535-50000)%256;EA=1;ET0=1;TR0=1;while(1){RED_NANBEI=1;RED_DONGXI=0;GREEN_DONGXI=1;GREEN_NANBEI=1;if(aa==20){aa=0;temp--;YELLOW_NANBEI=~YELLOW_NANBEI;shi1=temp/10;shi2=shi2;ge1=temp%10;ge2=ge1;if(temp==0){temp=6;break;}}display(ge1,shi1,ge2,shi2);}}void display(uint shi1,uint ge1,uint shi2,uint ge2) {DXweixuan1=0;DXweixuan2=1;NBweixuan1=1;NBweixuan2=1;P0=table[ge1];delay(5);DXweixuan1=1;DXweixuan2=0;NBweixuan1=1;NBweixuan2=1;P0=table[shi1];delay(5);DXweixuan1=1;DXweixuan2=1;NBweixuan1=0;NBweixuan2=1;P0=table[ge2];delay(5);DXweixuan1=1;DXweixuan2=1;NBweixuan1=1;NBweixuan2=0;P0=table[shi2];delay(5);}void xint0() interrupt 0 {RED_NANBEI=0;RED_DONGXI=0;GREEN_NANBEI=1;GREEN_DONGXI=1;YELLOW_NANBEI=1;YELLOW_DONGXI=1;P0=0x00;NBweixuan1=0;NBweixuan2=0;DXweixuan1=0;DXweixuan2=0;delay(2);return ;}void xint1() interrupt 2 {RED_NANBEI=1;RED_DONGXI=1;GREEN_NANBEI=0;GREEN_DONGXI=0;YELLOW_NANBEI=1;YELLOW_DONGXI=1;P0=0x00;NBweixuan1=0;NBweixuan2=0;DXweixuan1=0;DXweixuan2=0;delay(2);return ;}void xtimer0() interrupt 1 {TH0=(65535-50000)/256;TL0=(65535-50000)%256;aa++;}void delay(uint z){uint x,y;for(x=0;x<z;x++)for(y=0;y<110;y++); }。
基于51单片机控制交通灯的程序设计#include<reg51.h>unsigned char code dis_7[21]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82, 0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf,0x89,0x8c,0x00,0xff};//共阳数码管段码unsigned char data disbuf[6]={0x00,0x00,0x00,0x00,0x00,0x00};//显示缓冲区:时分秒使用unsigned char data count_timedx[]={2,10,5,10,25}; //东西方向倒计时时间unsigned char data count_timenb[]={2,25,10,5,10}; //南北方向倒计时时间unsigned char data Hour=14,Minite=06,Second=0,Halfsec=0; //定义时钟位unsigned char xdata *ledaddr=0x2000; //锁存器选通地址unsigned char data Ms=0,Lightcode=0,Light_step,Led_step,Light_num;unsigned int dataFault_dx=0,Fault_nb=0,Fault_total=0,Countdx=0,Countnb=0;sbit p10=P1^0; //第0位数码管位控制端sbit p11=P1^1; //第1位数码管位控制端sbit p12=P1^2; //第2位数码管位控制端sbit p13=P1^3; //第3位数码管位控制端sbit p14=P1^4; //第4位数码管位控制端sbit p15=P1^5; //第5位数码管位控制端sbit p16=P1^6; //发光二极管选通sbit p17=P1^7; //按键选通sbit p33=P3^3; //k1键用于切换四种功能/******************************************************************* **********//****************************1毫秒延时函数*******************************/ void delay1ms(int t){unsigned int i,j;for(i=0;i<t;i++)for(j=0;j<120;j++);}/******************************************************************* ********//*************************键盘扫描函数****************************************/ unsigned char getkey(void) {unsigned char Yiwei;unsigned char test=0x00,tim;*ledaddr=test;if(p17==0 && tim==0) //判断是否有按键按下{p17=1;tim=1;test=0xfe;delay1ms(5);for(Yiwei=0;Yiwei<8;Yiwei++) //处理按键{*ledaddr=test;if(p17==0)break;else test=(test<<1)+1;}return Yiwei;}else if(p17==0){}else {tim=0;}}/******************************************************************* **********//************************六位LED数码管显示***********************************/void displed(unsigned int hour_shi,unsigned int hour_ge,unsigned int min_shi,unsigned intmin_ge,unsigned int sec_shi,unsigned int sec_ge){*ledaddr=dis_7[hour_shi]; //时的十位显示p10=0;delay1ms(1);p10=1;*ledaddr=dis_7[hour_ge]; //时的个位显示p11=0;delay1ms(1);p11=1;*ledaddr=dis_7[min_shi]; //分的十位显示p12=0;delay1ms(1);p12=1;*ledaddr=dis_7[min_ge]; //分的个位显示p13=0;delay1ms(1);p13=1;*ledaddr=dis_7[sec_shi]; //秒的十位显示p14=0;delay1ms(1);p14=1;*ledaddr=dis_7[sec_ge]; //秒的个位显示p15=0;delay1ms(1);p15=1;}/******************************************************************* **********//******************************发光二极管显示函数*****************************/void displight(unsigned int state){if(state==0) //状态0:各方向红灯全亮{Lightcode=0xbb;}else if(state==1) //状态1:东西绿灯亮,南北红灯亮{Lightcode=0xbe;}else if(state==2) //状态2:东西黄灯闪烁,南北红灯亮{Lightcode=0xbd;}else if(state==3) //状态3:东西红灯亮,左行亮,南北红灯亮{Lightcode=0xb3;}else if(state==4) //状态4:东西红灯亮,南北直行绿灯亮{Lightcode=0xeb;}else if(state==5) //状态5:东西红灯亮,南北黄灯闪烁{Lightcode=0xdb;}else if(state==6) //状态6:东西红灯亮,南北红灯亮,左行亮{Lightcode=0x3b;}//黄灯闪烁if((Halfsec%2)==0){if(state==2)Lightcode=0xbf; //东西闪烁if(state==5)Lightcode=0xfb; //南北闪烁}*ledaddr=Lightcode; //送交通灯显示状态p16=0;delay1ms(1);p16=1;}/******************************************************************* *********//****************************违章车辆统计函数********************************/void weizhang(void) // 红灯亮的时候是否有车通过,KL1键显示东西,KL2键显示南北 {unsigned char key1;key1=getkey(); //获得键值if((key1==0)&&(Light_step>=4)&&(Light_step<=6)) //KL1键显示南北方向违章车辆,且只在南北方向为红灯时加1{Fault_dx++;if(Fault_dx==99) //最大计数99辆{Fault_dx=0;}}else if((key1==2)&&(Light_step>=1)&&(Light_step<=3)) //KL3键显示东西方向违章车辆,且只在东西方向为红灯时加1{Fault_nb++;if(Fault_nb==99) //最大计数99辆{Fault_nb=0;}}}/******************************************************************* ********//****************************数字钟函数***********************************/void shuzizhong(void) //数字钟:KL3键调节秒,KL4键调节分,KL5键调节时 {unsigned char data key2;key2=getkey(); //获得键值if(key2==2) //调节秒,按一次KL3,则加一秒{Second++;if(Second==60)Second=0;}if(key2==3) //调节分,按一次KL4,则加一分{Minite++;if(Minite==60)Minite=0;}if(key2==4) //调节时,按一次KL5,则加一时{Hour++;if(Hour==24)Hour=0;}disbuf[0]=Second%10; //时钟显示,送缓冲区disbuf[1]=Second/10;disbuf[2]=Minite%10;disbuf[3]=Minite/10;disbuf[4]=Hour%10;disbuf[5]=Hour/10;}/******************************************************************* **********//**************修改倒计时间函数*********************************************/void change_time(void) //注意:只修改绿灯、黄灯或左行灯时间,红灯时间自动求出 {unsigned int data key3=0;key3=getkey();if(key3==4) //KL5键选择要修改东西向倒计时{Light_num++;if(Light_num>4) Light_num=0;}if(key3==5) //KL2键用于修改东西方向倒计时,加1 {count_timedx[Light_num]++;if(count_timedx[Light_num]>=99)count_timedx[Light_num]=99;}if(key3==1)//KL6键用于修改东西方向倒计时,减1 {count_timedx[Light_num]--;if(count_timedx[Light_num]<1)count_timedx[Light_num]=1;}if(key3==6) //KL7键用于修改南北方向倒计时,加1 {count_timenb[Light_num]++;if(count_timenb[Light_num]>=99)count_timenb[Light_num]=99;}if(key3==2)//KL3键用于修改南北方向倒计时,减1 {count_timenb[Light_num]--;if(count_timenb[Light_num]<1)count_timenb[Light_num]=1;}count_timedx[4]=count_timenb[2]+count_timenb[3]+count_timenb[4]; //调整,求各方向红灯时间count_timenb[1]=count_timedx[1]+count_timedx[2]+count_timedx[3]; //红灯时间=绿灯+黄灯+左行灯}/******************************************************************* *********//************************定时器/计数器t0中断函数******************************/void time_intt0(void) interrupt 1 {TH0=0x4c; //赋初值定时50msTL0=0x00;Ms++;if(Ms>9){Ms=0;Halfsec++; //计时半秒if(Halfsec==2){Halfsec=0;Second++; //计时一秒Countdx--; //东西、南北倒计时减一Countnb--;}if(Second==60){Second=0;Minite++;//计时一分}if(Minite==60){Minite=0;Hour++; //计时一小时}if(Hour==24)Hour=0;}if((Countdx==0)||(Countnb==0)) //转换交通灯显示状态{Light_step++;if(Light_step>6){Light_step=1;}if(Countnb==0)Countnb=count_timenb[Light_step];//东西为红灯,南北绿、黄、左切换if(Countdx==0)Countdx=count_timedx[Light_step];//南北为红灯,东西绿、黄、左切换}}/******************************************************************* **********//****************外部中断1服务函数********************************************/void int_1(void) interrupt 2 //数码管显示状态切换 {EX1=0; //关中断if(Led_step<4){Led_step++;}if(Led_step==4){Led_step=0;}EX1=1;//开中断}/************串行口中断服务函数*********************************************/void ser_put(void) interrupt 4 //上位机发出字符'c',则清违章记录,若发出'g',则上传违章记录{if(RI==1) //接收到上位机发出的字符{RI=0;ACC=SBUF; //取字符if(ACC=='c') //清违章记录{Fault_dx=0;Fault_nb=0;}else if(ACC=='g')//上传违章记录{Fault_total=Fault_dx+Fault_nb;SBUF=Fault_total;}}if(TI==1) //发送中断TI=0;}/******************************************************************* **********//***************8051初始化函数************************************************/void Istr(void) {/*定时器初始化*/TMOD=0x21;//定时器1工作于方式2,做波特率发生器;定时器0工作于方式1,做定时器TH1=0xfa; //产生9.6kbit/s波特率TL1=0xfa;TH0=0x4c; //50msTL0=0x00;/*串行通信初始化*/SCON=0x50;PCON=0X80|PCON;/*启动定时器,开中断*/ET1=0; //禁止定时器1中断ET0=1;TR1=1;TR0=1;IT1=1; //设置外部中断为边沿触发EX1=1;ES=1;EA=1;}/************************主函数***********************************************/ void main(void) {Istr(); //调用初始化函数Led_step=0;Light_step=0;Light_num=0;Countdx=count_timedx[0];Countnb=count_timenb[0];SBUF='s';while(1){if(Led_step==0) //显示倒计时{displed(20,(Countdx/10),(Countdx%10),20,(Countnb/10),(Countnb%10));}if(Led_step==1) //显示时钟{shuzizhong(); //调用数字钟函数displed(disbuf[5],disbuf[4],disbuf[3],disbuf[2],disbuf[1],disbuf[0]);}if(Led_step==2) //修改倒计时数{change_time(); //调用修改倒计时时间函数displed(Light_num,count_timedx[Light_num]/10,count_timedx[Light_num]%10,Light_num,count_timenb[Light_num]/10,count_timenb[Light_num]%10);}if(Led_step==3) //显示并统计违章数{weizhang(); //调用违章记录函数displed(15,Fault_dx/10,Fault_dx%10,15,Fault_nb/10,Fault_nb%10);}displight(Light_step);//显示交通灯}}/*********over*******over************over*********over*********over* ******over***/。
#include<reg52.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned intbit Flag_SN_Yellow; //SN黄灯标志位bit Flag_EW_Yellow;//EW黄灯标志位uchar Time_EW;//东西方向倒计时单元uchar Time_SN;//南北方向倒计时单元uchar EW=15,SN=10,EWL=19,SNL=19; //程序初始化赋值,正常模式uchar EW1=60,SN1=40,EWL1=19,SNL1=19;//用于存放修改值的变量uchar Flag_Moden=1; //模式变量 1正常模式 2 禁止南北通东西 3 禁止东西通南北 4 禁止东西南北 5 夜间模式uchar Flag_key=0;uchar code table[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//1~~~~ 9段选码sbit HC164_Data =P0^0;sbit HC164_Clk =P0^1;sbit EW_green =P0^2;sbit EW_yellow =P0^3;sbit EW_red =P0^4;sbit SN_red =P0^5;sbit SN_green =P0^7;sbit SN_yellow =P0^6;sbit SN_RXD_red =P2^7;sbit SN_RXD_green =P2^6;sbit EW_RXD_red =P2^5;sbit EW_RXD_green =P2^4;sbit FMQ = P1^0;sbit key1 = P3^3;sbit key2 = P3^4;sbit key3 = P3^5;sbit WEI1 =P2^3; // 东西数码管第一位sbit WEI2 =P2^2; // 东西数码管第二位sbit WEI3 =P2^1; // 南北数码管第一位sbit WEI4 =P2^0; // 南北数码管第二位//uchar ew=40;sn=35;//函数delay(uchar z)//功能能延时void Delay(uchar z){uchar a,b;for(a=z;a>0;a--)for(b=200;b>0;b--);}void HC_164_Set_byte(uchar duan){uchar i;for(i=0;i<8;i++){HC164_Data =duan & 0x80;HC164_Clk =0;HC164_Clk =1;duan =duan <<1;}}void display_smg(uchar wei,uchar num){switch(wei){case1: WEI1=0;WEI2=1;WEI3=1;WEI4=1;HC_164_Set_byte(table[num]);break;case2: WEI1=1;WEI2=0;WEI3=1;WEI4=1;HC_164_Set_byte(table[num]);break;case3: WEI1=1;WEI2=1;WEI3=0;WEI4=1;HC_164_Set_byte(table[num]);break;case4: WEI1=1;WEI2=1;WEI3=1;WEI4=0;HC_164_Set_byte(table[num]);break;default: break;}}void Display(void){uchar h,l;h=Time_EW/10;l=Time_EW;display_smg(1,h);Delay(8);display_smg(2,l);Delay(8);h=Time_SN/10;l=Time_SN;display_smg(3,h);Delay(8);display_smg(4,l);Delay(8);}void Key(){if(key1==0){Delay(10);if(key1==0){while(!key1);Flag_key++;if(Flag_key==1) {Flag_Moden=2;}if(Flag_key==2) {Flag_Moden=3;}if(Flag_key==3) {Flag_Moden=4;}if(Flag_key==4) {Flag_Moden=5;FMQ=1;TR0=1;}if(Flag_key==5) {Flag_EW_Yellow=0; //SN关黄灯信号位Flag_SN_Yellow=0; //SN关黄灯信号位FMQ=1;Flag_Moden=1;TR0=1;//启动定时Flag_key=0;}}}if(key2==0){while(!key2);Flag_Moden=2;}if(key3==0){while(!key3);Flag_Moden=3;}}void timer0(void)interrupt 1 using 1{static uchar count;TH0=(65536-50000)/256;TL0=(65536-50000)%6;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){if(Flag_Moden==1){Time_EW--;Time_SN--;}if(Flag_SN_Yellow==1)//测试南北黄灯标志位{SN_yellow=~SN_yellow;}if(Flag_EW_Yellow==1)//测试东西黄灯标志位{EW_yellow=~EW_yellow;}count=0;}}//模式1void Zc_moshi(){//*******S0状态**********EW_RXD_red=0; //EW人行道禁止EW_RXD_green=1;//EW人行道禁止SN_RXD_red=1; //EW人行道通行SN_RXD_green=0;//SN人行道通行Flag_EW_Yellow=0; //EW关黄灯显示信号Flag_SN_Yellow=0; //SN关黄灯显示信号Time_EW=EW; //EW=45;SN=40;Time_SN=SN;SN_green =0; //SN通行,EW红灯SN_red =1;EW_red =0;EW_green =1;while(Time_EW>5){if(key1==0 || key2==0||key3==0){//Flag_Moden=1;TR0=0;//启动定时break;}Display();}SN_yellow=0; //SN黄灯亮开始闪烁5秒SN_green =1; //灭//*******S1状态**********Time_SN=5;while(Time_EW<=5){if(key1==0 || key2==0||key3==0){//Flag_Moden=1;TR0=0;//启动定时break;}Flag_SN_Yellow=1; //SN开黄灯信号位Display();}//*******S2状态**********Flag_SN_Yellow=0; //SN关黄灯显示信号SN_yellow=1;EW_RXD_red=1; //EW人行道通行SN_RXD_green=1;//SN人行道禁止EW_RXD_green=0; //EW人行道通行SN_RXD_red=0;//SN人行道禁止Time_EW=SN; //EW=45;SN=40;Time_SN=EW;SN_green=1;//南北绿灯禁止东西通行SN_red=0; //亮EW_red=1;EW_green=0; //亮while(Time_SN>5){if(key1==0 || key2==0||key3==0){//Flag_Moden=1;TR0=0;//启动定时break;}Display();}//*******S3状态**********EW_green=1;EW_yellow=0;Time_EW=5;while(Time_SN<=5){if(key1==0 || key2==0||key3==0){TR0=0;//启动定时break;}Flag_EW_Yellow=1; //SN开黄灯信号位Display();}Flag_EW_Yellow=0;EW_yellow=1;}////模式2 禁止南北通东西蜂鸣器响void Jsn(){EW_green =0;EW_yellow =1;EW_red =1;SN_red =0;SN_green =1;SN_yellow =1;SN_RXD_red =0;SN_RXD_green =1;EW_RXD_red =1;EW_RXD_green =0;FMQ =~ FMQ;Delay(10);WEI1=1;WEI2=1;WEI3=1;WEI4=1;}////模式3 禁止东西通南北蜂鸣器响void Jew(){EW_green =1;EW_yellow =1;EW_red =0;SN_red =1;SN_green =0;SN_yellow =1;SN_RXD_red =1;SN_RXD_green =0;EW_RXD_red =0;EW_RXD_green =1;FMQ =~ FMQ;Delay(10);WEI1=1;WEI2=1;WEI3=1;WEI4=1;}//模式4 禁止东西南北蜂鸣器响void JEwSn(){EW_green =1;EW_yellow =1;EW_red =0;SN_red =0;SN_green =1;SN_yellow =1;SN_RXD_red =0;SN_RXD_green =1;EW_RXD_red =0;EW_RXD_green =1;FMQ =~ FMQ;Delay(10);WEI1=1;WEI2=1;WEI3=1;WEI4=1;}//模式5 夜间模式,东西南北黄灯闪烁void Yejian(){EW_green =1;//EW_yellow =1;EW_red =1;SN_red =1;SN_green =1;//SN_yellow =1;SN_RXD_red =1;SN_RXD_green =1;EW_RXD_red =1;EW_RXD_green =1;Flag_EW_Yellow=1; //SN开黄灯信号位Flag_SN_Yellow=1; //SN开黄灯信号位}void main (){P1=0xff;P2=0xff ;P3=0xff;P0=0xff;EW_green =1;EW_yellow =1;EW_red =1;SN_red =1;SN_green =1;SN_yellow =1;SN_RXD_red =1;SN_RXD_green =1;EW_RXD_red =1;EW_RXD_green =1;WEI1=1;WEI2=1;WEI3=1;WEI4=1;IT0=1; //INT0负跳变触发TMOD=0x01;//定时器工作于方式1 TH0=(65536-50000)/256;//定时器赋初值TL0=(65536-50000)%6;EA=1; //CPU开中断总允许ET0=1;//开定时中断// EX0=1;//开外部INTO中断TR0=1;//启动定时while(1){switch(Flag_Moden) {case 1:Zc_moshi(); break;case 2:Jsn(); break;case 3: Jew();break;case 4: JEwSn();break;case 5: Yejian();break;default :break;}Key();}}。
#include "reg51.h"#include "absacc.h"sbit SN_LED_RED=P1^3;sbit SN_LED_GREEN=P1^5;sbit SN_LED_YELLOW=P1^4;sbit EW_LED_RED=P1^0;sbit EW_LED_GREEN=P1^2;sbit EW_LED_YELLOW=P1^1;unsigned char code disptab[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80, 0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xFF};unsigned char code bittab[] = {0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F}; unsigned char num=0; //数码管序号unsigned char led[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; char set_value[4] = {60,4,40,4}; //设置数码管在显示值unsigned char sign[4]={1,0,0,0};unsigned char disp_ew,disp_sn;unsigned char falsh_sign,direction_sign,flash_count;unsigned int secnum;unsigned char key;void delay_ms(unsigned int a);void add_process();void sub_process();void set_process();void scan_key();void init();void delay_ms(unsigned int a){unsigned char i;while(a--){i=70;while(i--);}}void add_process(){delay_ms(600);if(!P3^2){delay_ms(500);if(P3^2){if(key == 1){set_value[0] = set_value[0] + 10;if(set_value[0] > 99){set_value[0] = set_value[0] % 10;}disp_ew = set_value[0];}if(key == 2){set_value[1]++;if(set_value[1] > 9){set_value[1] = 0;}disp_ew = set_value[1];}if(key == 3){set_value[2] = set_value[2] + 10;if(set_value[2] > 99){set_value[2] = set_value[2] % 10;}disp_sn = set_value[2];}if(key == 4){set_value[3]++;if(set_value[3] > 9){set_value[3] = 0;}disp_sn = set_value[3];}}while(!P3^2){if(key == 1){set_value[0] = set_value[0] + 10;if(set_value[0] > 99){set_value[0] = set_value[0] % 10;}disp_ew = set_value[0];}if(key == 2){set_value[1]++;if(set_value[1] > 9){set_value[1] = 0;}disp_ew = set_value[1];}if(key == 3){set_value[2] = set_value[2] + 10;if(set_value[2] > 99){set_value[2] = set_value[2] % 10;}disp_sn = set_value[2];}if(key == 4){set_value[3]++;if(set_value[3] > 9){set_value[3] = 0;}disp_sn = set_value[3];}delay_ms(1200);}}else{while(!P3^2);if(key == 1){set_value[0]++;if(set_value[0] > 99){set_value[0] = 0;}disp_ew = set_value[0];}if(key == 2){set_value[1]++;if(set_value[1] > 9){set_value[1] = 0;}disp_ew = set_value[1];}if(key == 3){set_value[2]++;if(set_value[2] > 99){set_value[2] = 0;}disp_sn = set_value[2];}if(key == 4){set_value[3]++;if(set_value[3] > 9){set_value[3] = 0;}disp_sn = set_value[3];}}}void sub_process(){delay_ms(600);if(!P3^3){delay_ms(500);if(P3^3){while(!P3^3);if(key == 1){set_value[0] = set_value[0] - 10;if(set_value[0] < 0){set_value[0] = set_value[0] + 100;}disp_ew = set_value[0];}if(key == 2){set_value[1]--;if(set_value[1] < 0){set_value[1] = 9;}disp_ew = set_value[1];}if(key == 3){set_value[2] = set_value[2] - 10;if(set_value[2] < 0){set_value[2] = set_value[2] + 100;}disp_sn = set_value[2];}if(key == 4){set_value[3]--;if(set_value[3] < 0){set_value[3] = 9;}disp_sn = set_value[3];}}while(!P3^3){if(key == 1){set_value[0] = set_value[0] - 10;if(set_value[0] < 0){set_value[0] = set_value[0] + 100;}disp_ew = set_value[0];}if(key == 2){set_value[1]--;if(set_value[1] < 0){set_value[1] = 9;}disp_ew = set_value[1];}if(key == 3){set_value[2] = set_value[2] - 10;if(set_value[2] < 0){set_value[2] = set_value[2] + 100;}disp_sn = set_value[2];}if(key == 4){set_value[3]--;if(set_value[3] < 0){set_value[3] = 9;}disp_sn = set_value[3];}delay_ms(1200);}}else{while(!P3^3);if(key == 1){set_value[0]--;if(set_value[0] < 0){set_value[0] = 99;}disp_ew = set_value[0];}if(key == 2){set_value[1]--;if(set_value[1] < 0){set_value[1] = 9;}disp_ew = set_value[1];}if(key == 3){set_value[2]--;if(set_value[2] < 0){set_value[2] = 99;}disp_sn = set_value[2];}if(key == 4){set_value[3]--;if(set_value[3] < 0){set_value[3] = 9;}disp_sn = set_value[3];}}}void set_process(){while(!P3^0);ET1 = 0;TR1 = 0;key = key + 1;falsh_sign = 1;if(key > 5){key = 1;}if(key == 1){disp_ew = set_value[0];P1 = 0xfb;direction_sign = 1;}if(key == 2){disp_ew = set_value[1];P1 = 0xfd;direction_sign = 1;}if(key == 3){disp_sn = set_value[2];P1 = 0xdf;direction_sign = 2;}if(key == 4){disp_sn = set_value[3];P1 = 0xef;direction_sign = 2;}if(key == 5){disp_sn = set_value[0] + set_value[1];disp_ew = set_value[0];P1 = 0xf3;falsh_sign = 0;ET1 = 1;TR1 = 1;}}void scan_key(){while(P3^0 && P3^2 && P3^3);delay_ms(15);if(!P3^0){set_process();}if(!P3^2){add_process();}if(!P3^3){sub_process();}elsereturn ;}void disp_t0(void) interrupt 1{TR0 = 0;num++;num=(num%4);P2=0xff;P0=0xff;P2=bittab[num];switch(num){case 0: P0=disptab[disp_sn%10]; break;case 1: P0=disptab[disp_sn/10]; break;case 2: P0=disptab[disp_ew%10]; break;case 3: P0=disptab[disp_ew/10]; break;default: ;}TH0 = 0xD8;TL0 = 0xF0;TR0 = 1;}void disp_count_t1(void) interrupt 3{TH1 = 0x3C;TL1 = 0xB0;secnum++;if(secnum == 20){disp_sn--;disp_ew--;if(disp_ew == 0 && sign[0] ==1){disp_ew = set_value[1];EW_LED_GREEN=1;EW_LED_YELLOW =0;sign[1]=1;sign[0]=0;}if(disp_ew == 0 && sign[1] ==1){disp_ew = set_value[2] + set_value[3];disp_sn = set_value[2];SN_LED_RED =1;EW_LED_YELLOW =1;EW_LED_RED =0;SN_LED_GREEN =0;sign[2] =1;sign[1] =0;}if(disp_sn == 0 && sign[2] == 1 ){disp_sn = set_value[3];SN_LED_GREEN = 1;SN_LED_YELLOW = 0;sign[3] = 1;sign[2] = 0;}if(disp_sn == 0 && sign[3] == 1){disp_sn = set_value[0] + set_value[1];disp_ew = set_value[0];EW_LED_RED = 1;SN_LED_YELLOW = 1;EW_LED_GREEN = 0;SN_LED_RED = 0;sign[0] = 1;sign[3] = 0;}secnum = 0;}}void init(){direction_sign = 0;falsh_sign = 0;flash_count = 0;secnum = 0;key = 0;P0 = 0xff;disp_sn = set_value[0] + set_value[1];disp_ew = set_value[0];EW_LED_GREEN = 0;SN_LED_RED = 0;P3=0xf8;TMOD = 0x11;TH0 = 0xD8;TL0 = 0xF0;TH1 = 0x3C;TL1 = 0xB0;EA = 1;TR0 = 1;ET0 = 1;TR1 = 1;ET1 = 1;}void main(){init();while(1){scan_key();}}最新范本,供参考!。
交通灯的控制摘要:本设计以AT89C51单片机为主控模块,主要由按钮开关,数码管,发光二极管组成,利用汇编语言编写程序来模拟对十字路口的交通管理,系统包括左右拐,直行,人行道四个基本的交通等功能。
南北方向亮绿灯60s,然后黄灯闪烁3次,每次一秒(亮灭各40ms),红灯40s,同时东西方向红灯65s,绿灯35s,黄灯闪烁3s。
各路灯用LED模拟显示,同时用七段数码管显示两路的倒计时时间。
利用键盘可修改灯亮时间PC机设置灯亮时间,利用PC与单片机串口通信实现。
为防止出现紧急情况(如119,110通过时),该系统还设置了中断,可通过按键使各个路口为红灯其它车辆禁行,特殊车辆通行的状态,当东西方向为通行状态时,南北方向有突发情况,也可通过手动按键使东西方向为红灯,南北方向为绿灯。
在对系统的分析基础上,提出了几种设计方案,经比较选择各方较好的LED 动态循环显示方案进行设计,设计包括硬件和软件两大部分单片机最小系统,时间显示,交通等显示三部分。
以AT89C51为控制核心,东西南北各设置3个交通灯,东西,南北方向各设置一个2位的数码管时间显示器,交通灯显示则采用红绿黄三色高亮发光二极管模拟,软件采用模块化的设计方法,主要分为主程序,定时中断服务子程序,倒计时显示子程序,交通灯模拟显示子程序。
软件设计完成,经过对该设计程序模拟测试,可实现对十字路口交通的良好管理,预期目标全部达到,该系统操作简单,实用性强,扩展功能好。
关键词:AT89C51 数码管光二极管中断模拟目录1前言 (5)1.1该课程选题背景 (5)1.2该课程选题现实意义 (5)1.3单片机交通灯研究任务 (5)2设计方案 (6)2.1方案设计目的 (6)2.2方案设计思路 (6)2.3方案设计原理 (7)3系统硬件设计 (8)3.1 AT89C51芯片简介 (8)3.2 74LS47芯片简介 (11)3.3系统总框图 (12)3.4、交通灯硬件线路 (12)3.5、系统工作原理 (12)4.软件设计 (13)4.1每秒钟的设定 (13)4.2秒的方法 (13)4.3相应程序代码 (13)4.4、键盘显示流程图 (14)4.5、软件延时 (14)5 Proteus软件仿真 (15)5.1正常运行时状态 (15)5.2黄灯亮时状态 (16)5.3应急情况下状态 (16)6 设计心得体会 (17)附录1:源程序代码 (18)附录2:硬件连接图 (23)参考文献 (23)1前言1.1单片机交通控制系统的选题背景世界上第一盏正式投入使用的交通信号灯出现在1868年12月10日,这盏身高7米,由德哈特设计的红绿两色煤气灯出现在议会大厦前的十字路口。
xxxxxxxxx基于AT89S52交通灯设计学院:电子信息工程专业班级:xxxxxxxxxxxxxx姓名:xx xx学号:xxxxxxxxxxx指导老师:xxxxxxxxxx摘要交通灯在我们日常生活中随处可见,它在交通系统中处于至关重要的位置。
交通灯的使用大大减少了交通繁忙路口的事故发生,给行人和车辆提供一个安全的交通环境,人们的生命和财产安全有了保障。
本设计旨在模拟十字路口的交通灯,以AT89S51单片机为基础,结合按键和数码管等元器件设计出一个简单且完全的交通灯系统。
关键词:交通灯AT89S52 单片机目录一、设计任务 (4)二、AT89S52单片机及其他元器件简介 (4)(1)AT89S52单片机 (4)三、系统硬件电路设计 (6)(1)时钟电路设计 (6)(2)复位电路设计 (6)(3)灯控制电路设计 (7)(4)按键控制电路设计 (7)四、元件清单及实物图 (8)1、程序清单 (8)2、原理图 (9)五、实验心得 (9)附1 源程序代码 (10)附2 原理图 (16)一、设计任务(1)、设计一个十字路口的交通灯控制电路,要求南北方向和东西方向两条交叉道路上的车辆交替运行,每次通行时间都设30秒,时间可设置修改。
(2)、在绿灯转为红灯时,要求黄灯先亮5秒钟,才能变换运行车道,且黄灯亮时,要求每秒亮一次。
(3)、有紧急车辆要求通过时,系统要能禁止东西和南北两条路上所有的车辆通行。
二、AT89S52单片机及其他元器件简介(1)AT89S52单片机AT89S52是一种低功耗、高性能CMOS8位微控制器。
片上Flash允许程序存储器在系统可编程,亦适于常规编程器。
在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使得AT89S52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。
AT89S52具有以下标准功能:8K字节Flash,256字节RAM,32位I/O口线,看门狗定时器,2个数据指针,三个16位定时器/计数器,一个6位向量2级中断结构,全双工串行口,片内晶振及时钟电路。
51单片机用C语言实现交通灯(红绿灯)源程序
2009-10-29 23:00
交通灯,红黄绿灯交替亮,怎样实现呢?其实就是根据单片机定时器及倒计时的程序修改。
源程序如下:
/*
1、程序目的:使用定时器学习倒计时红绿灯原理主要程序和倒计时一样
2、硬件要求:数码管、晶振12M
*/
#include <reg52.h>
bit red,green,yellow,turnred; //定义红、黄、绿及转红标志
code unsigned char tab[]=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//共阴数码管 0-9
unsigned char Dis_Shiwei;//定义十位
unsigned char Dis_Gewei; //定义个位
void delay(unsigned int cnt) //用于动态扫描数码管的延时程序{
while(--cnt);
}
main()
{
TMOD |=0x01;//定时器设置 10ms in 12M crystal定时器0,工作方式1,16位定时器
TH0=0xd8; //65535-10000=55535=D8F0(十六进制)
TL0=0xf0;
IE= 0x82; //中断控制,EA=1开总中断,ET0=1:定时器0中断允许
TR0=1; //开定时器0中断
P1=0xfc;//红灯亮,根据红黄绿接灯的顺序。
red =1;
while(1)
{
P0=Dis_Shiwei;//显示十位,这里实现用8位数码管,即左1位
P2=0;
delay(300);//短暂延时
P0=Dis_Gewei; //显示个位,左数,2位
P2=1;
delay(300);
}
}
/********************************/
/* 定时中断 */
/********************************/
void tim(void) interrupt 1 using 1
{
static unsigned char second=60,count; //初值60
TH0=0xd8;//重新赋值,10毫秒定时
TL0=0xf0;
count++;
if (count==100)
{
count=0;
second--;//秒减1
if(second==0)
{ //这里添加定时到0的代码,可以是灯电路,继电器吸合等,或者执行一个程序 if(red) //红灭,先转黄
{
red=0;yellow=1;
second=4;
P1=0xF3;//黄灯亮4秒,黄灯为过渡灯,再根据情况转绿或转红
}
else if(yellow && !turnred)
{
yellow=0;green=1;
second=25;
P1=0xCF;//绿灯亮25秒,
}
else if(green)
{
yellow=1;green=0;
second=4;
P1=0xF3;//黄灯亮4秒
turnred=1;
}
else if(yellow && turnred) //绿灯灭,转黄灯,后红灯,turnred=1时
{
red=1;yellow=0;
P1=0xFC;//红灯亮60秒
second=60;
turnred=0; //接下来是转黄,绿。
}
}
Dis_Shiwei=tab[second/10];//十位显示值处理 Dis_Gewei=tab[second%10]; //个位显示处理。