课程设计报告.docx
《课程设计报告.docx》由会员分享,可在线阅读,更多相关《课程设计报告.docx(22页珍藏版)》请在冰豆网上搜索。
课程设计报告
1主要内容
单片微型计算机(SingleChipMicrocomputer)简称单片机,又称微控制器
(MicrocontrollerUnit)或嵌埋式控制器(EmbededController),是将计算机的基本部件微型化,使之集成于一块芯片上的微机。
片内含有CPU、ROM、RAM、并行I/O、串行I/O、定时器/计数器、中断控制、系统时钟及系统总线等。
单片机具有体积小、功耗低、功能强、性价比高、易于推广应用等显著优点。
新型单片机可承担数据与数值分析、信号处理、机器人智能控制,以及图象处理等复杂任务。
目前,单片机已在自动化装置、智能化仪表、过程控制和家用电器等领域得到日益广泛的应用。
单片机交通灯系统的研制,一方面可以改善交通堵塞问题,疏导车流,提高道路利用率;另一方面可以节省交通警力,提高效率。
2需求分析
十字路口车辆穿梭,行人熙攘,车行车道,人行人道,有条不紊。
那么靠什么来实现这井然的秩序呢?
靠的就是交通信号灯的自动指挥系统。
交通信号灯控制方式很多,传统的交通信号灯控制系统一般由数字电路构成,电路复杂,体积大成本高。
采用单片机控制交通信号,不仅可以简化电路结构,降低成本,减小体积,而且根据主、支干道车流量发生变化的实际情况,通过拨盘开关可以很方便地进行主、支干道通车时间的设定。
本设计是模仿交通灯控制系统设计的一个交通灯控制电路,具有实用性强、操作简单的特点。
3设计思想
系统硬件的设计部分采用AT89S52单片机为核心器件,加以复位电路,时序电路构成最小系统,并通过驱动电路、数码管及晶体管构成显示部分。
红绿灯循环点亮,倒计时剩5秒时黄灯闪烁警示,红绿灯信号通过P0口输出,显示时间直接通过单片机P2口和选择端送至双位数码管,通过扫描程序实现东西和南北方向数据的显示,同时能设置红、绿灯点亮时间。
4实现方法
交通控制系统主要控制A、B两车道的交通,以AT89S52单片机为核心芯片,通过控制三色LED的亮灭来控制各车道的通行,采用0.5S延时子程序的反复调用来实现各种定时时间。
该电路具有电路简单,设计方便,显示亮度高,耗电较少,也非常的可靠等特点。
总体设计框图如图1所示:
图1硬件模块图
整个过程流程图如图2所示
红绿灯循环点亮,倒计时剩5秒时黄灯闪烁警示。
图2交通灯流程图
5芯片介绍
图3单片机AT89S52
AT89S52是51系列单片机的一个型号,它是ATMEL公司生产的。
AT89S52是一个低电压,高性能CMOS8位单片机,片内含8kbytes的可反复擦写的Flash只读程序存储器和256bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器和Flash存储单元,功能强大的AT89S52单片机可为您提供许多较复杂系统控制应用场合。
AT89S52有40个引脚,32个外部双向输入/输出(I/O)端口,同时内含2个外中断口,3个16位可编程定时计数器,2个全双工串行通信口,2个读写口线,AT89S52可以按照常规方法进行编程,但不可以在线编程(S系列的才支持在线编程)。
其将通用的微处理器和Flash存储器结合在一起,特别是可反复擦写的Flash存储器可有效地降低开发成本。
兼容MCS51指令系统·8k可反复擦写(>1000次)FlashROM
·32个双向I/O口·256x8bit内部RAM
·3个16位可编程定时/计数器中断·时钟频率0-24MHz
·2个串行中断·可编程UART串行通道
·2个外部中断源·共6个中断源
·2个读写中断口线·3级加密位
·低功耗空闲和掉电模式·软件设置睡眠和唤醒功能
AT89S52P为40脚双列直插封装的8位通用微处理器,采用工业标准的C51内核,在内部功能及管脚排布上与通用的8xc52相同,其主要用于会聚调整时的功能控制。
功能包括对会聚主IC内部寄存器、数据RAM及外部接口等功能部件的初始化,会聚调整控制,会聚测试图控制,红外遥控信号IR的接收解码及与主板CPU通信等。
主要管脚有:
XTAL1(19脚)和XTAL2(18脚)为振荡器输入输出端口,外接12MHz晶振。
RST/Vpd(9脚)为复位输入端口,外接电阻电容组成的复位电路。
VCC(40脚)和VSS(20脚)为供电端口,分别接+5V电源的正负端。
P0~P3为可编程通用I/O脚,其功能用途由软件定义,在本设计中,P0端口(32~39脚)被定义为N1功能控制端口,分别与N1的相应功能管脚相连接,13脚定义为IR输入端,10脚和11脚定义为I2C总线控制端口,分别连接N1的SDAS(18脚)和SCLS(19脚)端口,12脚、27脚及28脚定义为握手信号功能端口,连接主板CPU的相应功能端,用于当前制式的检测及会聚调整状态进入的控制功能。
6实现过程
1)晶振电路模块
晶振电路由一个晶体振荡器12MHZ和两个30pF的瓷片电容组成。
用于产生单片机工作所需要的时钟信号,而时序所研究的是指令执行中各信号之间的相互关系。
单片机本身就如一个复杂的同步时序电路,为了保证同步工作方式的实现,电路应在唯一的时钟信号控制下严格地工作。
其电路如图4所示:
图4晶振电路图
2)复位电路模块
复位电路是使单片机的CPU或系统中的其他部件处于某一确定的初始状态,并从此状态开始工作,除了进入系统的正常初始化之外,当由于程序运行出错或操作错误使系统处于死锁状态时,为摆脱困境,也需按复位电路以重新启动。
本设计采用的是按键复位电路。
其电路如图5所示:
图5复位电路图
3)主控制系统模块
主控制器采用AT89S52,是ATMEL公司生产的一款性能稳定的8位单片机。
AT89S52具有1个8KB的FLASH程序存储器,1个512字节的RAM,4个8位的双向可位寻址I/O端口,3个16位定时/计数器及1个串行口和6个向量二级中断结构。
单片机的P0口分别用于控制南北及东西的通行灯,P2口和P3^4-P3^7口用于4组2位LED计时器的控制,其主控电路如图6所示:
图6主控电路图
4)交通灯输出控制模块
道口交通灯指示采用高亮度红、黄、绿发光二极管进行提示。
其图如图7所示
图7交通指示灯线路图
当R=220欧时,按公式A=(5-1.8)/R计算,电路中的电流大小应为A=14.545mA.由于每个路口的通行双向指示处理相同,因此每个端口应具有3A的吸收电流能力。
5)时间显示电路模块
双位7段LED发光数码管共有10个引脚,各管脚所对应的数码管发光段如图8所示
图8双位数码管引脚对应图
道口通行剩余时间采用高亮红色7段LED发光数码管显示,采用共阳极数码管,如用单片机吸收电流驱动,列扫描驱动使用三极管,按每段6mA电流计算,全显示字形“8”时,每个数码需6mA*8=48mA,由于时间显示每个道口相同,共需要电流192mA,因此设计中也采用了中功率三极管8550.其显示电路如图9所示:
数码管的10号及5号管脚分别接三极管的C端,其它管脚按图中顺序依次接单片机的P2.0-P2.7端口
图9时间显示电路模块
7调试
电路调试是利用开发系统、基本测试仪器(万用表、示波器等),检查系统硬件中存在的故障。
其调试可分为静态调试与动态调试两步进行。
静态调试
静态调试是在系统未工作时的一种硬件检测。
第一步:
目测。
检查外部的各种元件或者是电路是否有断点。
第二步:
用万用表测试。
先用万用表复核目测中有疑问的连接点,再检测各种电源与地线之间是否有短路现象。
第三步:
加电检测。
给板加电,检测所有的插座或是器件的电源端是否符合要求的值。
第四步:
是联机检查。
因为只有用单片机开发系统才能完成对用户系统的调试。
动态调试
动态调试是在系统工作的情况下发现和排除系统硬件中存在的器件内部故障、器件连接逻辑错误等的一种硬件检查。
动态调试的一般方法是由近及远、由分到合。
由分到合是指首先按逻辑功能将系统硬件电路分为若干块,当调试电路时,与该元件无关的器件全部从系统中去掉,这样可以将故障范围限定在某个局部的电路上。
当各块电路无故障后,将各电路逐块加入系统中,在对各块电路功能及各电路间可能存在的相互联系进行调试。
由分到合调试既告完成。
由近及远是将信号流经的各器件按照距离单片机的逻辑距离进行由近及的分层,然后分层调试。
调试时,仍采用去掉无关元件的方法,逐层调试下去,就会定位故障元件了。
软件调试
软件调试是通过对拥护程序的C编程、连接、执行发现程序中存在的语法错误与逻辑错误并加以排除纠正的过程。
运行程序后,编辑,查看程序是否有逻辑的错误。
调试过程中遇到的问题
1)在调试过程中出现数码管不亮的情况,通过查询资料和询问同学,得出出现此种情况是由于单片机驱动电流太小,故增加三极管起到放大电流的作用。
2)数码管的多个引脚通过跳线与单片机多个端口分别连接,要注意顺序正确,且不同跳线之间不能短接,否则会影响电路实现。
3)经过多次的测试与修正,最终实现了预期的功能。
8总结
本次课程设计让我对以前学到的理论知识得到了一次实际的验证,对自己已有的知识有了更进一步的理解和认识,使我在单片机的基本原理,单片机应用系统开发过程,以及在常用编程设计思路的掌握上向前迈了一大步。
在此,由于能力有限,在课程设计中碰到了很多难题,我通过查阅相关书籍,与同学相互交流探讨使问题得到了解决。
通过这次单片机课程设计,我不仅加深了对单片机理论的认识,还学会了培养自己的创新精神,从而不断的战胜自己,超越自己。
9参考文献
[1]何利民。
MCS-51系列单片机应用统计。
北京:
北京航空航天大学出版社。
1999、6
[2]周坚,单片机C语言轻松入门。
北京:
北京航空航天大学出版社。
2006、1
[3]楼然苗,李光飞,单片机课程设计指导。
北京:
北京航空航天大学出版社。
2007、1
[4]杨居义。
单片机课程设计指导。
北京:
清华大学出版社。
附录
#include
#defineucharunsignedchar
#defineuintunsignedint
#definetime50000
#defineon0
#defineoff1
sbitRED_ZHU=P0^0;//南北红灯
sbitYELLOW_ZHU=P0^1;//南北黄灯
sbitGREEN_ZHU=P0^2;//南北绿灯
sbitRED_ZHI=P0^3;//东西红灯
sbitYELLOW_ZHI=P0^4;//东西黄灯
sbitGREEN_ZHI=P0^5;//东西绿灯
sbitP23=P3^5;
sbitP22=P3^4;//东西方向数码管位选
sbitP21=P3^7;
sbitP20=P3^6;//南北方向数码管位选
sbitint0_key=P3^2;
sbitint1_key=P3^3;
voiddisplay1(uchar,uchar);
voiddisplay2(uchar,uchar);
voiddelayms(uintk);
uchartemp1,temp2,temp3,temp4,temp5,temp6;
/*===============倒计时=========================*/
ucharN=50,Y=45,Z=50,M=75,G=80,U=80;
ucharC50ms,t0;
ucharseg=1;
ucharflag=0,led_data_temp;
voidInitialT1(void)
{
TMOD=0x10;//定时器0,1工作在方式1
TH1=(65536-time)/256;//相当于(65536-time)/256;
TL1=(65536-time)%256;//初值为time(50ms)
TR1=1;//开定时器1中断
ET1=1;//允许定时器1中断
ET0=1;
TH0=(65536-time)/256;
TL0=(65536-time)%256;
EX0=1;//允许外部中断0
IE0=1;//启动外部中断0
PX0=1;
EX1=1;
IE1=1;
EA=1;//开总中断
}
voidint0(void)interrupt0//外中断0
{
flag=0;
led_data_temp=P0;
t0=20;
if(!
int0_key)
{
delayms(10);
if(!
int0_key)
{
while(!
int0_key);
TH0=(65536-time)/256;
TL0=(65536-time)%256;
TR1=0;
TR0=1;
EX0=0;
EX1=0;
C50ms=0;
}
}
}
voidint1(void)interrupt2//外部中断1
{
t0=15;
flag=1;
led_data_temp=P0;
if(((RED_ZHU==0)&&(GREEN_ZHI==0))||((YELLOW_ZHI==0)&&(RED_ZHU==0)))
{
P0=0xff;
GREEN_ZHU=0;
RED_ZHI=0;
}
else//if((RED_ZHI==0)&&(GREEN_ZHU==0))
{
P0=0xff;
GREEN_ZHI=0;
RED_ZHU=0;
}
if(!
int1_key)
{
delayms(10);
if(!
int1_key)
{
while(!
int1_key);
TH0=(65536-time)/256;
TL0=(65536-time)%256;
TR1=0;
TR0=1;
EX0=0;
EX1=0;
C50ms=0;
}
}
}
voidISRT0(void)interrupt1//定时器0中断服务子程序
{
temp1=N,temp2=Y,temp3=Z,temp4=M,temp5=G,temp6=U;
TH0=(65536-time)/256;
TL0=(65536-time)%256;//重装初值time
YELLOW_ZHU=1;//如果在黄5S时进行熄灭黄灯
YELLOW_ZHI=1;
if(!
flag)
{
P0=0xf6;
}
C50ms++;
if(C50ms>19)
{
t0--;
C50ms=0;
}
if(t0==0)
{
P0=led_data_temp;
N=temp1,Y=temp2,Z=temp3,M=temp4,G=temp5,U=temp6;
TR0=0;//禁止定时器1中断
TR1=1;//开定时器1中
EX1=1;
//EX0=1;
C50ms=0;
return;
}
}
voidISRT1(void)interrupt3//定时器1中断服务子程序
{
TH1=(65536-time)/256;
TL1=(65536-time)%256;//重装初值time
C50ms++;
if(C50ms>19)
{
N--;
M--;
Y--;
Z--;
G--;
U--;
C50ms=0;
}
}
/*=================延时=======================*/
voidDelay10uS(ucharsecond)
{
uinti;
while((second--)!
=0)
{
for(i=0;i<5;i++)
{}
}
}
voiddelayms(uintk)
{
uinti,j;
for(i=0;ifor(j=0;j<120;j++);
}
/*==================数码管控制========================*/
ucharcodediscode[]=
{0xC0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳数码管0-9代码
voiddisplay1(ucharnum1,ucharnum2)//控制南数码管显示
{
P2=discode[num1];P21=on;Delay10uS(10);P21=off;//低位
P2=discode[num2];P20=on;Delay10uS(10);P20=off;//高位
}
voiddisplay2(ucharnum3,ucharnum4)//控制东西数码管显示
{
P2=discode[num3];P23=on;Delay10uS(10);P23=off;//低位
P2=discode[num4];P22=on;Delay10uS(10);P22=off;//高位
}
/*===================主函数=================================*/
main()
{
/*=============初始状态:
东西南北都红灯==================*/
RED_ZHU=on;
RED_ZHI=on;
delayms(1000);
RED_ZHU=off;
RED_ZHI=off;
InitialT1();
while
(1)
{
//初始化计时器
/*=============状态1:
南北绿灯(45s)东西红灯(40s)==================*/
/*=============状态2:
南北黄灯(5s)东西红灯(5s)=================*/
RED_ZHI=on;
GREEN_ZHU=on;
while(N!
=0)
{
if(TR0==1)
{
display2(t0/10,t0%10);//当t0=20时东西、南北红灯(20s)
display1(t0/10,t0%10);//当t0=15时东西、南北红、绿灯交换点亮
}
else
{
if(N==5)
{
while(Z!
=0)
{
if(TR0==1)
{
display2(t0/10,t0%10);
display1(t0/10,t0%10);
}
else
{
display1(N/10,N%10);//东西红灯(5s)
display2(Z/10,Z%10);//南北黄灯(5s)
GREEN_ZHU=off;
YELLOW_ZHU=on;
}
}
}
else
{
display1(N/10,N%10);//东西红灯(45s)
display2(Y/10,Y%10);//南北绿灯(40s)
}
}
}
GREEN_ZHU=off;
RED_ZHI=off;
YELLOW_ZHU=off;
P0=0xff;//数码管全关掉
Delay10uS
(1);
/*=============状态3:
东西绿灯(20s)南北红灯(25s)==================*/
/*=============状态4:
东西黄灯(5s)南北红灯(5s)==================*/
GREEN_ZHI=on;
RED_ZHU=on;
while(G!
=0)
{
if(TR0==1)
{
display2(t0/10,t0%10);
display1(t0/10,t0%10);
}
else
{
if(G==5)
{
while(U!
=0)
{
if(TR0==1)
{
display2(t0/10,t0%10);
display1(t0/10,t0%10);
}
else
{
display2(G/10,G%10);//东西黄灯(5s)
display1(U/10,U%10);//南北红灯(5s)
GREEN_ZHI=off;
YELLOW_ZHI=on;
}
}
}
else
{
display2(G/10,G%10);//东西绿灯(25s)
display1(M/10,M%10);//南北红灯(20s)
}
}
}
GREEN_ZHI=off;
RED_ZHU=off;
YELLOW_ZHI=off;
P0=0xff;
Delay10uS
(1);
N=50,Y=45,Z=50,M=75,G=80,U=80;
}
}