您好,欢迎来到爱够旅游网。
搜索
您的当前位置:首页单片机实验报告(交通灯)

单片机实验报告(交通灯)

来源:爱够旅游网
 单片机实验报告(交通灯)

实验效果:每个方向均从10s开始倒计时计数,计满10s换一次灯亮,红绿灯交换过程中,黄灯闪烁一次。

实验电路:(由于连线的话线路过于繁琐,故采用一一对应标号的方法简化了电路图.)

Respack—8因为P0口内部没有上拉电阻,不能输出高电平,所以要接上拉 阻。排阻就是好多电阻连载一起,他们有一个公共端.由于是上拉电阻,所以接 VCC。

三个 LED灯分别显示红黄绿,南北两侧的红灯和P3.6口相连,绿灯和p3.7口相连,东西两侧绿灯和P3.6相连,红 灯和P3.7相连。所有方向的黄灯均和 P3.5口相连。 和P3.2(外部中断1)相连的开关,当有紧急情况的时候按下,计时停止所有黄灯被点亮。和P1.0相连的开关是解除紧急 情况的。 四个两位的七段码显示器都是用于显示倒计时的

(注:有一个问题是我不知道这个电路是否应该连接晶振,因为在连接了之后我觉得计时的差别不大,故没有连接,但不知道实际操作的过程中又没有必要)

程序段: 分别设定了两个中断子程序,一个用于计时,一个用于处理紧急情况。且warn的中断优先级高于time 这里的R1,用于控制灯亮的循环没循环一次自加一,然后用它做除2的操作,得到的余数就将会以0和1交替进行,可以用于交换点亮红灯和绿灯(PS:这是我自己觉得我想的比较好的一个idea,嘿嘿····自我夸奖一下) 这些空间了分别设定了计数开始的时间,响铃时间和LED七段显示器所显示的时间。由于是倒计时,所以所有计算需要反着进行。 受R1的控制,由于R1的大小变化,引起A的变化,从而进入不同的循环体,点亮不同的灯,实现红绿灯的交替进行。

用于判断设定的10s换灯时间是否已经到达。若到达跳转TIMEBEAR,没有到达则继续显示时间。 TIME 是一个时间算法程序,利用 进栈出栈的方法对时间进行运算 时间达到后使红灯和绿灯均熄灭。使黄灯闪烁。(这里我不知该怎么达到黄灯多次闪烁的效果,我用了两种方法一种是:将clr p3.5 mov r4,#20 dl10:mov r7,#05h dl0:mov r6,#0ffh dl60:djnz r6,$ djnz r7,dl0 djnz r4,dl10 setb p3.5 扩展成为: clr p3.5 mov r4,#20 dl10:mov r7,#05h dl0:mov r6,#0ffh dl60:djnz r6,$ djnz r7,dl0 djnz r4,dl10 setb p3.5 mov r4,#20 dl11:mov r7,#05h dl00:mov r6,#0ffh dl160:djnz r6,$ djnz r7,dl00 djnz r4,dl11 clr p3.5 dl22:mov r7,#05h dl33:mov r6,#0ffh dl44:djnz r6,$ djnz r7,dl33 djnz r4,dl22 setb p3.5 是可以闪烁两次,但是效果总是不太理想。 还有一种书调用书上的延时程序,但是调用了之后本来正常变换的红绿灯却不能变换了··很奇怪是为什么。。。。。很郁闷·。。。。) Display1是一个显示时间的子程序,本质是利用程序最后的转换表将二进制转换为七段显示器可以显示的内容。 相当于一个延时,是七段显示器上显示的内容可以维持足够的时间。 前面想黄灯闪烁的时候本来想调用这个延时程序,但是调用以后,连红绿灯都不能够正常的转换了,不明白是为什么。 warn是紧急中断子程序,当紧急按钮按下的时候,计时停止所有方向都显示黄灯,并判断解除紧急情况的按钮是否按下,按下的话结束中断回到主程序,没有按下的话继续执行中断。

七段码显示的转换表。

程序效果展示:

程序开始的时候,分别为南北为红灯亮,东西为绿灯亮。七段显示器同时进入倒计时的状态。

10s计时结束,黄灯闪烁两次。

黄灯闪烁结束以后,绿灯被点亮,又开始10s倒计时。

绿灯计时结束后黄灯又闪烁两次,然后红灯再亮依次循环

(黄灯闪烁) (红灯再次点亮进入倒计时)

紧急按钮按键按下的时候,计时停止,所有方向的黄灯均被点亮 点解除紧急的按钮,红绿灯显示恢复正常状态

实验总结:

这是第一次做比较大一点的程序,做出来之后的心情还是比较激动的,因为之前根本没有想过自己可以做的出来。先说说实验中遇到的问题和一些解决方法。

1. 第一个要解决的问题就是倒计时的问题,然后想到的就是应该吧七段码转换表倒置,这样显示的时间就可以是逆序的,其次由于表倒置了,所以计数的数值也要倒着来。比如我想设定闹钟为10s,则需要设置时间为09和08这样显示的闹钟时间才是10s

2. 第二点问题就是,交通灯是一个循环的过程,其实我想用尽量少得语句达到这个循环的目的,于是我只用了两个口控制东西南北的红绿灯,用P3.6控制南北方向的红灯和东西方向的绿灯,P3.7控制南北方向的绿灯和东西方向的红灯,然后设置了一个R1作为变量没循环一次,R1加1,然后R1和2相除,得到的余数这是0或者1,这用余数加上cjnz语句就可以起到循环的作用控制红绿灯的交替点亮,我觉得这样比较简单,而且用到的控制口比较少,比较方便。

3. 因为紧急按钮按下,应该是比较紧急的事情,所以我把紧急按钮按外部中断0的接口相连,由于外部中断0的中断优先级最高,所以当按钮一按下,程序自动调至中断程序执行。

4. 有紧急按钮当然需要解除紧急的按钮,所以在执行外部中断0的时候需要判断解除紧急的按钮是否按下,开始的时候我编写的程序是:

但是我发现这样谁然黄灯灭了,程序回到了主程序,计时还是停止的,没有反应。

查找书以后,我才知道,中断结束应该是要调至reti,于是我就把程序修改为:

这样当解除紧急情况的按键按下的时候,紧急中断就结束了,程序就又恢复到了正常的状

态。

实验中得问题:

最后实验中还没解决的问题就是黄灯的闪烁问题,我不知道怎么才能控制黄灯闪烁成我想

它闪烁的样子,如程序段中所示。

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- igbc.cn 版权所有

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务