闪烁LED小灯的设计设计Word文件下载.docx
《闪烁LED小灯的设计设计Word文件下载.docx》由会员分享,可在线阅读,更多相关《闪烁LED小灯的设计设计Word文件下载.docx(24页珍藏版)》请在冰豆网上搜索。
第一章、设计目的·
·
1
第二章、硬件设计·
2.1单片机最小系统·
2.1.1单片机·
2.1.2震荡电路·
2
2.1.3复位电路·
2.2外接电路·
2.2.1串行口扩展·
3
2.2.2显示电路·
2.2.3十字路口交通灯显示电路·
4
第三章、软件设计及调试·
3.1流程图·
5
3.2程序·
6
3.2.1子程序·
9
3.2.2延时子程序·
3.2.3显示子程序·
10
3.3软件调试结果与说明·
13
第四章、实物调试·
第五章、课程设计小结·
14
附录A仿真·
16
附录B系统程序·
21
元件清单·
28
第一章设计目的
1.1课题简介
近年来随着科技的飞速发展,单片机的应用正在不断深入,同时带动传统控制检测技术日益更新。
在实时检测和自动控制的单片机应用系统中,单片机往往作为一个核心部件来使用,仅单片机方面知识是不够的,还应根据具体硬件结构软硬件结合,加以完善。
1.2课题研究的目的和意义
本次课题利用了单片机内部定时器、外部中断,74HC164芯片,LED灯和数码管,解决了原始的人工指挥交通带来的一系列麻烦,大大的提高了实用性、灵活性和可靠性。
同时通过这次课题使我们进一步熟悉单片机的内部结构,编程技巧以及相关芯片的了解与应用。
第二章硬件设计
本系统主要由单片机、74HC164芯片、8位共阳极数码管、LED灯等一系列电路组成,主要完成交通灯十字路口的通行控制及其时间的显示。
2.1.最小系统
2.1.1单片机:
AT89C51
AT89C51的工作特性:
内含4KB的FLASH存储器檫写次数1000次;
内含128字节的RAM;
具有32根可编程I/O线;
具有2个16位编程定时器
具有6个中断源,5个中断矢量,2级优先权的中断结构;
具有1个全双工的可编程串行通信接口;
具有1个数据指针DPTR;
具有可编程3级程序锁定位;
AT89C51的工作电源为5(1±
0.2)V且典型值为5V;
AT89C51最高工作频率为24MHZ;
AT89C51的编程频率为3~24MHZ(本次用12MHz),编程启动电流和启动电压分别为1mA、5或12V(本次5V)。
电源:
采用USB接口连接,提供5V电压。
2.1.2震荡电路:
本次设计采用12MHz的晶振,电路图如下:
图1震荡电路
两只电容在20pF~100pF之间取值,其取值在60pF~70pF时振荡器频率稳定性较高,按照一般经验,外接晶体时两个电容的取值为33pF。
2.1.3复位电路:
图2手动复位
2.2外接电路
2.2.1串行口端口扩展74HC164
74HC164是高速硅门CMOS器件,与低功耗肖特基型TTL(LSTTL)器件的引脚兼容。
74HC164是8位边沿触发式移位寄存器,串行输入数据,然后并行输出。
数据通过两个输入端(DSA或DSB)之一串行输入;
任一输入端可以用作高电平使能端,控制另一输入端的数据输入。
两个输入端或者连接在一起,或者把不用的输入端接高电平,一定不要悬空。
时钟(CP)每次由低变高时,数据右移一位,输入到Q0,Q0是两个数据输入端(DSA和DSB)的逻辑与,它将上升时钟沿之前保持一个建立时间的长度。
主复位(MR)输入端上的一个低电平将使其它所有输入端都无效,同时非同步地清除寄存器,强制所有的输出为低电平。
AT89C51通过P3.0口和P3.1口对其进行片选控制
2.2.2显示电
路
图3LED数码管显示电路:
本次LED显示电路主要采用74HC164与共阳极数码管相接。
通过四片74HC164来控制数码管的输出。
74HC164的1,2号脚接到AT89C51的P3.0口,第8脚接到P3.1口。
2.2.3十字路口交通灯显示电路:
图4通过LED红、绿、黄三种颜色灯的亮与灭来模仿十字路口的交通灯。
交通灯的变化规律:
红灯亮20秒,黄灯亮15秒,绿灯亮5秒。
假设一个十字路口为东西南北走向。
分为五个状态:
1初始状态为南北绿灯亮,东西红灯亮;
2南北绿灯亮20秒后,转为黄灯闪烁5秒,东西红灯仍亮;
3南北黄灯亮5秒后,转为红灯,东西绿灯亮;
4东西绿灯亮20秒后,转为黄灯,南北红灯亮;
5东西黄灯亮5秒后,转为红灯;
南北为绿灯亮。
重复循环。
交通灯变化过程中用数码管进行计时,以便观察。
第三章软件设计及调试
3.1流程图
3.2程序
3.2.1主程序
voidmain(void)
{
TMOD=0x01;
//设置定时方式1
TH0=0x3c;
//定时初值50MS
TL0=0xb0;
TR0=1;
//T0溢出中断请求开启
EA=1;
//总中断开启
ET0=1;
//T0中断开启
EX0=1;
//外部中断INT0开启
IT0=1;
//设置开关下降沿有效
EX1=1;
IT1=1;
ns_time=ns_time_green;
//东西南北红黄绿灯时间赋值
ew_time=ew_time_red;
ew_time_red=ns_time_green+ns_time_yellow;
if(!
a)//a=0,东西显示19开始倒计时,南北14开始倒计时
ns_time=ew_time_red;
ew_time=ns_time_green+ns_time_yellow;
}
while(!
a)//a=0,进入循环
{
if(ew_time-5>
0)
{
while(!
flag);
display(ew_time,ew_time-5);
//flag=1,显示东西19,南北14
P1=0xdd;
//南北绿灯,东西红灯
flag=0;
}
if(ew_time<
=5)//东西时间<
=5时,南北黄灯闪烁,东西红灯
{
flag=0;
display(ns_time,ns_time);
//东西,南北均从5开始倒计时显示
P1=0xdf;
//东西红灯,南北黄灯一亮一灭显示
/*p1_4=0;
*/
delay(5000);
p1_0=~p1_0;
//南北黄灯所在位,对应取反,实现亮灭变化
if(ew_time==0)//如果东西时间为0,赋值a为1,以实现方向转变
a=1;
}
if(a)//a=1,南北显示19开始倒计时,东西14开始倒计时
while(a)//a=1,进入循环
if(ns_time-5>
0)//南北红灯,东西绿灯
while(!
display(ns_time-5,ns_time);
//flag=0,显示南北19,东西14
delay(5000);
//延时子函数调用
P1=0xeb;
//南北红扥个,东西绿灯显示
}
if(ns_time-5<
=0)//南北时间<
=5时南北红灯,东西黄灯闪烁
//flag=0南北显示19开始倒计时,东西14开始计时
display(ns_time,ns_time);
P1=0xfb;
//南北红灯,东西黄灯一亮一灭显示
p1_3=~p1_3;
//东西黄灯P1.3位取反,以实现黄灯亮灭变化显示
//延时函数调用
if(ns_time==0)//如果南北时间为0赋值a为0
a=0;
3.2.2延时子程序:
.delay(intt){
while(t--);
}
3.2.3显示子程序:
display(intew_time,intns_time)
{
chartable[10]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09};
//共阳极数码显示0-9对应的字型码
chari,a[4];
a[2]=ns_time%10;
//南北时间个位数赋值给a[2]
a[3]=ns_time/10;
//南北时间十位数赋值给a[3]
a[0]=ew_time%10;
//东西时间个位数赋值给a[0]
a[1]=ew_time/10;
//东西时间个位数赋值给a[1]
SM1=0;
SM0=0;
//串行口工作方式0设定
for(i=3;
i>
=0;
i--)//分别将4位数送到SBUF区域
SBUF=table[a[i]];
while(!
TI);
//判断是否发送完一个数据
TI=0;
//若发送完,0赋给TI
}
3.2.4中断程序:
voidint0(void)interrupt0
//int0中断子函数,当紧急情况(救护车等)发生时,对应INT0按键调用此函数
{inti,j;
display(00,00);
//显示器显示0000,不再进行倒计时
delay(5000);
for(i=0;
i<
10;
i++)
//利用flag实现东西南北方向红灯均显示亮,对应东西南北方向车流均停止,处理紧急情况
for(j=0;
j<
j++)
{delay(50000);
flag)
{P1=0xdb;
}
voidint1(void)interrupt2
//int1中断子函数,当紧急情况(救护车等)发生时,对应INT1按键调用此函数
display(00,00);
for(i=0;
i++)
j++)
//利用flag实现主干道东西方向绿灯南北方向红灯
{P1=0xeb;
intt0int()interrupt1//t0中断(定时器0中断)子函数
{
//定时50ms初值设定
point--;
//20次T0定时次数控制
if(point==0)
//如果20次到了,改变显示的东西南北方向的时间
flag=1;
point=20;
if(ns_time!
=0)
ns_time--;
if(ew_time!
ew_time--;
3.3软件调试结果与说明
用KeiluVision4软件编程,编译无误后,生成**.hex文件。
把hex文件写入Protues仿真软件进行仿真,按图(见附录)连接电路,进行仿真。
开始仿真,东西南北红、绿、黄三种灯自动按要求规律运行,同时数码管显示相应时间。
按下K,1电路复位。
按下K2东西南北红灯全亮,数码管显示为0。
按下K3,东西绿灯亮,南北红灯。
经多次验证,设计符合要求,则软件调试成功。
第四章实物调试
烧入程序后,接通电源,发现交通灯自动运行,但对应时间不同且数码管显示时间很乱。
用万用表检测后,未发现短路、虚焊的情况。
经线路分析知,74HC164与AT89C51之间连接顺序有误。
改正后,交通灯正常运行但数码管显示数字缺笔划。
经检测后,发现是数码管本身损坏,更换数码管后,系统运行正常。
第五章课程设计小结
两周的课程设计结束了,但我学到了很多。
课程设计的每一个环节都很重要,需要我们的耐心与细心。
一个微小的错误可能会使结果出现很大的差距。
在实物测试过程中,发现了很多的小问题。
例如:
电路按照仿真图焊好后便直接接电源进行测试。
实物与仿真电路中的元件存在差异,这是不可忽略的问题。
在实物调试前,我们应好好想一下,还有什么没做,是否有遗漏的地方。
查找错误要懂得方法,要有针对性,不要胡乱拆线改线。
先从AT89C51芯片查起,看其是否工作后,在查线路问题。
在无法查出问题时应多注意常识性问题。
通过两周的课程设计,明确了软件设计的具体步骤,提高了对定时、中断等编程的认知和理解,同时巩固了所学的知识,掌握了一定的编程技巧。
在设计与检测过程中,独立思考的能力很重要。
遇到问题,不能一味的回避或求助他人,要学会从基础入手,一步一步地分析问题并解决问题。
只有把所学的理论知识与实践相结合起来,才能进一步地提高自身分析问题与解决问题的能力,为将来就业夯实基础。
第六章参考文献
《单片机原理及应用技术》范力旻电子工业出版社
《单片机应用系统设计技术》张齐电子工业出版社《51系列单片机设计实例》楼然苗李光飞北航出版社
《单片机原理与应用》丁元杰机械工业出版社
附录A
1.proteus仿真原理图
2实物效果图
南北绿灯亮19s,东西红灯亮。
南北黄灯亮5s,东西红灯。
东西绿灯14s,南北红灯。
东西黄灯5s,南北红灯
发生交通事故时,交通灯红灯全亮,且数码管显示0
有特殊情况是只有东西通行。
附录B
1.系统程序
#include<
reg52.h>
sbitp1_0=P1^0;
sbitp1_1=P1^1;
sbitp1_2=P1^2;
sbitp1_3=P1^3;
sbitp1_4=P1^4;
sbitp1_5=P1^5;
sbitp0_0=P1^6;
bitflag=0;
//定义显示状态控制位
intns_time;
intew_time;
intns_time_red=20;
intns_time_green=15;
intns_time_yellow=5;
intew_time_red=20;
intew_time_green=15;
intew_time_yellow=5;
charpoint=20;
//定时的控制次数初值设定
inta=0;
//南北,东西两方向切换状态标志初值设定
delay(intt)//延时子函数
while(t--);
display(inttime)//显示子函数
chartable[10]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09};
chari,a[2];
a[0]=time%10;
//时间个位数赋值给a[0]
a[1]=time/10;
//时间十位数赋值给a[1]
for(i=1;
i--)//将数送到SBUF区域
{SBUF=table[a[i]];
ew_time=ew_time_red;
ew_time_red=ns_time_green+ns_time_yellow;
a)//a=0,东西显示19开始倒计时
while(!
display(ew_time);
//flag=1,显示东西19
}
display(ns_time);
//从5开始倒计时显示
//南北黄灯所在位,对应取反,实现亮灭变化
if(ew_time==0)
//如果东西时间为0,赋值a为1,以实现方向转变
if(a)//a=1,东西14开始倒计时
display(ns_time-5);
//flag=0,显示东西14
}
=5时南北红灯,东西黄灯闪烁
//flag=0南北显示19开始倒计时
//东西,南北均从5开始倒计时显示
//东西黄灯P1.3位取反,以实现黄灯亮灭变化显示
intt0int()interrupt1//t0中断(定时器0中断)子函数
TL0=0xb0;
if(point==0)//如果20次到了,改变显示的东西南北方向的时间
voidint0(void)interru