单片机交通灯编程代码
单片机课程设计交通灯(完整版)

门控串行数据输入
异步中央复位
符合 JEDEC 标准 no.7A
静电放电 (ESD) 保护:
·HBM EIA/JESD22-A114-B 超过 2000 V
·MM EIA/JESD22-A115-A 超过 200 V 。
多种封装形式
额定从-40 °C至 +85 °C和-40 °C至 +125 °C。
设计思想基于完成以上任务分析结合所学有关知识尤其是本学期所学关于单片机的中断系统和定时计数器的相关知识及应用我们知道对于15红绿黄四组各三盏灯的控制可以通过把这十二盏灯分别接到单片机的六个输出引脚若用p1口进行输出则分配如下at89c51l1l2l3l4l5l6东西红东西黄东西绿南北红南北黄南北绿led显示分布1642
亮灯规律:东西绿灯亮25s,南北红灯亮25s
东西绿灯闪5s,南北红灯亮5s
东西黄灯亮2s,南北红灯亮2s
东西红灯亮25s,南北绿灯亮25s
东西红灯亮5s,南北绿灯闪5s
东西红灯亮2s,南北黄灯亮2s
2.2.
(1)加强对单片机和汇编语言的认识,充分掌握和理解设计各部分的工作原理、设计过程、选择芯片器件、模块化编程等多项知识。
3.2.LED
3.2.1.七段数码显示器:
七段发光线段分别用a、b、c、d、e、f、g七个小写字母表示。
3.2.2.LED数码管:
半导体数码管又称LED数码管,是一种广泛使用的显示器件。LED有两种:共阳极型和共阴极型。
LED优点:亮度高、字形清晰,工作电压低(1.5~3V)、体积小、可靠性高、寿命长,响应速度极快。
1.引言
交通在人们的日常生活中占有重要的地位,随着人们社会活动的日益频繁,这点更是体现的淋漓尽致。交通信号灯的出现,使交通得以有效管制,对于疏导交通流量、提高道路通行能力,减少交通事故有明显效果。近年来随着科技的飞速发展,单片机的应用正在不断深入,同时带动传统控制检测技术日益更新。在实时检测和自动控制的单片机应用系统中,单片机往往作为一个核心部件来使用,仅单片机方面知识是不够的,还应根据具体硬件结构软硬件结合,加以完善。
51单片机交通灯

/*交通灯控制系统C语言源程序*//*Author:ZhaoWenjie All Rights Reserved*/ /*2009/10/18*/#include <reg51.h>#define uchar unsigned char#define uint unsigned intuchar data buf[4];uchar data sec_dx=20;//东西数默认uchar data sec_nb=30;//南北默认值uchar data set_timedx=20;uchar data set_timenb=30;int n;uchar data b;//定时器中断次数//sbit k1=P1^6;//定义5组开关//sbit k2=P1^7;//sbit k3=P2^7;//sbit k4=P3^0;//sbit k5=P3^1;//定义5组开关sbit k4=P3^7; //切换方向sbit k1=P3^5; //时间加sbit k2=P3^6; //时间减sbit k3=P3^4; //确认sbit k5=P3^1; //禁止// P3^2 //只允许东西方向通行// P3^3 //只允许南北方向通行sbit Y ellow_nb=P2^5; //南北黄灯标志sbit Y ellow_dx=P2^2; //东西黄灯标志sbit Green_nb=P2^4;sbit Green_dx=P2^1;sbit Buzz=P3^0;bit Buzzer_Indicate;bit time=0;//灯状态循环标志bit set=1;//调时方向切换键标志uchar code table[11]={ //共阴极字型码0x3f, //--00x06, //--10x5b, //--20x4f, //--30x66, //--40x6d, //--50x7d, //--60x07, //--70x7f, //--80x6f, //--90x00 //--NULL};//函数的声明部分void delay(int ms);//延时子程序void key();//按键扫描子程序void key_to1();//键处理子程序void key_to2();void key_to3();void display();//显示子程序void logo(); //开机LOGOvoid Buzzer();//主程序void main(){TMOD=0X01;TH0=0XD8;TL0=0XF0;EA=1;ET0=1;TR0=1;EX0=1;EX1=1;logo();P2=0Xc3;// 开始默认状态,东西绿灯,南北黄灯sec_nb=sec_dx+5;while(1){key(); //调用按键扫描程序display(); //调用显示程序Buzzer();}}//函数的定义部分void key() //按键扫描子程序{if(k1!=1){delay(10);if(k1!=1){while(k1!=1){key_to1();for(n=0;n<40;n++){ display();}}}}if(k2!=1){delay(10);if(k2!=1){while(k2!=1){key_to2();for(n=0;n<40;n++){ display();}}}}if(k3!=1){TR0=1; //启动定时器Buzzer_Indicate=0;sec_nb=set_timenb; //从中断回复,仍显示设置过的数值sec_dx=set_timedx;if(time==0){ P2=0X99;sec_nb=sec_dx+5; }else { P2=0xC3;sec_dx=sec_nb+5; }}if(k4!=1){delay(5);if(k4!=1){while(k4!=1);set=!set;}}if(k5!=1){delay(5);if(k5!=1){while(k5!=1)key_to3();}}}void display() //显示子程序{buf[1]=sec_dx/10; //第1位东西秒十位buf[2]=sec_dx%10; //第2位东西秒个位buf[3]=sec_nb/10; //第3位南北秒十位buf[0]=sec_nb%10; //第4位南北秒个位P1=0xff; // 初始灯为灭的P0=0x00;P1=0xfe; //片选LCD1P0=table[buf[1]];delay(1);P1=0xff;P0=0x00;P1=0xfd; //片选LCD2P0=table[buf[2]];delay(1);P1=0xff;P0=0x00;P1=0Xfb; //片选LCD3P0=table[buf[3]];delay(1);P1=0xff;P0=0x00;P1=0Xf7;P0=table[buf[0]]; //片选LCD4delay(1);}void time0(void) interrupt 1 using 1 //定时中断子程序{b++;if(b==19) // 定时器中断次数{ b=0;sec_dx--;sec_nb--;if(sec_nb<=5&&time==0) //东西黄灯闪{ Green_dx=0;Y ellow_dx=!Y ellow_dx;}if(sec_dx<=5&&time==1) //南北黄灯闪{ Green_nb=0;Y ellow_nb=!Y ellow_nb;}if(sec_dx==0&&sec_nb==5)sec_dx=5;if(sec_nb==0&&sec_dx==5)sec_nb=5;if(time==0&&sec_nb==0){ P2=0x99;time=!time;sec_nb=set_timenb;sec_dx=set_timenb+5;}if(time==1&&sec_dx==0){P2=0Xc3;time=!time;sec_dx=set_timedx;sec_nb=set_timedx+5;}}}void key_to1() //键盘处理子程序之+{TR0=0; //关定时器if(set==0)set_timenb++; //南北加1Selseset_timedx++; //东西加1Sif(set_timenb==100)set_timenb=1;if( set_timedx==100)set_timedx=1; //加到100置1sec_nb=set_timenb ; //设置的数值赋给东西南北sec_dx=set_timedx;}void key_to2() //键盘处理子程序之-{TR0=0; //关定时器if(set==0)set_timenb--; //南北减1Selseset_timedx--; //东西减1Sif(set_timenb==0)set_timenb=99;if( set_timedx==0 )set_timedx=99; //减到1重置99sec_nb=set_timenb ; //设置的数值赋给东西南北sec_dx=set_timedx;}void key_to3() //键盘处理之紧急车通行{TR0=0;P2=0Xc9;sec_dx=00;sec_nb=00;Buzzer_Indicate=1;}void int0(void) interrupt 0 using 1 //只允许东西通行{TR0=0;P2=0Xc3;Buzzer_Indicate=0;sec_dx=00;sec_nb=00;}void int1(void) interrupt 2 using 1 //只允许南北通行{TR0=0;P2=0X99;Buzzer_Indicate=0;sec_nb=00;sec_dx=00;}void logo()//开机的Logo "- - - -"{ for(n=0;n<50;n++){P0=0x40;P1=0xfe;delay(1);P1=0xfd;delay(1);P1=0Xfb;delay(1);P1=0Xf7;delay(1);P1 = 0xff;}}void Buzzer(){if(Buzzer_Indicate==1)Buzz=!Buzz;else Buzz=0;}void delay(int ms) //延时子程序{uint j,k;for(j=0;j<ms;j++)for(k=0;k<124;k++);}。
51单片机交通灯仿真原理

51单片机交通灯仿真原理交通灯是城市道路交通指示设施中最重要的一种,它可以用来引导车辆和行人在道路上安全通行。
在交通繁忙的路口,交通灯起到了非常关键的作用。
本文将介绍使用51单片机对交通灯进行仿真的原理。
交通灯通常包括红灯、黄灯和绿灯这三种状态。
红灯表示停止,黄灯表示警告,绿灯表示行驶。
在信号灯中,红灯和绿灯的时间比较长,黄灯的时间比较短。
下面是使用51单片机进行交通灯模拟的步骤:1.硬件连接:首先,我们需要将51单片机与LED灯连接起来。
假设使用3个LED灯分别模拟红灯、黄灯和绿灯,将它们分别连接到单片机的3个IO口上。
2.程序编写:使用汇编或C语言编写程序,实现交通灯的工作逻辑。
以下是一个简单的示例代码:```#include <reg51.h>#define LED_RED P0 // 定义红灯连接的IO口#define LED_YELLOW P1 // 定义黄灯连接的IO口#define LED_GREEN P2 // 定义绿灯连接的IO口void delay(unsigned int t)while(t--);void mainwhile(1)//红灯亮,其他灯灭LED_RED=0x01;LED_YELLOW=0x00;LED_GREEN=0x00;delay(5000); //等待5秒//绿灯亮,其他灯灭LED_RED=0x00;LED_YELLOW=0x00;LED_GREEN=0x01;delay(5000); //等待5秒//黄灯亮,其他灯灭LED_RED=0x00;LED_YELLOW=0x01;LED_GREEN=0x00;delay(2000); //等待2秒}```4.运行仿真:将单片机连接到电源后,程序开始执行。
红灯亮起5秒后,绿灯亮起5秒,然后黄灯亮起2秒,然后循环往复。
通过以上步骤,我们成功完成了51单片机交通灯仿真。
在实际应用中,可以通过增加传感器等组件实现更多的功能,如人行道上的行人信号灯、车辆流量检测等,进一步提高交通灯的智能化和人性化。
51单片机交通灯程序带车流量

#include <reg52.h> //52系列单片机头文件#include <intrins.h>#define uchar unsigned char#define uint unsigned intsbit key1=P3^0; //按键口定义sbit key2=P3^1;sbit key3=P3^4; //蜂鸣器口定义sbit key4=P3^5;sbit key5=P3^6;sbit Beer=P3^7;sbit DX_Red=P1^5; //红绿灯DX口定义sbit DX_Yellow=P1^4;sbit DX_Green=P1^3;sbit NB_Red=P1^2; //红绿灯NB口定义sbit NB_Yellow=P1^1;sbit NB_Green=P1^0;sbit NB_Blue=P1^6;sbit DX_Blue=P1^7;//sbit NB_JS=P3^5;//sbit DX_JS=P3^6;uchar code table[]={ //共阳极段码0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};void delayms(uint xms);int DX_Num=23,NB_Num=10; //数码管显示数字int numt0; //定时器计时int JS_NB_Num,JS_DX_Num;int NB_Num_GREEN,DX_Num_GREEN;int XZ=0; //按键2选择int BJ=0; //按键1选择int JS=0; //按键5选择int Temp1=1; //中断是否int temp=1 ; //数码管是否循环//int flag=0;int DX_Flag=0,NB_Flag=1; //红绿灯状态int DX_RED=33,DX_GREEN=15,DX_YELLOW=3; //红绿灯时间int NB_RED=38,NB_GREEN=10,NB_YELLOW=3;int NB_BLUE=10,DX_BLUE=10; //左转时间void display(uchar num1dis,uchar num2dis);void keyscan();void init() //中断红绿灯初始化函数{Beer=1; //蜂鸣器关断TMOD=0x01; //中断程序初始化TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;ET0=1;TR0=1;// EX1=1;//开外部中断1// IT1=1;//外部中断下降沿触发// EX0=1;//开外部中断0// IT0=1;//外部中断下降沿触发DX_Red=0; //红绿灯初始化DX_Yellow=1;DX_Green=1;NB_Red=1;NB_Yellow=1;NB_Green=0;}void main() //主函数{init();while(1){keyscan();if(temp==1){display(NB_Num,DX_Num);}}}void display(uchar num1dis,uchar num2dis) //数码管显示函数{int NB_Shi,NB_Ge,DX_Shi,DX_Ge;NB_Shi=num1dis/10;NB_Ge=num1dis%10;DX_Shi=num2dis/10;DX_Ge=num2dis%10;P0=table[NB_Shi]; //送十位段选数据P2=0xfe;delayms(3);P0=table[NB_Ge]; //送十位段选数据P2=0xfd;delayms(3);P0=table[DX_Shi]; //送十位段选数据P2=0xfb;delayms(3);P0=table[DX_Ge]; //送十位段选数据P2=0xf7;delayms(3);}void keyscan() //按键扫描函数{if(key1==0){delayms(10);if(key1==0){if(BJ==0){BJ=1;Beer=0;Temp1=2;temp=2;NB_Blue=1;DX_Blue=1;DX_Yellow=1;DX_Green=1;DX_Red=0;NB_Yellow=1;NB_Green=1;NB_Red=0;while(!key1);}else if(BJ==1){Beer=1;BJ=0;NB_Red=1;NB_Green=0;NB_Blue=1;DX_Blue=1;DX_Num=DX_RED-10;NB_Num=NB_GREEN;NB_Flag=1;DX_Flag=0;temp=1;Temp1=1;while(!key1);}}}if(key2==0){delayms(10);if(key2==0){if(XZ==0){XZ=1;EA=0;DX_Yellow=1;DX_Green=1;DX_Red=0;NB_Yellow=1;NB_Green=0;NB_Red=1;NB_Blue=1;DX_Blue=1;DX_Num=DX_RED;NB_Num=NB_GREEN;while(!key2);}else if(XZ==1){DX_Green=0;DX_Red=1;NB_Green=1;NB_Red=0;XZ=2;DX_Num=DX_GREEN;NB_Num=NB_RED;while(!key2);}else if(XZ==2){XZ=0;DX_Green=1;DX_Red=0;NB_Green=0;NB_Red=1;DX_Num=DX_RED-10;NB_Num=NB_GREEN;NB_Flag=1;DX_Flag=0;EA=1;ET0=1;TR0=1;while(!key2);}}}if(key3==0){delayms(10);if(key3==0){if(XZ==1){DX_Num++;DX_RED++;NB_Num++;NB_GREEN++;while(!key3);}else if(XZ==2){DX_Num++;DX_GREEN++;NB_Num++;NB_RED++;while(!key3);}}}if(key4==0){delayms(10);if(key4==0){if(XZ==1){DX_Num--;DX_RED--;NB_Num--;NB_GREEN--;while(!key4);}else if(XZ==2){DX_Num--;DX_GREEN--;NB_Num--;NB_RED--;while(!key4);}}}if(key5==0){delayms(10);if(key5==0){if(JS==0){JS=1;Temp1=2;DX_Yellow=1;DX_Green=1;DX_Red=0;NB_Yellow=1;NB_Green=1;NB_Blue=1;DX_Blue=1;NB_Red=0;DX_Num=0;NB_Num=0;EX1=1;//开外部中断1IT1=1;//外部中断下降沿触发EX0=1;//开外部中断0IT0=1;//外部中断下降沿触发while(!key5);}else if(JS==1){JS=0;// DX_Green=1;// DX_Red=0;NB_Green=0;NB_Red=1;if(NB_Num>5){if(DX_Num>5){NB_Num_GREEN=NB_GREEN;DX_Num_GREEN=DX_GREEN;JS_NB_Num=NB_Num;JS_DX_Num=DX_Num;NB_GREEN=JS_NB_Num*(NB_Num_GREEN+DX_Num_GREEN)/(JS_NB_Num+JS_D X_Num);DX_GREEN=NB_Num_GREEN+DX_Num_GREEN-NB_GREEN;NB_RED=NB_GREEN+23;DX_RED=DX_GREEN+23;}}EX1=0;//开外部中断1IT1=0;//外部中断下降沿触发EX0=0;//关外部中断0IT0=0;//关外部中断下降沿触发DX_Num=DX_RED-10;NB_Num=NB_GREEN;NB_Flag=1;DX_Flag=0;Temp1=1;temp=1;while(!key5);}}}}void delayms(uint xms) //延时函数{uint i,j;for(i=xms;i>0;i--) //i=xms即延时约xms毫秒for(j=110;j>0;j--);}void T0_time()interrupt 1{TH0=(65536-50000)/256;TL0=(65536-50000)%256;numt0++;if(BJ==1){P2=0xff;if(numt0>4){numt0=0;Beer=~Beer;}}if(Temp1==1){if(numt0>20){numt0=0;NB_Num--;DX_Num--;if(NB_Num<1){if(NB_Flag==1){NB_Flag=2;NB_Num=NB_YELLOW;NB_Green=1;NB_Yellow=0;}else if(NB_Flag==2){NB_Flag=0;NB_Num=NB_RED;NB_Yellow=1;NB_Red=0;NB_Blue=0;}else if(NB_Flag==0){NB_Flag=1;NB_Num=NB_GREEN;NB_Red=1;NB_Green=0;DX_Blue=1;}}if(DX_Num<1){if(DX_Flag==0){DX_Flag=1;DX_Num=DX_GREEN;DX_Red=1;DX_Green=0;NB_Blue=1;}else if(DX_Flag==1){DX_Flag=2;DX_Num=DX_YELLOW;DX_Green=1;DX_Yellow=0;}else if(DX_Flag==2){DX_Flag=0;DX_Num=DX_RED;DX_Yellow=1;DX_Red=0;DX_Blue=0;}}}}}void T1EXT() interrupt 2 //使用了外部中断1的键盘扫描子函数{EX1 = 0;if(numt0>4){numt0=0;NB_Num++;}EX1 = 1;}void T0EXT() interrupt 0 //使用了外部中断1的键盘扫描子函数{EX0 = 0;if(JS==1){ if(numt0>4){numt0=0;DX_Num++;}}EX0 = 1;}。
51单片机用C语言实现交通灯(红绿灯)源程序

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; //接下来是转黄,绿。
单片机整套实验及程序(交通灯_跑马灯等)

实验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;}}六、实验思考题●请用汇编指令完本钱实验内容,深刻理解汇编语言程序设计结构。
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++;
单片机课程设计交通灯附代码

电气工程学院单片机课程设计实验报告班级:…………姓名:学号:…………设计题目:十字路口交通灯系统设计设计时间:…………………………评定成绩:评定教师:目录一、调试过程 (2)1.1调试详细步骤和过程: (2)1.2软件调试遇到的问题及解决过程说明 (2)1.3软件仿真运行和硬件实际验证的区别 (2)二、运行效果 (4)2.1 Proteus仿真运行结果: (4)2.2硬件调试效果 (7)三、系统优化 (8)3.1软件设计 (8)3.2硬件设计 (8)四、设计总结 (9)附件 (11)一、调试过程1.1调试详细步骤和过程:(1)用Keil5软件编写好源程序,编译后无错误,生成hex文件。
(2)在Proteus中画出所设计的硬件电路原理图,将生成的hex文件导入Proteus 中AT89C51单片机中。
(3)点击运行按钮进行模拟仿真。
在矩阵键盘中依次输入不同的数值观察数码管所显示的数字是否是减计数的显示方式,同时观察LED二极管是否实现:东西为绿灯黄灯时,南北为红灯;南北为绿灯黄灯时,东西为红灯。
绿灯最后 3 秒内具有闪烁功能,绿灯转为红灯前,黄灯时间持续3 秒。
(4)记录仿真结果。
仿真调试中出现了矩阵键盘输入有时不能识别的问题,经过调整延时时间和扫描矩阵键盘时间,减小了不能识别矩阵键盘输入数值的几率。
同时还出现了LED 发光二极管显示过慢问题,同样经过修改了延时时间问题得到了解决。
1.2软件调试遇到的问题及解决过程说明在编译代码完成后进行仿真调试时数码管总是会显示乱码,经检查后发现是数码管数组代码书写有误,改正后能正确显示,无乱码。
在数码管显示无误后发现时间减一显示时,总是会有跳动不稳定,后来经过网络查询后,发现可能是没有进行消隐,在进行消音后,此现象消失,代码运行非常顺畅。
1.3软件仿真运行和硬件实际验证的区别Proteus作为单片机仿真软件具有很多优点,它不仅能仿真单片机CPU的工作情况,而且能仿真单片机外围电路等其他情况,以极度理想化的情况实现理论上可行的实验,给我们开发节省大量的材料和时间精力,然而,Proteus仿真成功并不能代表实际上可行。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
单片机交通灯编程代码
一、引言
交通灯是城市中必不可少的设施,它能够指挥车辆和行人的行动,保证交通有序进行。
单片机作为一种微型计算机,可以通过编程实现交通灯的控制。
本文将介绍单片机交通灯编程代码的实现方法。
二、硬件设计
在进行单片机交通灯编程之前,需要先进行硬件设计。
本文以STC89C52RC单片机为例,其引脚连接如下:
P0.0-P0.2:红、黄、绿LED控制信号输出;
P1.0-P1.3:车道检测器输入;
P1.4-P1.7:人行横道检测器输入。
三、软件设计
1. 程序框架
程序框架如下:
void main()
{
Init();
while(1)
{
Traffic_Control();
Pedestrian_Control();
}
}
2. 初始化函数
初始化函数主要用于设置端口方向和初始状态。
具体代码如下:
void Init()
{
P0 = 0xFF; // P0口输出高电平
P1 = 0x00; // P1口输入低电平
}
3. 交通灯控制函数
交通灯控制函数根据车流量和红绿灯状态来控制红绿灯的切换。
具体代码如下:
void Traffic_Control()
{
if(P1_0 == 0) // 车道检测器检测到车辆
{
P0_0 = 1; // 红灯亮
P0_1 = 0; // 黄灯灭
P0_2 = 0; // 绿灯灭
delay(500); // 延时500ms
P0_0 = 0; // 红灯灭
P0_1 = 1; // 黄灯亮
delay(100); // 延时100ms
P0_1 = 0; // 黄灯灭
P0_2 = 1; // 绿灯亮
}
else if(P1_1 == 0) // 车道检测器未检测到车辆,但红绿灯为绿色状态
{
delay(30000); // 延时30s,保持绿色状态
}
else if(P1_2 == 0) // 车道检测器未检测到车辆,但红绿灯为黄色状态
{
P0_1 = 0; // 黄灯灭
P0_2 = 1; // 绿灯亮
delay(20000); // 延时20s,保持绿色状态
}
else if(P1_3 == 0) // 车道检测器未检测到车辆,但红绿灯为红色状态
{
P0_0 = 0; // 红灯灭
P0_1 = 1; // 黄灯亮
delay(500); // 延时500ms
P0_1 = 0; // 黄灯灭
P0_2 = 1; // 绿灯亮
}
}
4. 行人过街控制函数
行人过街控制函数根据行人检测器和红绿灯状态来控制行人过街。
具体代码如下:
void Pedestrian_Control()
{
if(P1_4 == 0) // 行人检测器检测到行人,红绿灯为绿色状态或黄色状态
{
P0_2 = 0; // 绿灯灭
P0_1 = 1; // 黄灯亮
delay(500); // 延时500ms,保持黄色状态
P0_1 = 0; // 黄灯灭
P0_0 = 1; // 红灯亮,禁止车辆通行,允许行人通过。
while(P1_4 == 0) ; // 等待行人通过完毕,等待行人检测器恢复高电平。
delay(10000); // 延时10s,保持红色状态。
}
else if(P1_5 == 0) // 行人检测器检测到行人,红绿灯为红色状态 {
P0_0 = 0; // 红灯灭
P0_1 = 1; // 黄灯亮
delay(500); // 延时500ms,保持黄色状态
P0_1 = 0; // 黄灯灭
P0_2 = 1; // 绿灯亮,允许行人过街。
}
}
5. 延时函数
延时函数用于控制红绿灯的切换时间。
具体代码如下:
void delay(unsigned int i)
{
unsigned int j, k;
for(j=0;j<i;j++)
{
for(k=0;k<125;k++);
}
}
四、总结
本文介绍了单片机交通灯编程代码的实现方法。
通过对车流量和红绿灯状态的检测,实现了交通信号的控制和行人过街的控制。
在实际应用中,可以根据需要进行相应的修改和优化。