单片机红绿灯报告.docx

上传人:b****7 文档编号:10852796 上传时间:2023-02-23 格式:DOCX 页数:23 大小:2.26MB
下载 相关 举报
单片机红绿灯报告.docx_第1页
第1页 / 共23页
单片机红绿灯报告.docx_第2页
第2页 / 共23页
单片机红绿灯报告.docx_第3页
第3页 / 共23页
单片机红绿灯报告.docx_第4页
第4页 / 共23页
单片机红绿灯报告.docx_第5页
第5页 / 共23页
点击查看更多>>
下载资源
资源描述

单片机红绿灯报告.docx

《单片机红绿灯报告.docx》由会员分享,可在线阅读,更多相关《单片机红绿灯报告.docx(23页珍藏版)》请在冰豆网上搜索。

单片机红绿灯报告.docx

单片机红绿灯报告

2016年电子工程专业2014级卓越工程师班

《单片机与微机原理及应用》

课程设计报告

 

设计题目:

十字路口红绿灯模拟设计

专业班级:

电子卓越1401班

学生姓名:

林晓强

学生学号:

5120141478

指导教师:

聂诗良、许超(助教)

答辩日期:

第13周周六上午9点

答辩地点:

综合楼4-311实验室

 

西南科技大学信息工程学院制

2016年5月

目录

1.摘要 1

1.1课程设计制作题目及要求1

2.系统方案设计1

2.1设计思路1

2.2总体设计框图2

3.硬件设计2

3.1硬件选型2

3.2系统硬件电路原理详图4

3.3实际连线详图5

3.3.1共阴极数码管原理图以及四位数码管引脚图5

3.3.2红绿灯模拟仿真电路5

3.3.351单片机主控实物图以及原理图5

4.软件设计6

4.1软件功能设计6

4.2软件流程设计7

4.2.1主流程图7

4.2.2按键判断8

4.2.3数码管显时8

5.软件调试9

5.1单元调试9

5.1.1显示模块测试9

5.1.2按键模块测试9

5.2总体测试9

6.心得体会9

7.参考文献10

附录111

附录221

十字路口红绿灯设计

1摘要

(1)近年来随着科技的飞速发展,单片机的应用正在不断深入,同时带动传统控制检测技术日益更新。

在实时检测和自动控制的单片机应用系统中,单片机往往作为一个核心部件来使用,仅单片机方面知识是不够的,还应根据具体硬件结构软硬件结合,加以完善。

(2)十字路口车辆穿梭,行人熙攘,车行车道,人行人道,有条不紊。

那么靠什么来实现这井然秩序呢?

靠的就是交通信号灯的自动指挥系统。

交通信号灯控制方式很多。

本系统采用AT89S52单片机来设计交通灯控制器,实现了红绿灯循环点亮,倒计时剩5秒时黄灯闪烁警示;红绿绿灯时间可调节(根据实际情况灵活控制)并可通过双位数码管显示。

本系统实用性强、操作简单、扩展功能强。

1.1课程设计制作题目及要求 

用AT89S52单片机模拟十字路口红绿灯。

要求:

南北方向和东西方向各三个led灯(红黄绿),并用数码管显示通行的时间,通行时间可通过按键修改。

要求:

(3)红绿灯交替:

初始化时南北方向绿灯放行,最后5s黄灯警告,东西方向红灯禁止通行,然后南北方向和东西方向状态切换。

(4)交替时间可控:

绿灯亮起通行时间可以通过按键增加或者减少。

(5)时间用数码管时刻显示:

南北方向和东西方向红绿灯亮的时间时刻由两位数码管显示。

2.系统方案设计

2.1设计思路

为了实现十字路口交通灯的模拟,我们首先在网上收集相关资料,然后在到实际交通路口观察红绿灯工作情况,在然后进行仿真软件的仿真,最后进行单片机实物的模拟测试。

此设计的时间控制用AT89s52的定时器进行,设定定时器初值为46080,(由于晶振为11.0592,故所记次数应为46080,计时器每隔50000微秒发起一次中断),记录20次中断标志为1s,同时用IO口的电平转换来检测按键,来判断相应的功能。

用数码管显示时刻相应的时间。

2.2总体设计框图

 

3.硬件设计

3.1硬件选型

单片机特点:

(1)高集成度,体积小,高可靠性单片机将各功能部件集成在一块晶体芯片上,集成度很高,体积自然也是最小的。

芯片本身是按工业测控环境要求设计的,内部布线很短,其抗工业噪音性能优于一般通用的CPU。

单片机程序指令,常数及表格等固化在ROM中不易破坏,许多信号通道均在一个芯片内,故可靠性高。

(2)控制功能强为了满足对对象的控制要求,单片机的指令系统均有极丰富的条件:

分支转移能力,I/O口的逻辑操作及位处理能力,非常适用于专门的控制功能。

(3)低电压,低功耗,便于生产便携式产品为了满足广泛使用于便携式系统,许多单片机内的工作电压仅为1.8V~3.6V,而工作电流仅为数百微安。

(4)易扩展片内具有计算机正常运行所必需的部件。

芯片外部有许多供扩展用的三总线及并行、串行输入/输出管脚,很容易构成各种规模的计算机应用系统。

(5)优异的性能价格比单片机的性能极高。

为了提高速度和运行效率,单片机已开始使用RISC流水线和DSP等技术。

单片机的寻址能力也已突破64KB的限制,有的已可达到1MB和16MB,片内的ROM容量可达62MB,RAM容量则可达2MB。

由于单片机的广泛使用,因而销量极大,各大公司的商业竞争更使其价格十分低廉,其性能价格比极高。

数字逻辑电路特点:

用数字电路逻辑器件组成控制电路,这样原理简单清楚,但是调节起来很复杂,需要更改电路结构。

根据设计要求及设计的需要我采用单片机来作为控制手段,选用AT89S52单片机作为该课程设计的核心来对数字信息进行处理及储存。

它是一个低电压,高性能的CMOS8位单片机,片内含8kbytes的可反复擦写的Flash只读程序存储器和256bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,有40个引脚,32个外部双向输入/输出(I/O)端口,同时内含2个外中断口,3个16位可编程定时计数器,2个全双工串行通信口,2个读写口,AT89S52可以按照常规方法进行编程,也可以在线编程。

3.2系统硬件电路原理详图

3.2.1复位电路原理图以及时钟电路原理图

3.3实际连线详图

3.3.1共阴极数码管原理图以及四位数码管引脚图

3.3.2红绿灯模拟仿真电路

3.3.351单片机主控实物图以及原理图

4.软件设计

4.1软件功能设计

利用单片机的定时器产生准确的时钟信号,从而进行时间控制,控制十字路口的红、黄、绿灯交替亮灭。

并且使用共阴极四位LED数码管,时刻显示当前路口的红灯或者绿灯还将持续的时间。

两个方向的通行时间可用按键进行设置,可以控制路口的红绿灯的持续时间,这样模拟现实中的不同时间段,车流量不同而智能控制时间,这样更加合理的控制路口的通行,提高道路的通行效率,系统的启停和复位也由按键控制。

4.2软件流程设计

4.2.1主流程图

4.2.2按键判断

4.2.3数码管显时

5.软件调试

5.1单元调试

5.1.1显示模块测试

首先在硬件电路上按照要求连接数码管,然后由单片机控制,看能否控制数码管显示任何组合,测试通过则开始调试红绿灯程序代码,不通过则检查问题,硬件问题或者软件问题。

然后连接6个LED灯,模拟交通灯的过程中,由于南北方向和东西方向的情况分别一样,所以只是用一组LED,连接好硬件电路之后,用万用表的测试通断档检测每个LED的好坏,有问题则更换LED,没有问题则进去软件调试。

最后在中断完成扫描一次数码管,看数码管的显示是否良好,消隐是否消彻底,测试完成后,确认无误则进行下一步测试。

5.1.2按键模块测试

在按键接入电路之后,用万用表的测试通断档检测每个按键按下时,按键是否接通如果接通,则按键电路硬件无误,在软件程序里面测试,每个检测按键的程序都延时一小段时间在检测按键情况,如果按键情况不变,则判断执行按键程序,如若延时后按键情况消失,则判断为系统的电源抖动,不予处理。

5.2总体测试

在程序搭建完成之后,结合硬件进行最后的测试,用按键控制时间加减,然后观察程序的BUG,做多种尝试,尽量消除完程序存在的BUG,比如时间如果减为0,或者时间加到数码管显示的最大值之后怎么处理,都是我们程序里面要考虑到的问题,然后检测中断程序控制的时间与实际时间的差距,尽量调整时间没有差距,这也是程序控制与实际的结合,达到误差标准之后,然后运行程序,要求时间持续时间长,如果出现问题,那么就要分析问题原因,是硬件问题还是软件BUG,将问题处理完之后,作品完成。

6.心得体会

在调试的过程中,遇到很多问题,第一、不够细心比如由于粗心大意焊错了线,由于对单片机理论的不熟悉导致编程出现错误。

第二,是在学习态度上,这次课设是对我的学习态度的一次检验。

对于这次单片机综合课程实习,我的第一大心得体会就是作为一名工程技术人员,要求具备的首要素质绝对应该是严谨。

我们这次实习所遇到的多半问题多数都是由于我们不够严谨。

第三,在做人上,我认识到,无论做什么事情,只要你足够坚强,有足够的毅力与决心,有足够的挑战困难的勇气,就没有什么办不到的。

在这次难得的课程设计过程中我锻炼了自己的思考能力和动手能力。

通过题目选择和设计电路的过程中,加强了我思考问题的完整性和实际生活联系的可行性。

在方案设计选择和芯片的选择上,培养了我们综合应用单片机的能力,对单片机的各个管脚的功能也有了进一步的认识。

还锻炼我们个人的查阅技术资料的能力,动手能力,发现问题,解决问题的能力。

并且我们熟练掌握了有关器件的性能及测试方法。

再次感谢老师的辅导以及同学的帮助,是他们让我有了一个更好的认识,无论是学习还是生活,生活是实在的,要踏实走路。

课程设计时间虽然很短,但我学习了很多的东西,使我眼界打开,感受颇深。

7.参考文献

[1]周伟,淮阴师范学院,数学科学学院,《c语言程序设计》课程教学研究,维普期刊资源整合服务平台。

[2]谭浩强,《c语言程序设计》(第四版),清华大学出版社,北京,2010年。

[3]郭天祥.十天学会单片机。

 

附录1

《C语言源程序代码》

#include

#include

#defineuintunsignedint//宏定义

#defineucharunsignedchar//宏定义

#defineGPIO_LEDP3//数码管段选

sbitK1=P1^0;//按键1

sbitK2=P1^1;//按键1

sbitK3=P1^2;//按键1

ucharcodewetable[]={0xf7,0xfb,0xfd,0xfe};//共阴极数码管位选0xfe,0xfd,0xfb,0xf70xef,0xdf,0xbf,0x7f共阳极数码管位选

ucharcodedutable[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//数码管段选

ucharcodeLEDFLAG[]={0xde,0xdd,0xf3,0xeb};//LED灯亮的四种状态

uintclosedu,closewe,n1=0,n2=0,n=0;

//voidTimerConfiguration();

voidinit();

unsignedcharTime,shi1,ge1,shi2,ge2,wenum,count,Time;//定义变量

voiddisplay(uintshi1,uintge1,uintshi2,uintge2);//时间显示函数

voiddelay(uintz);//延时函数

voidDelay10ms(void);//10MS延时函数

 

voidmain(void)

{

//unsignedcharTime=0;

ucharn0=0;

uchark=0,k1=0,k2=0;

ucharm=0;

P1=0xff;

GPIO_LED=0X00;//

n1=30;

n2=n1;

shi1=n1/10;

ge1=n1%10;

shi2=n2/10;

ge2=n2%10;//手动选择初始化时间

display(shi1,ge1,shi2,ge2);//时刻显示设置时间值

while

(1)

{

if(K1==0)//检测按键K1是否按下

{

delay(1000);//消除抖动

if(K1==0)//确认按键K1按下

{

n1++;//手动加时间

n2=n1;

shi1=n1/10;

ge1=n1%10;

shi2=n2/10;

ge2=n2%10;

Delay10ms();

}

}

if(K2==0)//检测按键K2是否按下

{

delay(1000);//消除抖动

if(K2==0)//确认按键K2按下

{

n1--;//手动减时间

n2=n1;

shi1=n1/10;

ge1=n1%10;

shi2=n2/10;

ge2=n2%10;

Delay10ms();

}

}

if(K3==0)//检测按键K3是否按下

{

delay(1000);//消除抖动

if(K3==0)//确认按键K3按下

{

init();//计时器初始化,开始倒计时

n0=n1+n2;

k=n0;

k1=n1;

k2=n2;

while

(1)

{

if(Time==20)

{

n0--;

n1--;

n2--;

if(n0>k1+5)

{

P0=LEDFLAG[0];

}

//delay(100);

elseif(n0>k1&&n0<=k1+5)

{

P0=LEDFLAG[1];

}

elseif(n0<=k1&&n0>5)

{

P0=LEDFLAG[2];

}

elseif(n0>0)

{

P0=LEDFLAG[3];

}

if(n0==1)

{

n0=k;

}

if(n1==0)

{

n1=k1;

}

if(n2==0)

{

n2=k2;

}

Time=0;

}

shi1=n1/10;

ge1=n1%10;

shi2=n2/10;

ge2=n2%10;

display(shi1,ge1,shi2,ge2);

}

}

}

display(shi1,ge1,shi2,ge2);

}

}

voidDelay10ms(void)//误差0us

{

unsignedchara,b,c;

for(c=1;c>0;c--)

for(b=38;b>0;b--)

for(a=130;a>0;a--);

}

voiddelay(uintz)//延时1ms

{

uintx,y;

for(x=z;x>0;x--)

{

for(y=0;y<11;y++)

{

}

}

}

voiddisplay(uintshi1,uintge1,uintshi2,uintge2)//数码管显示函数

{

closedu=0xff;

closewe=0xff;

wenum=3;

P2=wetable[wenum];//打开第一个数码管的位选

P3=dutable[ge2];//赋上第一边的秒数的个位

delay(10);

P2=closewe;//关闭位选

//P3=closedu;//关闭段选

wenum--;

P2=wetable[wenum];//打开第二个数码管的位选

P3=dutable[shi2];//赋上第一边的秒数的十位

delay(10);

P2=closewe;//关闭位选

//P3=closedu;//关闭段选

wenum--;

P2=wetable[wenum];

P3=dutable[ge1];

delay(10);

P2=closewe;//关闭位选

//P3=closedu;//关闭段选

wenum--;

P2=wetable[wenum];

P3=dutable[shi1];

delay(10);

wenum=3;

}

voidinit()//计时器初始化函数

{

 

count=0;

wenum=0;

closedu=0xff;

closewe=0xff;

P2=closewe;//关闭位选

P3=closedu;//关闭段选

TMOD=0x01;

TH0=(65536-46080)/256;//由于晶振为11.0592,故所记次数应为46080,计时器每隔50000微秒发起一次中断。

TL0=(65536-46080)%256;//46080的来历,为50000*11.0592/12

EA=1;//打开总中断

ET0=1;

TR0=1;//开始计时

}

voidtime0()interrupt1

{

TH0=(65536-46080)/256;//由于晶振为11.0592,故所记次数应为46080,计时器每隔50000微秒发起一次中断。

TL0=(65536-46080)%256;//46080的来历,为50000*11.0592/12

count++;

if(count==1)

{

count=0;

Time++;

}

}

 

附录2

程序模块原理图以及部分实物图

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 其它课程

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1