好吧 我为了任务Word下载.docx
《好吧 我为了任务Word下载.docx》由会员分享,可在线阅读,更多相关《好吧 我为了任务Word下载.docx(19页珍藏版)》请在冰豆网上搜索。
AT89C51单片机[1],AMBERCC数码管显示模块,按键控制模块,LED灯指示模块等硬件电路构成,软件包括定时器部分,外部中断部分,正常模式部分程序组成。
正常模式下由程序执行6个状态,每个状态分别各车道通行时间40秒,左转20秒,人行道有40秒的通行时间,离转换还剩5秒时数码管进入闪烁倒计时状态,每条道路对应1个等待状态,1个通行状态,1个左转状态,每个状态调用数码管倒计时显示子程序,并可根据具体繁忙程度手动调节交通灯的转换时间。
2单片机交通灯控制系统方案制定
2.1方案提出
采用分模块设计的思想,程序设计实现的基本思想是一个计数器,选择一个单片机,其内部为一个计数[3],是十六进制计数器,模块化后,通过设置或程序清除来实现状态的转换,由于每一个模块的计数多不是相同,这里的各模块是以预置数和计数器计数[11]共同来实现的,所以要考虑增加一个置数模块,其主要功能细分为,对不同的状态输入要产生相应状态的下一个状态的预置数,分别为南北车道的置数选择和东西车道的置数选择。
现在简述设计思想。
如前分析已经确定该系统有六个状态[12],而置数子模块可定要将下一状态的预置数准备好,所以很容易得到主干道的置数表
表1:
方案1的交通灯工作状态
状态
南北车道预置
东西车道预置数
000
35(直行绿灯)
35(红灯)
001
5(黄灯闪烁等待)
5(红灯)
010
20(左转绿灯)
20(红灯)
011
100
101
由该表,就可以通过程序循环的方法设计该模块,主要思想是通过数据判断指令、跳转指令实现,由主控制器计时和中断产生的八个状态去译码,从而得到不同的输出,即预置数,由上分析可用一个计数器和跳转指令去完成的预置数。
同时,可以用组合电路实现该功能了,可以用数据选择器的思想,在本系统中,直接通过门电路的译码,接下来就是计数模块了,其主要的功能细分为,要从预置数开始递减计数,一个状态结束,通过判断,通知主控制模块,使之进入下一模块。
还有一个必须考虑到的就是,预置数必须在下一个状态来之前准备好,而红绿黄灯的状态变化,必须和计数状态同步,于是引起预置数变化的程序要超前于系统本身的状态变化,所以,系统中的两个状态转换时,在上一状态结束时设置预置数,而控制红绿灯的是随着系统本身状态的变化而变化,体现在本子电路中就是有两组电路去判断符合的状态。
3系统硬件原理图
图1系统硬件原理图
3.1软件功能设计
1、主程序负责初始化以及循环扫描键盘;
2、定时器0负责闪烁以及数码管的闪烁;
3、定时器1负责计数以及数码管的循环显示,交通灯的循环点亮;
4、键盘扫描模块负责获得键号并转到相应的程序进行处理;
5、键盘处理模块负责调整交通的通行以及暂缓通行时间
3.2程序流程图
全部控制程序实际上分为若干模块:
键盘设置处理程序,状态灯控制程序,LED显示程序紧停程序,中断服务子程序,红绿灯时间调整程序等。
整个软件程序方面主要分两大部分:
主程序部分和中断处理程序。
图2程序流程总图
总图是所有程序依据的原理每次子程序都将调用总图进行形成,首先开始,然后通过I/O口进行程序编译,之后通过芯片进行检测运行,有效的向下发放无效返回提醒。
图3主程序流程图
首先开始运行,系统初始化,各灯开始运行亮灯并有处理器处理返回
图4按键子程序流程图
它包含倒计时调整和繁忙状态两个状态。
主程序中放了一个按键的判断指令,当有按键按下的时候,程序就自动的跳转到按键子程序处理。
当检测到K2键按下的时候就自动返回到主程序。
当出现繁忙的情况的时候,按下K3或者K4就切换到繁忙状态,当繁忙事件处理完毕的时候,再按键调整时间,返回正常状态。
图5中断程序图
从主控中返回的数据先分配空间,之后判断,判断正确进行中断获得数据依次循环,判断不正确直接返回原值进行下一步程序
4系统仿真实现
图6东西停南北直行南北人行通行状态
图7东西停南北左转弯南北方向人形通行状态
图8南北停东西直行东西方向人形通行状态
图9南北停东西左转弯东西方向人形通行状态
图10繁忙状态交通灯工作状况
5仿真软件介绍
Protel99S:
随着计算机技术的飞速发展,集成电路被广泛应用,电路越来越复杂,集成度越来越高,加之新型元件层出不穷,使得越来越多的工作已经无法用手工来完成,因此计算机辅助电路板设计已经成为电路板设计制作的必然趋势。
Protel99SE具有丰富的设计功能,能进行原理图的设计、印制电路板的设计、PCB板的设计等功能。
KeilC51:
KeilC51软件是众多单片机应用开发的优秀软件之一,它集编辑,编译,仿真于一体,支持汇编,PLM语言和C语言的程序设计,界面友好,易学易用。
eilμVision调试器准确地模拟8051设备的片上外围设备(IC、CAN、UART、SPI、中断、I/O端口、A/D转换器、D/A转换器和PWM模块)。
模拟帮助你了解硬件配置,避免在安装问题上浪费时间。
此外,使用模拟器你可以在没有目标设备的情况下编写和测试应用程序。
使用PK51专业开发套件,你可轻松访问8051系列的片上外设和其他关键功能。
6结语
在这次课程设计中,我遇到了一些问题,也学会了很多关于数字电路的东西,并对所用器件有了更深入的认识。
首先,为了使线路简单在安装之前要对芯片的位置布置作一下分析,才开始连接。
并按照电路进行合理的布置器件,另外,在调试过程中,要学会使用仪器去检测电路,刚开始我很快就将线认真的连好,但没有出现结果,我再用表去测电路,并找出了问题所在。
这次课程设计终于顺利完成了,在设计中遇到了很多专业知识问题,最后在同学的辛勤指导下,终于游逆而解。
同时,在同学的身上我们学也到很多实用的知识,在此我心存感激。
此次课程设计,学到了很多课内学不到的东西,比如独立思考解决问题,出现差错的随机应变,和与人合作共同提高,都受益非浅,今后的制作应该更轻松,自己也都能扛的起并高质量的完成项目。
在此,感谢于权循忠老师的细心指导,也同样谢谢其他各组同学的无私帮助!
7参考文献
[1]胡汉才单片机原理及其接口技术[M]清华大学出版,1996
[2]蔡美琴MCS-51系列单片机系统及其应用高等教育出版社2004.2
[3]付家才单片机控制工程实践技术[M]化学工业出版社,2004.5
[4]潘新民微型计算机控制技术[M]人民邮电出版社,1999.9
[5]余锡存单片机原理及接口技术[M]西安电子科技大学出版社,2000.7
[6]雷丽文等.微机原理与接口技术[M]电子工业出版社,1997.2
[7]蒋万君在论循环时序电路的简便设计[J]机电一体化,2005第5期
[8]周立功增强型80C51单片机速成与实战北京航空航天大学出版社2004.5
[9]何立民MCS-51系列单片机应用系统设计北京航空航天大学出版社,1995.
[10]李华MCS-51系列单片机实用接口技术[M]北京航空航天大学出版社,1993
[11]周航慈单片机应用程序设计技术[M]北京航空航天大学出版社,1991.
[12]张志良等单片机原理与控制技术[M]机械工业出版社,2001年7月第1版
[13]陆坤电子设计技术1电子科技大学出版社,1997
[14]梁文海单片机AT89C2051构成的智能型频率计[J]现代电子技术,2002
[15]谢自美电子线路设计·
实验·
测试[M]华中理工大学出版社,2001
[16]吴金戎,沈庆阳8051单片机实践与应用[M]清华大学出版社,2003
8附录
所用元器件清单
表1所有元器件列表
NE555
1
74LS00
4
74LS47
2
CD4029
3
74LS245
1/4W金属膜电阻:
47K
39K
220
电位器:
5K
电解电容:
10μF
固定电容:
0.01μF
发光二极管:
红
黄
绿
共阳数码管
相关程序
/*****************************************************
十字路口交通灯控制C程序
******************************************************/
#defineucharunsignedchar
#defineuintunsignedint
#include<
reg52.h>
/*****定义控制位**********************/
sbitTime_Show_LED2=P2^5;
//Time_Show_LED2控制位
sbitTime_Show_LED1=P2^4;
//Time_Show_LED1控制位
sbitEW_LED2=P2^3;
//EW_LED2控制位
sbitEW_LED1=P2^2;
//EW_LED1控制位
sbitSN_LED2=P2^1;
//SN_LED2控制位
sbitSN_LED1=P2^0;
//SN_LED1控制位
sbitSN_Yellow=P1^6;
//SN黄灯
sbitEW_Yellow=P1^2;
//EW黄灯
sbitEW_Red=P1^3;
//EW红灯
sbitSN_Red=P1^7;
//SN红灯
sbitEW_ManGreen=P3^0;
//EW人行道绿灯
sbitSN_ManGreen=P3^1;
//SN人行道绿灯
sbitSpecial_LED=P2^6;
//交通正常指示灯
sbitBusy_LED=P2^7;
//交通繁忙指示灯
sbitNomor_Button=P3^5;
//交通正常按键
sbitBusy_Btton=P3^6;
//交通繁忙按键
sbitSpecial_Btton=P3^7;
//交通特殊按键
sbitAdd_Button=P3^3;
//时间加
sbitReduces_Button=P3^4;
//时间减
bitFlag_SN_Yellow;
//SN黄灯标志位
bitFlag_EW_Yellow;
//EW黄灯标志位
charTime_EW;
//东西方向倒计时单元
charTime_SN;
//南北方向倒计时单元
ucharEW=60,SN=40,EWL=19,SNL=19;
//程序初始化赋值,正常模式
ucharEW1=60,SN1=40,EWL1=19,SNL1=19;
//用于存放修改值的变量
ucharcodetable[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
//1~~~~9段选码
ucharcodeS[8]={0X28,0X48,0X18,0X48,0X82,0X84,0X81,0X84};
//交通信号灯控制代码
/**********************延时子程序************************/
voidDelay(uchara)
{
uchari;
i=a;
while(i--){;
}
}
/*****************显示子函数**************************/
voidDisplay(void)
charh,l;
h=Time_EW/10;
l=Time_EW%10;
P0=table[l];
EW_LED2=1;
Delay
(2);
EW_LED2=0;
P0=table[h];
EW_LED1=1;
EW_LED1=0;
h=Time_SN/10;
l=Time_SN%10;
SN_LED2=1;
SN_LED2=0;
SN_LED1=1;
SN_LED1=0;
h=EW1/10;
l=EW1%10;
Time_Show_LED1=1;
Time_Show_LED1=0;
P0=table[h];
Time_Show_LED2=1;
Time_Show_LED2=0;
}
/**********************外部0中断服务程序************************/
voidEXINT0(void)interrupt0using1
EX0=0;
//关中断
if(Add_Button==0)//时间加
{
EW1+=5;
SN1+=5;
if(EW1>
=100)
{
EW1=99;
SN1=79;
if(Reduces_Button==0)//时间减
EW1-=5;
SN1-=5;
if(EW1<
=40)
EW1=40;
SN1=20;
}
if(Nomor_Button==0)//测试按键是否按下,按下为正常状态
EW1=60;
SN1=40;
EWL1=19;
SNL1=19;
Busy_LED=0;
//关繁忙信号灯
Special_LED=0;
//关特殊信号灯
if(Busy_Btton==0)//测试按键是否按下,按下为繁忙状态
EW1=45;
SN1=30;
EWL1=14;
SNL1=14;
Special_LED=0;
Busy_LED=1;
//开繁忙信号灯
if(Special_Btton==0)//测试按键是否按下,按下为特殊状态
EW1=75;
SN1=55;
Special_LED=1;
//开特殊信号灯
}
EX0=1;
//开中断
/**********************T0中断服务程序*******************/
voidtimer0(void)interrupt1using1
{
staticucharcount;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
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)
Time_EW--;
Time_SN--;
if(Flag_SN_Yellow==1)//测试南北黄灯标志位
if(Flag_EW_Yellow==1)//测试东西黄灯标志位
count=0;
/*********************主程序开始**********************/
voidmain(void)
{
Busy_LED=0;
Special_LED=0;
IT0=1;
//INT0负跳变触发
TMOD=0x01;
//定时器工作于方式1
//定时器赋初值
EA=1;
//CPU开中断总允许
ET0=1;
//开定时中断
EX0=1;
//开外部INTO中断
TR0=1;
//启动定时
while
(1)
{/*******S0状态**********/
EW_ManGreen=0;
//EW人行道禁止
SN_ManGreen=1;
//SN人行道通行
Flag_EW_Yellow=0;
//EW关黄灯显示信号
Time_EW=EW;
Time_SN=SN;
while(Time_SN>
=5)
{P1=S[0];
//SN通行,EW红灯
Display();
/*******S1状态**********/
P1=0x00;
while(Time_SN>
=0)
{Flag_SN_Yellow=1;
//SN开黄灯信号位
EW_Red=1;
//SN黄灯亮,等待左拐信号,EW红灯
Display();
}
/*******S2状态**********/
Flag_SN_Yellow=0;
//SN关黄灯显示信号
Time_SN=SNL;
P1=S[2];
//SN左拐绿灯亮,EW红灯
Display();
/*******S3状态**********/
//SN黄灯亮,等待停止信号,EW红灯
/***********赋值**********/
EW=EW1;
SN=SN1;
EWL=EWL1;
SNL=SNL1;
/*******S4状态**********/
EW_ManGreen=~EW_ManGreen;
//EW人行道通行
SN_ManGreen=~SN_ManGreen;
//SN人行道禁止
Time_EW=SN;
Time_SN=EW;
while(Time_EW>
{P1=S[4];
//EW通行,SN红灯
/*******S5状态**********/
P1=0X00;
{Flag_EW_Yellow=1;
//EW开黄灯信号位
SN_Red=1;
//EW黄灯亮,等待左拐信号,SN红灯
/*******S6状态**********/
Flag_EW_Yellow=0;
Time_EW=EWL;
{P1=S[6];
//EW左拐绿灯亮,SN红灯
/*******S7状态**********/
Flag_EW_Yellow=1;
//EN开黄灯信号位
//EW黄灯亮,等待停止信号,SN红灯
}