单片机交通灯控制程序

时间:2019-05-14 03:57:57下载本文作者:会员上传
简介:写写帮文库小编为你整理了多篇相关的《单片机交通灯控制程序》,但愿对你工作学习有帮助,当然你在写写帮文库还可以找到更多《单片机交通灯控制程序》。

第一篇:单片机交通灯控制程序

#include #define uchar unsigned char #define uint unsigned int uchar code table[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x40 };//*************digit display port******* sbit led_w1=P1^1;sbit led_w2=P1^0;sbit led_w3=P1^3;sbit led_w4=P1^2;

//*****define led port ********** sbit R1=P2^4;//east and west red led sbit Y1=P2^3;//east and west yellow led sbit G1=P2^2;//east and west green led sbit R2=P2^5;//south and north red led sbit Y2=P2^6;//south and north yellow led sbit G2=P2^7;//south and north green led

//*********define key************** sbit k0=P3^0;//emergency sbit k1=P3^1;//east and west pass sbit k2=P3^2;//south and north pass sbit k3=P3^3;//start and subtract 1 sbit k4=P3^4;//pause and add 1 sbit k5=P3^5;//set time

//*********define variable********* bit flag,flag_t;uchar dx_time,nb_time;uchar cnt,pass_time,cnt1,y_time;uchar k0num,k1num,k2num,k3num,k4num,k5num;

//*********define key******** void delay(uint i){ uint x,y;for(x=i;x>0;x--)

for(y=110;y>0;y--);} void timer0_init(){ TMOD=0x11;TH0=(65536-50000)/256;TL0=(65536-50000)%256;TH1=(65536-50000)/256;TL1=(65536-50000)%256;EA=1;ET0=1;ET1=1;}

void led_display(uchar dx,nb){ uchar dx1,dx2,nb1,nb2;dx2=dx/10;dx1=dx%10;nb2=nb/10;nb1=nb%10;if(dx>99){

led_w1=1;

led_w2=1;} else {

led_w1=0;

P0=table[dx1];

delay(5);

led_w1=1;

if(dx<10&&dx>0)led_w2=1;

else

{

led_w2=0;

P0=table[dx2];

delay(5);

led_w2=1;

} } if(nb>99){

led_w3=1;

led_w4=1;} else {

led_w3=0;

P0=table[nb1];

delay(5);

led_w3=3;

if(nb<10&&nb>0)led_w4=1;

else

{

led_w4=0;

P0=table[nb2];

delay(5);

led_w4=4;

} } } //*************light work********** void circle_led(){ if(!flag){

if(pass_time>5)

{

led_display(pass_time-5,pass_time);

R1=1;Y1=1;G1=0;

//east and west pass

R2=0;Y2=1;G2=1;

//south and north stop

}

if(pass_time<=5&&pass_time>0)

{

if(cnt>=10)led_display(pass_time,pass_time);

else led_display(100,pass_time);

R1=1;G1=1;

//east and west yellow led flash

if(cnt>=10)Y1=0;

else Y1=1;

R2=0;Y2=1;G2=1;

}

if(pass_time==0)

{

pass_time=nb_time;

flag=1;

} } else {

if(pass_time>5)

{

led_display(pass_time,pass_time-5);

R1=0;Y1=1;G1=1;

//east and west stop

R2=1;Y2=1;G2=0;

//south and north pass

}

if(pass_time<=5&&pass_time>0)

{

if(cnt>=10)led_display(pass_time,pass_time);

else led_display(pass_time,100);

R1=0;Y1=1;G1=1;

R2=1;G2=1;

//south and north yellow led flash

if(cnt>=10)Y2=0;

else Y2=1;

}

if(pass_time==0)

{

pass_time=dx_time;

flag=0;

} } }

void emergency()

//east and west,south and north stop { led_display(0,0);R1=0;Y1=1;G1=1;R2=0;Y2=1;G2=1;} void dx_pass()

//east and west pass,south and north stop { led_display(100,100);if(y_time<=5&&y_time>0){

TR1=1;

R1=0;Y1=1;G1=1;

R2=1;G2=1;

//south and north yellow led flash

if(cnt1>=10)Y2=0;

else Y2=1;} if(y_time==0){

TR1=0;

R1=1;Y1=1;G1=0;

R2=0;Y2=1;G2=1;} } void nb_pass()

//south and north pass,east and west stop { led_display(100,100);if(y_time<=5&&y_time>0){

TR1=1;

R1=1;G1=1;

if(cnt1>=10)Y1=0;//east and west yellow led flash

else Y1=1;

R2=0;Y2=1;G2=1;

} if(y_time==0){

TR1=0;

R1=0;Y1=1;G1=1;

R2=1;Y2=1;G2=0;} }

//***********keyboard scan************ void keyscan(){

if(!k5num)

{

if(k0==0)//*******emergency*******

{

delay(10);

if(k0==0)

{

while(!k0);

TR0=0;

k0num=1;

}

}

if(!k1num&&!k0num)

{

if(k1==0)

{

delay(10);

if(k1==0)

{

while(!k1);

k1num=1;

k2num=0;

y_time=5;//单方向通行时,黄灯闪烁时间

TR0=0;

TR1=1;

}

}

}

if(!k2num&&!k0num)

{

if(k2==0)

{

delay(10);

if(k2==0)

{

while(!k2);

k1num=0;

k2num=1;

y_time=5;//单方向通行时,黄灯闪烁时间

TR0=0;

TR1=1;

}

}

}

if(k3==0)

{

delay(10);

if(k3==0)

{

while(!k3);

if(k1num||k2num)pass_time=dx_time;//由东西或南北通行返回时,重新开始执行。

k0num=0;

k1num=0;

k2num=0;

k4num=0;

k5num=0;

TR0=1;

TR1=0;

flag_t=0;

}

} {

} if(!k4&&!k0num)

//pause { delay(10);if(k4==0){

while(!k4);

TR0=0;

k4num=1;} }

if(k4num==1)

//暂停键按下时,才可以调整两个方向通行时间 if(k5==0){ delay(10);if(k5==0){

k5num++;

while(!k5);

switch(k5num)

{

case 1:

TR0=1;

flag_t=1;//调整时间时,pass_time值不变。

k5num=1;

break;

case 2:

k5num=2;

break;

case 3:

TR0=0;

k5num=0;

pass_time=dx_time;//重新赋值

break;

} } } if(k5num!=0){ if(k3==0){

delay(10);

if(k3==0)

{

while(!k3);

switch(k5num)

{

case 1:

dx_time--;

if(dx_time<10)

break;

case 2:

nb_time--;

if(nb_time<10)

break;

}

}

}

if(k4==0)

{

delay(10);

if(k4==0)

{

while(!k4);

switch(k5num)

{

case 1:

dx_time++;

if(dx_time>=100)

break;

case 2:

nb_time++;

if(nb_time>=100)

break;

}

}

}

} } } void main(){ timer0_init();dx_time=45;nb_time=30;

dx_time=99;nb_time=99;dx_time=10;nb_time=10;

pass_time=dx_time;while(1){ keyscan();if(k0num)emergency();else { switch(k4num){

case 0:

if(!k1num&&!k2num)

circle_led();

else

{

if(k1num)dx_pass();

if(k2num)nb_pass();

}

break;

case 1:

switch(k5num)

{

case 0:

if(!k1num&&!k2num)

circle_led();

else

{

if(k1num)dx_pass();

if(k2num)nb_pass();

}

break;

case 1:

R1=1;Y1=1;G1=1;//调整时间时,关闭所有灯

R2=1;Y2=1;G2=1;

if(cnt<=10)

led_display(100,nb_time);

else

led_display(dx_time,nb_time);

break;

case 2:

R1=1;Y1=1;G1=1;//调整时间时,关闭所有灯

R2=1;Y2=1;G2=1;

if(cnt<=10)

led_display(dx_time,100);

else

led_display(dx_time,nb_time);

break;

}

break;

}

}

} } void timer0()interrupt 1 { TH0=(65536-50000)/256;TL0=(65536-50000)%256;cnt++;if(cnt==20){

cnt=0;

if(flag_t==0)pass_time--;//调整时间时,不执行此操作

} } void timer1()interrupt 3 { TH1=(65536-50000)/256;TL1=(65536-50000)%256;cnt1++;if(cnt1==20){

cnt1=0;

y_time--;//单方向通行时,黄灯闪烁时间。

} }

第二篇:交通灯单片机课程设计

《单片机原理与接口技术课程设计报告》

课题:以交通灯为主的多功能任务设计

班级 学号 学生姓名

指导教师

淮阴工学院 电子与电气工程学院

2015-6 1

目录

一、课程设计目的......................................................................................................3

二、设计要求..............................................................................................................3 1. 总体要求........................................................................................................3 2. 具体要求........................................................................................................3 3. 系统硬件总框图............................................................................................4 1)AT89C52单片机.......................................................................................5 3)数码管显示电路........................................................................................6 4)LED灯显示...............................................................................................7 5)键盘扫描模块............................................................................................7 6)蜂鸣器电路................................................................................................8

三、硬件电路的设计及描述......................................................................................8 1. 硬件总框图及原理图....................................................................................8 2. 主程序流程图..............................................................................................10 3. 各模块流程图..............................................................................................11 1)时间显示程序流程图..............................................................................12 2)流水灯程序流程图..................................................................................12 3)利用蜂鸣器的音乐流程图......................................................................13 4)交通灯控制..............................................................................................13

四、源程序代码........................................................................................................14

六、调试情况

六、设计心得............................................................................................................20

七、参考文献............................................................................................................20

一、设计目的

《单片机原理及应用》课程设计是一项重要的实践性教育环节,是学生在校期间必须接受的一项工程训练。在课程设计过程中,在教师指导下,应用工程的方法,通过一个简单课题的设计练习,可使学生初步体验单片机应用系统的设计过程、设计要求、完成的工作内容和具体的设计方法,了解必须提交的各项工程文件,也达到巩固、充实和综合运用所学知识解决实际问题的目的。

通过课程设计,应该能加强学生如下能力的培养:(1)独立工作能力和创造力;

(2)综合运用专业及基础知识,解决实际工程技术问题的能力;(3)查阅图书资料、产品手册和各种工具书的能力;(4)工程绘图的能力;

(5)编写技术报告和编写技术资料的能力。

二、设计要求

1.总体要求

(1)独立完成设计任务(2)绘制系统硬件总框图(3)绘制系统原理电路图

(4)制定编写设计方案,编制软件框图,完成详细完整的程序清单和注释(5)制定编写调试方案,编写用户操作使用说明书

(6)写出设计工作小结。对在完成以上文件过程所进行的有关步骤如设计思想、指标论证、方案确定、参数计算、元器件选择、原理分析等作出说明,并对所完成的设计作出评价,对自己整个设计工作中经验教训,总结收获和今后研究方向。

2.具体要求

本次工程实践的校内部分主要以单片机为基础,进行单片机软件编程,目的 3 是为了提高学生的软件编程和系统设计能力,整个设计系统包括两个部分,硬件及软件部分,硬件部分已经制作成功,学生只需要掌握其原理和焊接相应的元器件,掌握元器件的辨别和元器件的作用以及应用场所即可,另外对所焊接的电路还需要进行仔细的检查,判断是否有焊接错误的地方或者短路的地方,对出现的异常情况要能够根据现象判别原因,并具备解决问题的能力,从而切实提高学生的硬件电子电路的分析、判断能力。

软件编程是本次课程设计的重要环节。在为期两周的工程实践中,将占据主要时间,完成的软件编程任务主要包括以下几点:

1)、熟悉Keil C51编程平台及相关编程软件

2)、编写、调试蜂鸣器、继电器动作、方波程序并进行软硬件联调 3)、编写、调试LED流水灯(循环显示)程序并进行软硬件联调 4)、编写、调试键盘扫描子程序并进行软硬件联调 5)、编写、调试数码管动态扫描程序并进行软硬件联调 6)、基于交通灯的多功能控制设计

其中前五个内容是后两个内容的基础,主要是编制一些子程序,为后继的整个系统设计打下基础。交通灯控制是在五个课题中选做的一个设计,是一个简单的单片机编程设计,来实现智能交通灯的多功能作用。

3.系统硬件总框图

图1 系统设计总框图

此次课程设计,AT89C52是一种带2K字节闪烁可编程可擦除只读存储器(FPEROM—Falsh Programmable and Erasable Read Only Memory)的低电压,高性能CMOS 8位微处理器,俗称单片机。1)AT89C52单片机

设计中所用的单片机型号为AT89C52,其主要功能为:

AT89C52是低功耗、高性能的CMOS 8位单片机。片内带有8KB的Flash存储器,且允许在系统内改写或用编程器编程。另外,AT89C52的指令系统和引脚与80C52完全兼容,所以,近几年AT89C52单片机应用极为广泛。

AT89C52单片机除了含有8KB的Flash存储器外,片内还有256 B的RAM,32条I/O口线,3个16位定时/计算器、6个中断源、1个全双工串行口等。同时,与80C52一样,有空闲和掉电两种节电运行方式。

AT89C52引脚如下图所示:

图2 AT89C52引脚

AT89C52单片机为40脚双列直插封装的8 位通用微处理器,采用工业标准的C51内核,在内部功能及管脚排布上与通用的8xc52 相同,其主要用于会聚调整时的功能控制。功能包括对会聚主IC 内部寄存器、数据RAM及外部接口等功能部件的初始化,会聚调整控制,会聚测试图控制,红外遥控信号IR的接收解码及与主板CPU通信等。

2)DS1302模块

DS1302的RST是复位/片选线,通过把RST输入驱动置高电平来启动所有的数据传送。当RST为高电平时,所有的数据传送被初始化,允许对DS1302进行操作。如果在传送过程中RST置为低电平,则会终止此次数据传送,I/O引脚变为高阻态。

其管脚图如下:

图3 DS1302管脚图

各引脚功能:Vcc1为后备电源,VCC2为主电源,X1和X2是振荡源,SCLK为输入端

RST输入有两种功能:首先,RST接通控制逻辑,允许地址/命令序列送入移位寄存器;其次,RST提供终止单字节或多字节数据的传送手段。

3)数码管显示电路

图4 数码管显示电路

设计中采用六位共阴极数码管,通过单片机STC89C52的P0口控制其位选和段选,以达到动态显示相应数值的效果。在其位选控制部分,采用了一个9012型三极管,要求当P0口输出低电平时,位选成功。

所谓动态扫描就是指我们采用分时的方法,轮流控制各个显示器的COM端,6 使各个显示器轮流点亮。在轮流点亮扫描过程中,每位显示器的点亮时间是极为短暂的(约1ms),但由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位显示器并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感。

4)LED灯显示

图5 LED显示模块

本次课程设计中,“程序语言”通过“翻译”软件“翻译”成单片机所需的二进制代码,单片机可工作。要用外加电源和分压电阻来控制低电平驱动点亮,因为单片机不能直接高电平驱动LED灯。如图D1-D8和R1、R2以及R6-R11连接到单片机IO口,当P1口某脚变低时相应LED发光。实现LED灯的闪烁,只需利用编程方法依次从低位到高位逐个变为低电平,等待少许时刻再变高即可。

5)键盘扫描模块

图6 按键输入电路

本模块四个开关分别用于控制流水灯控制电路,时间显示电路,音乐蜂鸣器电路,交通灯四部分功能。当按下其中一个开关时,该部分电路导通,给单片机 发出地址信号,实现其中一项功能的运做,如图4所示。

KEYA键:其功能是当该键按下时,蜂鸣器程序工作; KEYB键:其功能是当该键按下时,流水灯程序工作;

KEYC键:其功能是当该键按下时,数码管动态扫描程序工作; KEYD键:其功能是当该键按下时,交通灯程序工作。

6)蜂鸣器电

图7 蜂鸣器电路

蜂鸣器单元电路是通过一个PNP三极管来放大驱动蜂鸣器,蜂鸣器的正极接到+5V电源上面,蜂鸣器的负极接到三极管的发射极,三极管的基极经过限流电阻后由单片机的P3.4控制。

当输出高电平时,三极管截止,蜂鸣器的两引脚间的直流电压接近于0V,没有电流流过线圈,蜂鸣器不发声;当输出低电平时,三极管导通,使蜂鸣器的两个引脚间获得将接近+5V的直流电压,这样蜂鸣器的电流形成回路,发出声音。因此,我们可以通过程序控制IO口输出的电平来控制蜂鸣器是否发出声音,实现各种可能音响的产生。

三、硬件电路的设计及描述

1.硬件总框图及原理图

图8 硬件总框图

图9 硬件总原理图

2.主程序流程图

3.各模块流程图 1)时间显示程序流程图

2)流水灯程序流程图

3)利用蜂鸣器的音乐流程图

4)智能交通灯

四、源程序代码

/******************************************************************** * 文件名

: 4个功能由按键控制.c * 描

: 按下A键,实现蜂鸣器动作。

按下B键,实现LED流水灯循环显示。

按下C键,实现数码管动态扫描显示。

按下D键,实现交通灯功能。* 创建人

***********************************************************************/ #include #include

#define uint unsigned int

// 无符号整形习惯的定义

#define uchar unsigned char

//无符号字符型习惯的定义 void buzz_key(void);

//子函数声明 void led_key(void);void tube_key(void);void traffic(void);unsigned char code duanma[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 0 1 2 3 4 5 6 7 8 9

unsigned char code weima[6]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};

// 选择哪个数码管

unsigned char temp[6];uchar i=35;uchar k=30;uchar l=5;uchar j;uchar b;

//定义变量

sbit duan=P2^6;//定义管脚 sbit wei=P2^7;sbit key_A=P3^4;sbit key_B=P3^5;sbit key_C=P3^6;sbit key_D=P3^7;sbit buzz=P2^3;sbit DIOLA=P2^5;sbit csda=P3^2;sbit red=P1^0;//交通灯管脚定义 sbit green=P1^1;sbit yellow=P1^2;/******************************************************************** * 名称 : Delay_1ms()* 功能 : 延时子程序,延时时间为 1ms * x * 输入 : x(延时一毫秒的个数)* 输出 : 无

***********************************************************************/

void Delay_1ms(unsigned int t){ unsigned char x,y;for(x=t;x>0;x--)for(y=110;y>0;y--);

}

/******************************************************************** * 名称 : Main()* 功能 : 实现蜂鸣器,流水灯,数码管,交通灯

***********************************************************************/ void main(){

DIOLA=0;//流水灯锁存器关 流水灯未选通

wei=0;//位选关

duan=1;

P0=0;

duan=0;

csda=0;

while(1){

if(key_A==0 || key_B==0 || key_C==0|| key_D==0)

{

if(key_A==0)

//A键按下

{

buzz_key();

//调用蜂鸣器子程序

}

else if(key_B==0)//B键按下

{

led_key();

//调用流水灯子程序

}

else if(key_C==0)//C键按下时

{

tube_key();//调用数码管显示子程序

}

else

//D键按下时

{

traffic();

//调用交通灯子程序

i=35;

k=30;

l=5;

return;

}

}

} }

/******************************************************************** * 名称 : buzz_key(void)* 功能 : 蜂鸣器子程序

***********************************************************************/

void buzz_key(void)

{

DIOLA=0;wei=0;

buzz=0;

//蜂鸣器响

while(key_B&&key_C&&key_D&&!key_A);

buzz=1;

//关蜂鸣器

}

/********************************************************************* * 名称 : led_key(void)* 功能 : 流水灯子程序

***********************************************************************/ void led_key(void){

DIOLA=1;b=0xfe;

P1=b;//11111110 while(key_B==0){

b=_crol_(b,1);

//左移11111101

Delay_1ms(500);

P1=b;

//111111011

Delay_1ms(500);

}

while(key_A&&key_B&&key_C&&key_D);

P1=0xff;

}

/******************************************************************** * 名称 : tube_key(void)* 功能 : 数码管子程序

***********************************************************************/

void tube_key(void){

DIOLA=0;

//流水灯使能端置0 while(key_C==0)

{ unsigned int i;

for(i=0;i<6;i++)

{

wei=1;

P0=weima[i];

//位选信号

wei=0;

duan=1;

P0=duanma[i];//段选信号

duan=0;

Delay_1ms(500);

}

duan=1;

P0=0;

duan=0;

//清零

}

}

/******************************************************************** * 名称 : traffic_key(void)* 功能 : 交通灯子程序

***********************************************************************/

void traffic(void)

{

DIOLA=0;

while(key_D==0)

{

if(i>0)

{

DIOLA=1;

b=0xfe;

P1=b;//11111110

for(j=0;j<40;j++)

{

P0 = 0;

wei=1;

//消隐

P0 = weima[0];

wei=0;

duan=1;

//第1位数码管显示

P0 = duanma[(i / 10)%10];//在这里取 i 的个位数

Delay_1ms(40);

//延时40毫秒后显示下一个数

P0 = 0;

wei=1;

//消隐

P0 = weima[1];

wei=0;

duan=1;

//第2位数码管显示

P0 = duanma[i % 10];

//在这里取 i 的个位数

Delay_1ms(40);

//延时40毫秒后显示下一个数

}

i--;

}

else if(k>0)

{

DIOLA=1;

b=0xfd;

P1=b;//11111110

for(j=0;j<40;j++)

{

P0 = 0;

wei=1;

//消隐

P0 = weima[0];

wei=0;

duan=1;

//第1位数码管显示

P0 = duanma[(k / 10)%10];//在这里取 i 的个位数

Delay_1ms(40);

//延时3毫秒后显示下一个数

P0 = 0;

wei=1;

//消隐

P0 = weima[1];

wei=0;

duan=1;

//第2位数码管显示

P0 = duanma[k % 10];

//在这里取 i 的个位数

Delay_1ms(40);

//延时3毫秒后显示下一个数

}

k--;

}

else if(l>0)

{

DIOLA=1;

b=0xfb;

P1=b;//11111110

for(j=0;j<40;j++)

{

P0 = 0;

wei=1;

//消隐

P0 = weima[0];

wei=0;

duan=1;

//第1位数码管显示

P0 = duanma[(l / 10)%10];//在这里取 i 的个位数

Delay_1ms(40);

//延时3毫秒后显示下一个数

P0 = 0;

wei=1;

//消隐

P0 = weima[1];

wei=0;

duan=1;

//第2位数码管显示

P0 = duanma[l % 10];

//在这里取 i 的个位数

Delay_1ms(40);

//延时3毫秒后显示下一个数

}

l--;

}

}

}

五、设计心得

通过两个星期的实验,我的设计虽然有一些毛病,但总体上还是成功的。两周的时间虽然短暂,但我从中受益匪浅,毕竟在课堂学习到的东西真真正正的用到实际中还是有很大困难的,要把理论运用于实践确实并非一件易事。我从最初的设想设计一个什么样的数字电路到绘制电路图,然后打印排版,最后矫正设计中的漏洞与不足,整个过程我翻阅了大量的资料。

这次交通灯的课程设计,也使我得到了一次用专业知识、专业技能分析和解决现实问题的能力。使我在单片机的基本原理、单片机应用学习过程中,以及在常用编程设计思路技巧的掌握方面都能向前迈了一大步,为日后成为一名合格的应用型人才打下良好的基础。综合课程设计让我把以前学习到的知识得到巩固和进一步的提高认识,对已有知识有了更深层次的理解和认识。在此,由于自身能力有限,在课程设计中碰到了很多的问题,我通过查阅相关书籍、资料以及和周围同学交流得到解决。

还有交通灯是我们生活中非常常见的一种东西,对于我们学以致用的这种能力得到了很好锻炼,能够为我们以后的工作于学习打下基础。

六、参考文献

1.《单片机原理及接口技术》 李朝青 北京航空航天大学出版社,2004 2.《单片机原理及应用》 李全力 高等教育出版社,2001 3.《电子系统设计与实践》 杨刚,周群 电子工业出出版社,1997 4.《单片机微型计算机技术》 刘国荣 机械工业出版社,1997 5.《数字电子技术》 杨志忠 高等教育出版社,2003 6.《电子技术》 胡宴如 高等教育出版社,2001 7.《电子线路CAD》 王延才 机械工业出版社,2001 8.《单片机应用技术选编》 何利民 北京航空航天大学出版社,1996 9.《单片机应用技术》 吴国经 中国电力出版社,2004 10.《单片机及接口技术实践教程》 胡健 北京机械工业出版社,2002 11.《使用接口技术》 李广军 成都电子科技大学出版社,1998

第三篇:单片机:交通灯控制系统设计

交通灯控制系统设计

摘要:本系统由单片机系统、键盘、LED 显示、交通灯演示系统组成。系统包括人行道、左转、右转、以及基本的交通灯的功能。系统除基本交通灯功能外,还具有倒计时、时间设置、紧急情况处理、分时段调整信号灯的点亮时间以及根据具体情况手动控制等功能。关键词:AT89S51,交通规则

一、方案比较、设计与论证 1 电源提供方案

为使模块稳定工作,须有可靠电源。我们考虑了两种电源方案

方案一:采用独立的稳压电源。此方案的优点是稳定可靠,且有各种成熟电路可供选用;缺点是各模块都采用独立电源,会使系统复杂,且可能影响电路电平。方案二:采用单片机控制模块提供电源。改方案的优点是系统简明扼要,节约成本;缺点是输出功率不高。综上所述,我们选择第二种方案。2 显示界面方案

该系统要求完成倒计时、状态灯等功能。基于上述原因,我们考虑了三种方案: 方案一:完全采用数码管显示。这种方案只显示有限的符号和数码字苻,无法胜任题目要求。

方案二:完全采用点阵式LED 显示。这种方案实现复杂,且须完成大量的软件工作;但功能强大,可方便的显示各种英文字符,汉字,图形等。

方案三:采用数码管与点阵LED 相结合的方法因为设计既要求倒计时数字输出,又要求有状态灯输出等,为方便观看并考虑到现实情况,用数码管与LED灯分别显示时间与提示信息。这种方案既满足系统功能要求,又减少了系统实现的复杂度。权衡利弊,第三种方案可互补一二方案的优缺,我们决定采用方案三以实现系统的显示功能。3 输入方案:

题目要求系统能手动设灯亮时间、紧急情况处理,我们讨论了两种方案: 方案一:采用8155扩展I/O 口及键盘,显示等。该方案的优点是:

使用灵活可编程,并且有RAM,及计数器。若用该方案,可提供较多I/O 口,但操作起来稍显复杂。

方案二: 直接在IO口线上接上按键开关。因为设计时精简和优化了电路,所以剩余的口资源还比较多,我们使用四个按键,分别是K1、K2、K3、K4。由于该系统对于交通灯及数码管的控制,只用单片机本身的I/O 口就可实现,且本身的计数器及RAM已经够用,故选择方案二。

二、理论分析与计算

1.交通灯显示时序的理论分析与计算

对于一个交通路口来说,能在最短的时间内达到最大的车流量,就算是达到了最佳的性能,我们称在单位时间内多能达到的最大车流为车流量,用公式:车流量= 车流 / 时间 来表示。

先设定一些标号如图2-1 所示。

说明:此图为直方图,上边为北路口灯,右边为东路口灯,下边为南路口灯,左边为西 路口灯。

图2-2 所示为一种红绿灯规则的状态图,分别设定为S1、S2、S3、S4,交通灯以这四 的状态为一个周期,循环执行(见图2-3)。

请注意图2-1b和图2-1d,它们在一个时间段中四个方向都可以通车,这种状态能在

一定的时间内达到较大的车流量,效率特别高。

依据上述的车辆行驶的状态图,可以列出各个路口灯的逻辑表,由于相向的灯的状态图

是一样的,所以只需写出相邻路口的灯的逻辑表;根据图2-3 可以看出,相邻路口的灯它

们的状态在相位上相差180°。因此最终只需写出一组S1、S2、S3、S4的逻辑状态表。

如表2-1 所示。

表中的“×”代表是红灯亮(也代表逻辑上的0),“√”是代表绿灯亮(也代表逻辑上 的1),依上表,就可以向相应的端口送逻辑值。2.交通灯显示时间的理论分析与计算

东西和南北方向的放行时间的长短是依据路口的各个方向平时的车流量来设定,并且

S1、S2、S3、S4各个状态保持的时间之有严格的对应关系,其公式如下所示。T-S1+T-S2=T-S3 T-S2=T-S4 T-S1=T-S3 我们可以依据上述的标准来改变车辆的放行时间。按照一般的规则,一个十字路口可分

为主干道和次干道,主干道的放行时间大于次干道的放行时间,我们设定值时也应以此为参 考。

三、电路图及设计文件 1.灯控制电路设计

由于32个LED 来实现红绿灯状态,若直接接在单片机的口线,路口倒计时的显示就不

能实现,所以本次设计中采用一种新型的电路如图3-1 所示。

图中74LS04的作用是倒相和驱动,它输出的电流大约48mA,实际测试发现足以满足要

求,而且发光管也能达到足够的亮度。

观察图可以看出:两组发光管(一组红、一组绿)由于反相器的作用,其逻辑状态恰恰 相反。

图中和电阻串联的二极管的作用是为了分压,防止因上下两组发光管分压不同导致逻辑 的错误。

共四组和上述相同的电路分别代表东西南北四个方向的红绿灯,使用两片74LS04 作为 驱动。

2.倒计时显示电路设计

前面已经分析过相向的灯的状态和倒计时都是相同的,所以为了节省,采用两组四个数码管

作为倒计时的显示;同时为了节省口资源,采用串口显示的方式驱动数码管。见图3-2 所 示。

四、程序设计思路与流程图 1.主程序流程图

主程序中主要是一个死循环,不停的循环四个状态,如图4-1 所示。

2.按键子程序流程图

它包含倒计时调整和紧急状态两个状态。

主程序中放了一个按键的判断指令,当有按键按下的时候,程序就自动的跳转到按键子

程序处理。当检测到K2键按下的时候就自动返回到主程序。当出现紧急的情况的时候,按下K3或者K4 就切换到紧急状态,当紧急事件处理完毕 的时候,按下K2,就可以返回正常状态。

五、测试、数据及结果分析 1.状态灯显示测试

当电路连接完毕后,将写好的测试程序刷写到芯片内,K1 和K2分别给端口送高电平和

低电平,通电即可检测。2.数码管的测试

将串口的和电路板上的接口连接,将写好的测试程序刷写到芯片内,开电源即可测试。

3.整体电路测试

系统上电,刷写好程序即可开始测试,观测一个周期(共计S1~S4四个状态,默认140 秒)灯的显示状态是否正常,同时观察倒计的计数是否正常。

六、总结

由于使用的是单片机作为核心的控制元件,使得电路的可靠性比较高,功能也比较强大,而且可以随时的更新系统,进行不同状态的组合。

但是在我们设计和调试的过程中,也发现了一些问题,譬如红灯和绿灯的切换还不够迅

速,红绿灯规则不效率还不是很高等等,这需要在实践中进一步完善。附录 系统总体电路图

1.满足南北向红绿灯亮,东西向红灯亮,占25秒——南北向黄灯亮,东西向红灯亮,占5秒——南北向红灯亮,东西向绿灯亮,占25秒——南北向红灯亮,东西向黄灯亮,占5秒。如此循环,周而复始。2.十字路口要有数字显示,提示行人把握时间:当某方向绿灯亮时,置显示器为24,然后以每秒减1计数方式工作,直到减为0,绿灯灭,黄灯亮。黄灯灭,红灯亮时,再次置显示器为29,并开始减计数,直到为0,十字路口红绿灯交换,完成一次工作循环。

3.可手动调整和自动调整,夜间为黄灯闪耀。下面是一个单片机交通灯程序 /*

****************************************************************************************** * *

* Keil C 89S51 交通信号控制程序 * *(C)版权所有 Dai_Weis@hotmail.com * * *

****************************************************************************************** */

#include “reg51.h” #define UINT unsigned int #define ULONG unsigned long #define UCHAR unsigned char /*

信号灯变量

南北方向绿灯

sbit n_bike_g = P1^0;//自行车

sbit n_right_g = P1^1;//右转

sbit n_up_g = P1^2;//直行

sbit n_left_g = P1^3;//左转 调头

南北方向红灯

sbit n_bike_r = P1^4;//自行车

sbit n_right_r = P1^5;//右转

sbit n_up_r = P1^6;//直行

sbit n_left_r = P1^7;//左转 调头 南北方向黄灯

sbit n_bike_y = P3^0;//自行车

sbit n_right_y = P3^1;//右转

sbit n_up_y = P3^2;//直行

sbit n_left_y = P3^3;//左转 调头

东西方向绿灯

sbit e_bike_g = P2^0;//自行车

sbit e_right_g = P2^1;//右转

sbit e_up_g = P2^2;//直行

东西方向红灯

sbit e_bike_r = P2^4;//自行车

sbit e_right_r = P2^5;//右转

sbit e_up_r = P2^6;//直行

东西方向黄灯

sbit e_bike_y = P3^4;//自行车

sbit e_right_y = P3^5;//右转

sbit e_up_y = P3^6;//直行

*/ //延时

void delay(UINT t, UINT s){ while(t){ UINT i;

for(i = 0;i < s;i++){ } t--;} }

//信号灯状态

void time_x(UCHAR P_P1, UCHAR P_P2, UCHAR P_P3){

P1 = P_P1;P2 = P_P2;P3 = P_P3;delay(150, 65535);}

void time_s(UCHAR P_P1, UCHAR P_P2, UCHAR P_P3, UCHAR P_P11, UCHAR P_P22){ UINT i;

for(i = 0;i < 3;i ++){

P1 = P_P1;P2 = P_P2;delay(5, 65535);P1 = P_P11;P2 = P_P22;delay(5, 65535);}

P1 = P_P1;P2 = P_P2;P3 = P_P3;delay(10, 65535);} //主程序

void main(){

P1 = P2 = P3 = 0x0;while(1){

time_x(0xA5, 0x38, 0x0);

time_s(0xA4, 0x38, 0x1, 0xA5, 0x38);time_x(0x96, 0x52, 0x0);

time_s(0x92, 0x52, 0x4, 0x96, 0x52);time_x(0x5A, 0x52, 0x0);

time_s(0x50, 0x50, 0x2A, 0x5A, 0x52);time_x(0xF0, 0x25, 0x0);

time_s(0xF0, 0x24, 0x20, 0xF0, 0x25);time_x(0xD2, 0x16, 0x0);

time_s(0xD0, 0x10, 0x62, 0xD2, 0x16);} }

给你一个定时控制的信号系统,我只做的简单的测试,至于延时我用的软件,你自己想办法。^_^

Dai_Weis 于 2005-5-4 13:43:23 重新给你说明

/*

*********************************************************************************** * *

* Keil C AT89S51 交通信号控制程序 * *(C)版权所有 Dai_Weis@hotmail.com * * *

*********************************************************************************** 开发说明:

固定时间信号变换,南北设置调头、左传、直行、右转、自行车。

东西设置左传、直行、右转、自行车。

时序状态:

红 绿 红 绿

序号 左 前 右 自 左 前 右 自 前 右 自 前 右 自1 0 1 0 0 1 0 1 1 1 1 0 0 0 2 1 0 0 1 0 1 1 0 1 0 1 0 1 0 3 0 1 0 1 1 0 1 0 1 0 1 0 1 0 4 1 1 1 1 0 0 0 0 0 1 0 1 0 1 5 1 1 0 1 0 0 1 0 0 0 1 1 1 0 */

另外修正个错误

while(1){

time_x(0xA5, 0x70, 0x0);time_s(0xA4, 0x70, 0x1, 0xA5, 0x70);

材料: 1、89S51 11.0592M 晶振

1K电阻、10UF电容

12个灯,红、黄、绿各四个,12个1K电阻

,十字路口嘛。蜂鸣器一个。

按键一个,按键复位

采用AT89s51型号的单片机,由于交通十字路口的对称性,所以一个引脚可以同时控制两个灯,将发光二极管分别接到P1各个引脚,在其中加入一个时振荡当电路,来控制时间,在P3.0引脚接入蜂鸣器只黄灯亮的时候发出声响,这里我们让每次黄灯亮的时候发出六声响,通过C程序的控制就可以实现,每次循环是10秒。2、9cm*15cm万用板 1片 单片机及IC座 1套 12M晶振 1只 22P电容 2只 10uF电容 1只 10K电阻 1只 1K排阻 1只 两位一体数码管 2只 DC座 1只 自锁开关 1只

发光二极管红绿黄

各4只 按键 7只 USB电源线 1条 导线

若干

1、基于51系列单片机(型号:STC89C52、AT89C51/C52、AT89S51/S52,随机选择,如有特

殊要求请与店主讨论)设计实现。(以上几种单片机全部为51系列单片机,除了名字不一样外,功能及应用完全一样,互相

兼容)

2、两个两位一体数码管显示东西、南北方向时间。

3、四方向各有红绿黄三颗灯。

4、七个按键操作,分别是:禁止通行、东西通行、南北通行、时间加、时间减、切换方向、确认。

第四篇:基于单片机的交通灯设计

基于单片机的交通灯设计

设计程序:

#include #define uchar unsigned char /**************************变量、控制位定义**************************/ uchar code table[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//0~~9段选码

//共阳极

uchar

code table1[5]={0xf3,0xf5,0xde,0xee,0xf6};/*各种状态下红绿灯段选码, 状态1:A绿灯,B红灯;状态2:A黄灯亮,B红灯;状态3:A红灯,B绿灯;状态4:A红灯,B黄灯亮;状态5:A红灯,B红灯;*/ uchar

code tab[4]={0x1E,0x2D,0x4E,0x8D};//数码管显示位选码 sbit key1=P1^0;//放行A sbit key2=P1^1;//放行B sbit key3=P1^2;//禁止通行

uchar EW=40,SN=30,K1_T=15,K2_T=15,K3_T=20;//初始化交通灯时间 uchar count;//计时中断次数 uchar i,j;//循环控制变量 char Timer;//子程序说明语句 void Process();void Display(uchar j);void Delay(uchar a);/**************************主程序**************************/ main(){ IP=0X02;//设置定时器中断为高优先级//成为中断嵌套

TMOD=0x01;//定时器工作方式

TH0=0x3C;//定时器初始化

TL0=0xB0;IT0=1;//中断触发方式为下降沿触发

EA=1;//CPU开中断

ET0=1;//开定时中断

TR0=1;//启动定时

EX0=1;//启动外部中断0 while(1)

{

Process();

} } /*************************交通灯显示子程序*************************/ void Display(uchar j)//j控制显示table中连续位的起始点 {

char h,l;

h=Timer/10;//EW通行时间十位

l=Timer%10;//EW通行时间个位

for(i=0;i<4;)//按位显示通行状况及时间 {

P0=table1[j];//通行状况显示

P3=tab[i];//位选显示

i++;

//j++;

if(i%2)//两位计时显示

{

P2=table[l];

Delay(400);

}

else

{

P2=table[h];

Delay(400);

} } Delay(5);

//设置扫描时间

} /*********键控*******/ void Keyboard()interrupt 0 using 0 {

if(key1==0)

{ Timer=K1_T;

while(Timer>0)

{

j=0;

Display(0);

//显示一次

}

if(key2==0)

{

Timer=K2_T;

while(Timer>0)

{

j=2;

Display(j);

}

if(key3==0)

{

Timer=K3_T;

while(Timer>0)

{

j=4;

Display(j);

}

} } /**************************延时子程序**************************/ void Delay(uchar a)//循环a次 { uchar x;x=a;while(x--){;} }

/************************TO计时中断服务程序************************/ void timer0(void)interrupt 1 using 1//T0中断 { TH0=0x3C;TL0=0xB0;//定时计数初值

count++;//中断溢出一次count+1 if(count==20){

Timer--;

count=0;//中断次计数,count回,倒计时时间

} } /**************************亮灯控制**************************/ void Process(){ Timer=EW;//初始化方向通行时间

while(Timer>3)//状态:A绿灯,B红灯;{

j=0;

Display(j);//调用显示函数

} while(Timer>0)//状态:A黄灯亮,B红灯;{

j=1;

Display(j);

} Timer=SN;while(Timer>3)//状态:A红灯,B绿灯;{

j=2;

Display(j);} while(Timer>0)//状态:A红灯,B黄灯亮;{

j=3;

Display(j);

}

}

电路图如下:

第五篇:基于单片机的交通灯控制系统

单片机原理及系统课程设计报告

基于单片机的交通灯控制系统 引言

单片机是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计时器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的微型计算机系统,在工业控制领域具有广泛的应用。本文设计了基于单片机的交通灯控制系统以AT89C51单片机为核心芯片,通过控制三色LED灯的亮灭来控制各车道的通行。设计方案及原理

本系统由AT89C51单片机、红、黄、绿LED交通信号灯、共阴极数码管、紧急通车开关等模块组成该电路具有设计简单,显示亮度高,能耗小,可靠性高灯特点。其总体设计框图如图1所示。

复位电路七段数码管倒计时显示电路AT89C51晶振电路A、B车道LED显示电路按键电路

图1 系统总体设计方框图

2.1 系统设计

交通灯控制系统主要控制A,B两车道的交通,以AT89C51单片机为核心芯片,通过控制三色LED灯的亮灭来控制各车道的通行;另外通过3个按键来模拟各车道有无车辆的情况和有紧急车辆的情况。根据设计要求,制定总体设计思想如下:

(1)用AT89C51单片机控制交通灯电路,晶振采用12MHz。(2)用发光二极管模拟交通信号灯,用按键开关模拟车辆检测信号。

(3)有紧急车辆通过时,按下K3开关使A、B车道均为红灯,禁行20s。此时,

下载单片机交通灯控制程序word格式文档
下载单片机交通灯控制程序.doc
将本文档下载到自己电脑,方便修改和收藏,请勿使用迅雷等下载。
点此处下载文档

文档为doc格式


声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:645879355@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。

相关范文推荐

    基于单片机的交通灯控制系统设计

    基于单片机的交通灯控制系统设计 摘要:十字路口车辆穿梭,行人熙攘,车行车道,人行人道,有条不紊。那么靠什么来实现这井然秩序呢?靠的就是交通信号灯的自动指挥系统。交通信号灯控......

    基于单片机的交通灯控制系统设计

    P10P11P12P13设置键加键减键模式键P00P01P02P03P04P05P06U18765P134P123P112P101P1.7P1.6P1.5P1.4P1.3P1.2P1.1/T2EXP1.0/T2P3.7/RDP3.6/WRP3.5/T1P3.4/T0P3.3/INT1P3.2/INT......

    单片机控制交通灯的案例

    单片机控制交通灯 AT89C51单片机及由Keil 软件编写单片机程序,并且通过Proteus仿真测试,设计一个交通灯系统,实现简单的交通灯的管理功能。在交通灯系统的管理中,用发光二极管模......

    单片机交通灯综合实验报告(大全5篇)

    河 北 工 业 大 学 实验报告 学院: 专业:班级: 姓名:学号:实验课程:单片机应用系统设计开发入门 指导教师: 实验名称: 交通信号灯控制实验实验时间:2019 年5月 23 日2019 年 5 月 23......

    交通灯单片机实现实习报告

    单 片 机 课 程 设 计学院: 专业: 班级: 小组成员:交通灯单片机课程设计 SECOND1 EQU 30H ;东西路口计时寄存器 LED_G1 BIT P1.0 ;东西路口绿灯 LED_Y1 BIT P1.1 ;东西路......

    基于C51单片机的交通灯控制系统

    基于C51单片机的交通灯控制系统 1、实验方案论证: 进行十字路口的交通信号灯控制电路设计,画出电路原理图及实验电路图,进行软件编程、以及使用说明文档的建立等一整套工作任务......

    基于单片机AT89C51的交通灯控制器的设计

    2014届本科生毕业设计分类号:TP368.1 题目:基于单片机AT89C51的交通灯控制器的设计 姓 名: 张建猛 学 号 : 2010080870 学 院: 机械与电子工程学院 专 业: 自动化 指导教师职称: 胡......

    基于AT89S51单片机多功能交通灯控制系统设计下载

    交通灯控制系统设计 摘要:本系统由单片机系统、键盘、LED 显示、交通灯演示系统组成。系统包括人行道、左转、右转、以及基本的交通灯的功能。系统除基本交通灯功能外,还具有......