第一篇:基于单片机的交通灯设计
基于单片机的交通灯设计
设计程序:
#include
//共阳极
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);
}
}
电路图如下:
第二篇:交通灯单片机课程设计
《单片机原理与接口技术课程设计报告》
课题:以交通灯为主的多功能任务设计
班级 学号 学生姓名
指导教师
淮阴工学院 电子与电气工程学院
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
#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
第三篇:单片机交通灯控制程序
#include
//*****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--;//单方向通行时,黄灯闪烁时间。
} }
第四篇:基于单片机的交通灯控制系统设计
P10P11P12P13设置键加键减键模式键P00P01P02P03P04P05P06U18765P134P123P112P101P1.7P1.6P1.5P1.4P1.3P1.2P1.1/T2EXP1.0/T2P3.7/RDP3.6/WRP3.5/T1P3.4/T0P3.3/INT1P3.2/INT0P3.1/TXDP3.0/RXDP2.7/A15P2.6/A14P2.5/A13P2.4/A12P2.3/A11P2.2/A10P2.1/A9P2.0/A8P0.7/AD7P0.6/AD6P0.5/AD5P0.4/AD4P0.3/AD3P0.2/AD2P0.1/AD1P0.0/AD0******23222***373839P37P36P35P34P22P23P24D7D4P27P26P25P24P23P22P21P20P07P06P05P04P03P02P01P0098765432110KP27LED-REDD92H1HD1D6P25LED-YELLOWD11P26LED-YELLOWLED-GREENLED-REDC31uF313029EAALEPSEND12P26R0100RP1P25LED-GREENLED-GREENC120PF9RSTD5P00P01P02P03P04P05P06LED-YELLOWD3P27LED-REDX1C220PF12M19LED-REDLED-GREENLED-YELLOWP24P23P22XTAL1AT89C51Q1PNPQ2PNPQ3PNPQ4PNPP34P35657U2SCKSDAWP24C02CA0A1A2123R151R1HR251R2HR351R3HR451R4HP36P37P21P00P01P02P03P04P05P0651R51R51R51R2H1HR19R20R21P20R223H4HXTAL2P00P01P02P03P04P05P0618D2D10D83H4H
#include
//调用单片机头文件
#define uchar unsigned char
//宏定义“uchar”代替“unsigned char”。#define uint unsigned int
//宏定义“uint”用来定义无符号整型数。
//数码管段选定义 0
7
uchar code smg_du[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90, //
A B C
D
E
F 不显示
0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff};//断码
uchar dis_smg[8] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8};uchar smg_i = 4;
//显示数码管的个位数
//数码管位选定义
sbit smg_we1 = P2^0;
//数码管位选定义 sbit smg_we2 = P2^1;sbit smg_we3 = P3^6;sbit smg_we4 = P3^7;
char dx_s = 0;//东西
南北 倒计时变量 sbit dx_red
= P2^4;
//东西红灯 sbit dx_green = P2^3;//东西绿灯 sbit dx_yellow = P2^2;//东西黄灯
sbit nb_red
= P2^7;//南北红灯 sbit nb_green = P2^6;//南北绿灯 sbit nb_yellow = P2^5;//南北黄灯
sbit scl=P3^4;//写24C02时钟
sbit sda=P3^5;//写24C02数据
uchar flag_jtd_mode;//交通灯的模式 根据时间
bit flag_1s = 0;bit flag_500ms;bit flag_dx_nb;uchar flag_5m_value;uchar i;//东西南北模式
uchar flag_alarm;//模式
uchar dx_time = 30,nb_time = 20;
//东西、南北的时间 uchar flag_jdgz;
//交通管制
//---延时函数---// void delay(){;;}
void start()//起始信号 { sda=1;delay();scl=1;delay();sda=0;delay();}
void stop()//停止信号 { sda=0;delay();scl=1;delay();sda=1;delay();}
void respons()//应答信号 { uchar i;scl=1;delay();while((sda==1)&&(i<250))i++;scl=0;delay();}
void init()//初始状态,24C02的数据和时钟线都拉高 { sda=1;delay();scl=1;delay();}
void writebyte(uchar date)//写24C02 { uchar i,temp;temp=date;for(i=0;i<8;i++){
temp=temp<<1;
scl=0;
delay();
sda=CY;
delay();
scl=1;
delay();} scl=0;delay();sda=1;delay();} uchar readbyte()//读24C02 { uchar i,k;scl=0;delay();sda=1;delay();
for(i=0;i<8;i++){
scl=1;
delay();
k=(k<<1)|sda;
scl=0;
delay();} return k;}
void writeadd(uchar address,uchar date)//写24C02 {
start();//起始信号
writebyte(0xa0);//写入器件地址写 respons();
writebyte(address);//写入存储单元地址 respons();
writebyte(date);//写入数据 respons();
stop();//停止信号 }
uchar readadd(uchar address)//读24C02 { uchar date;
start();//起始信号
writebyte(0xa0);//写入器件地址写
respons();
writebyte(address);//写入读单元地址
respons();
}
start();//起始信号
writebyte(0xa1);//读命令 respons();date=readbyte();//读数据 stop();//停止信号 return date;/***********************数码位选函数*****************************/ void smg_we_switch(uchar i){ switch(i){
case 0: smg_we1 = 0;smg_we2 = 1;smg_we3 = 1;smg_we4 = 1;break;
case 1: smg_we1 = 1;smg_we2 = 0;smg_we3 = 1;smg_we4 = 1;break;
case 2: smg_we1 = 1;smg_we2 = 1;smg_we3 = 0;smg_we4 = 1;break;
case 3: smg_we1 = 1;smg_we2 = 1;smg_we3 = 1;smg_we4 = 0;break;} }
/******************************************************************** * 名称 : delay_1ms()* 功能 : 延时1ms函数 * 输入 : q * 输出 : 无
***********************************************************************/ void delay_1ms(uint q){ uint i,j;for(i=0;i for(j=0;j<110;j++);} /******************************************************************** * 名称 : display()* 功能 : 数码管显示 * 输入 : 无 * 输出 : 无 ***********************************************************************/ void display(){ uchar i;for(i=0;i P0 = 0xff; //消隐 smg_we_switch(i); //位选 P0 = dis_smg[i]; //段选 delay_1ms(3);} } /*********************定时器0、定时器1初始化******************/ void time0_init() { EA = 1; //开总中断 TMOD = 0X11;//定时器0、定时器1工作方式1 ET0 = 1; //开定时器0中断 TR0 = 1; //允许定时器0定时 } /*********************交通灯处理函数*********************************/ void jiaotongdeng_dis(){ char dx,nb; if(flag_dx_nb == 0){ dx=dx_s;nb=dx_s-5;if(nb<=0)nb=dx_s;} if(flag_dx_nb == 1){ dx=dx_s-5;nb=dx_s;if(dx<=0)dx=dx_s;} if(flag_1s == 1){ dx_s--;flag_1s = 0; if(dx_s == 0){ if(flag_dx_nb == 1) dx_s = nb_time; //南北时间 else dx_s = dx_time; //东西时间 flag_dx_nb = ~flag_dx_nb; } } dis_smg[0] = smg_du[dx % 10];dis_smg[1] = smg_du[dx / 10];dis_smg[2] = smg_du[nb % 10];dis_smg[3] = smg_du[nb / 10]; /***********************南北时间*********************************/ if(flag_dx_nb == 0) { if(dx_s > 5) { dx_red = 1;//灭 dx_green = 0;//亮 dx_yellow = 1;//灭 nb_red = 0;//亮 nb_green = 1;//灭 nb_yellow = 1;//灭 flag_5m_value = 0; }else if(dx_s <= 5) //当小于5秒时 黄灯要闪了 { dx_red = 1; //灭 } } dx_green = 1; //灭 nb_red = 0; //亮 nb_green = 1; //灭 nb_yellow = 1; //灭 if(flag_500ms == 0){ dx_yellow = 0;//亮 } else { } dx_yellow = 1;//灭 /***********************东西时间*********************************/ if(flag_dx_nb == 1) { if(dx_s > 5) { dx_red = 0; //亮 dx_green = 1; //灭 dx_yellow = 1; //灭 nb_red = 1; //灭 nb_green = 0; //亮 nb_yellow = 1; //灭 flag_5m_value = 0; }else if(dx_s <= 5) //当小于5秒时 黄灯要闪了 { dx_red = 0; //灭 dx_green = 1; //灭 dx_yellow = 1; //灭 nb_red = 1; //灭 nb_green = 1; //灭 if(flag_500ms == 0) //黄灯闪烁 { } } } nb_yellow = 0;//亮 } else { nb_yellow = 1;//灭 } /********************独立按键程序*****************/ uchar key_can;//按键值 void key()//独立按键程序 { static uchar key_new;key_can = 20; //按键值还原 P1 |= 0x1f; if((P1 & 0x1f)!= 0x1f)//按键按下 { delay_1ms(1); //按键消抖动 if(((P1 & 0x1f)!= 0x1f)&&(key_new == 1)) { key_new = 0;switch(P1 & 0x1f){ //确认是按键按下 case 0x1e: key_can = 1;break;//得到按键值 case 0x1d: key_can = 2;break;//得到按键值 case 0x1b: key_can = 3;break;//得到按键值 case 0x17: key_can = 4;break;//得到按键值 } } } else key_new = 1;} uchar menu_1,flag_s; /********************设置函数*****************/ void key_with(){ if(key_can == 4) //交通管制按键 { flag_jdgz ++; if(flag_jdgz > 5) flag_jdgz = 0; if(flag_jdgz == 1)// 全部亮红灯 { dx_red = 0;//亮 dx_green = 1;//灭 dx_yellow = 1;//灭 } nb_red = 0;//亮 nb_green = 1;//灭 nb_yellow = 1;//灭 if(flag_jdgz == 2)// 东西红灯 南北绿灯 { dx_red = 0;//亮 dx_green = 1;//灭 dx_yellow = 1;//灭 nb_red = 1;//灭 nb_green = 0;//亮 nb_yellow = 1;//灭 } if(flag_jdgz == 3)// 南北红灯 { dx_red = 1;//灭 dx_green = 0;//亮 dx_yellow = 1;//灭 nb_red = 0;//亮 nb_green = 1;//灭 nb_yellow = 1;//灭 } if(flag_jdgz == 4)// 南北绿灯 { dx_red = 1;//灭 dx_green = 0;//亮 dx_yellow = 1;//灭 nb_red = 1;//灭 nb_green = 0;//亮 nb_yellow = 1;//灭 } if(flag_jdgz == 5)// 南北黄灯 { dx_red = 1;//灭 dx_green = 1;//灭 dx_yellow = 0;//亮 nb_red = 1;//灭 nb_green = 1;//灭 nb_yellow = 0;//亮 } } if(key_can == 1) //设置键 { menu_1 ++; 东西绿灯 东西绿灯 东西黄灯 if(menu_1 >= 3){ menu_1 = 0;} } if(menu_1 == 1) //设置东西的时间 { if(key_can == 2){ dx_time ++;//加1 if(dx_time > 99) dx_time = 99;} if(key_can == 3){ dx_time--;//减1 if(dx_time <= 10) dx_time = 10;} dis_smg[0] = smg_du[10];//显示为A dis_smg[1] = smg_du[10];//显示为A dis_smg[2] = smg_du[dx_time % 10];dis_smg[3] = smg_du[dx_time / 10]; writeadd(4,dx_time);//保存数据 } if(menu_1 == 2) //设置南北的时间 { if(key_can == 2){ nb_time ++;//加1 if(nb_time > 99) nb_time = 99;} if(key_can == 3){ nb_time--;//减1 //显示东西设置的时候 if(nb_time <= 10) nb_time = 10;} dis_smg[0] = smg_du[11];//显示为B dis_smg[1] = smg_du[11];//显示为B dis_smg[2] = smg_du[nb_time % 10];dis_smg[3] = smg_du[nb_time / 10]; //显示东西设置的时候 writeadd(2,nb_time);//保存数据 } } /******************************************************************** * 名称 : main()* 功能 : 实现灯的闪烁 * 输入 : 无 * 输出 : 无 ***********************************************************************/ void main(){ time0_init(); init();//24C02初始化 nb_time=readadd(2);//读取地址2处一个字节给 dx_time=readadd(4);//读取地址4处一个字节给 if(nb_time>99)nb_time=20; if(dx_time>99)dx_time=30; dx_s = nb_time; //东西时间 while(1){ key(); if(key_can < 20) key_with(); if((menu_1 == 0)&&(flag_jdgz == 0)) } } jiaotongdeng_dis();display();/*********************定时器0中断服务程序************************/ void time0_int()interrupt 1 { } static uchar value; //定时10ms中断一次 TH0 = 0x3c;TL0 = 0xb0; //50ms value ++;flag_5m_value++;if(flag_5m_value % 10 == 0)flag_500ms = ~flag_500ms;if(value >= 20){ value = 0;flag_1s = 1;} 基于单片机的交通灯控制系统设计 摘要:十字路口车辆穿梭,行人熙攘,车行车道,人行人道,有条不紊。那么靠什么来实现这井然秩序呢?靠的就是交通信号灯的自动指挥系统。交通信号灯控制方式很多。本系统采用MSC-51系列单片机ATSC51和可编程并行I/O接口芯片8255A为中心器件来设计交通灯控制嚣,实现了能根据实际车流量通过8051芯片的P1口设置红、绿灯燃亮时间的功能;红绿灯循环点亮。倒计时剩5秒时黄灯闪烁警示;车辆闯红灯报警;绿灯时间可检测车流量并可通过双位数码管显示。本系统实用性强、操作简单、扩展功能强。 关键词:单片机;交通灯 单片机技术的发展对社会进步产生了巨大的影响。今天,单片机及其应用技术的发展速度、深度及其广度,在国防、科学研究、政治经济、教育文化等方面几乎无所不及。将之用于交通灯控制系统设计,对于疏导交通流量、提高道路通行能力,减少交通事故有明显效果。 1、单片机涵义 一台能够工作的计算机要有这样几个部份构成:CPU(进行运算、控制)、RAM(数据存储)、ROM(程序存储)、输入,输出设备(例如:串行口、并行输出口等)。在个人计算机上这些部份被分成若干块芯片,安装一个称之为主板的印刷线路板上。而在单片机中,这些部份,全部被做到一块集成电路芯片中了,所以就际=缸单片(单芯片)机,单片机即微控制器(Microniroller μC)有一些单片机中除了上述部份外,还集成了其它部份如AID,DIA,定时计数器,RTC,各种串行接口等。 2、MSC-51芯片简介 2.1 MSC-51结构 8051是MCS-51系列单片机的典型产品,8051单片机包含中央处理器、程序存储器(ROM)、数据存储器(RAM)、定时,计数器、并行接口、串行接口和中断系统等几大单元及数据总线、地址总线和控制总线等三大总线。 2.2 8255芯片简介 8255可编程并行接口芯片有三个输入输出端口,即A口、B口和c口,对应于引脚PAT—PA0、PB7-PB0和PC7-PC0。其内部还有一个控制寄存器,即控制口。通常A口、B口作为输入输出的数据端口。c口作为控制或状态信息的端口,它在方式字的控制下,可以分成4位的端口,每个端口包含一个4位锁存器。它们分别与端口A/B配合使用,可以用作控制信号输出或作为状态信号输入。 8255有两种控制命令字;一个是方式选择控制字;另一个是c口按位置位/复位控制字。 2.3 74LS373简介 SN74LS373。SN74LS374常用的8d锁存器。常用作地址锁存和I/0输出,可以用74he373代换,74H373是高速CMOS器件,功能与74LS373相同,两者可以互换。74LS373内有8个相同的D型(三态同相)锁存器,由两个控制端(11脚c或EN;1脚OUT、CONT、OE)控制。当OE接地时,若G为高电平,741Ls373接收由PPU输出的地址信号;如果G为低电平,则将地址信号锁存。 3、系统硬件 3.1 交通管理的方案论证 东西、南北两干道交于一个十字路口,各干道有一组红、黄、绿三色的指示灯,指挥车辆和行人安全通行。红灯亮禁止通行。绿灯亮允许通行。黄灯亮提示人们注意红、绿灯的状态即将切换,且黄灯燃亮时间为东西、南北两千道的公共停车时问。设东西道比南北道的车流量。 3.2 系统硬件设计 选用设备8031单片机一片选用设备:8031弹片机一片,8255并行通用接口芯片一片,74LS07两片,MAX692‘看门狗’一片,共阴极的七段数码管两个双向晶闸管若干,7805三端稳压电源一个,红、黄、绿交通灯各两个。开关键盘、连线若干。 4、控制器的软件设计 4.1 每秒钟的设定 延时方法可以有两种:一种是利用NCS-51内部定时器才生溢出中断来确定1秒的时间,另一种是采用软延时的方法。 4.2 计数器硬件延时 4.2.1 初值计算 定时器工作时必须给计数器送计数器初值,这个值是送到TH和TL中的。他是以加法记数的,并能从全1到全0时自动产生溢出中断请求。因此,我们可以把计数器记满为零所需的计数值设定为c和计数初值设定为TC。 4.2.2 1秒的方法 我们采用在主程序中设定一个初值为20的软件计数器和使TO定时5O毫秒,这样每当TO到50毫秒时cPu就响应它的溢出中断请求,进入他的中断服务子程序。在中断服务子程序中,cPu先使软件计数器减1,然后判断它是否为零。为零表示1秒已到可以返回到输出时间显示程序。 4.3 计数器软件延时 MCS-51的工作频率为2-12MHZ,我们选用的8031单片机的工作频率为6MHZ。机器周期与主频有关,机器周期是主频的12倍,所以一个机器周期的时间为12*(1/6M)=2us。我们可以知道具体每条指令的周期数,这样我们就可以通过指令的执行条数来确定1秒的时间。 4.4 时间及信号灯的显示 4.4.1 8051并行口的扩展 8051虽然有4个8位I/0端口,但真正能提供借用的只有Pl口。因为P2和P0口通常用于传送外部传送地址和数据,P3口也有它的第二功能。因此,8031通常需要扩展。由于我们用外部输入设定红绿灯倒计时初值、数码管的输出显示、红绿黄信号灯的显示都要用到一个I/0端口,显然8031的端口是不够,需要扩展。 扩展的方法有两种:(1)借用外部RAM地址来扩展I/0端口;(2)采用I/0接口新片来扩充。我们用8255并行接口信片来扩展I/0端口。 4.4.2 8255与8051的连接 用8051的PO口的pO.7连接8255的片选信号,我们用8031的地址采用全译码方式,当pO.7:0时片选有效,其他无效,pO.1用于选择8255端口。 5、结 论 本系统就是充分利用了8051和8255芯片的I/O引脚。系统统采用MSC-51系列单片机Intel8051和可编程并行I/0接口芯片8255A为中心器件来设计交通灯控制器,实现了能根据实际车流量通过8031芯片的Pl口设置红、绿灯燃亮时间的功能;红绿灯循环点亮,倒计时剩5秒时黄灯闪烁警示(交通灯信号通过PA口输出,显示时间直接通过8255的PC口输出至双位数码管);车辆闯红灯报警;绿灯时间可检测车流量并可通过双位数码管显示。 参考文献: [1]张毅刚,新编MCS-51单片机应用系统设计[M]哈尔滨:哈尔滨工业大学出版社,2006 [2]王义军,单片机原理及应用习题与实验指导书[M],北京:中国电力出版社,2006 [3]陈明荧8051单片机课程设计实训教材[M],北京:清华大学出版社。2004第五篇:基于单片机的交通灯控制系统设计