基于51单片机的红绿灯模拟系统_第1页
基于51单片机的红绿灯模拟系统_第2页
基于51单片机的红绿灯模拟系统_第3页
基于51单片机的红绿灯模拟系统_第4页
基于51单片机的红绿灯模拟系统_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、基于51单片机的红绿灯模拟系 统基于增强型 8051 单片机的红绿灯模拟控制系统 2012 年 11 月 13 日目录 TOC o 1-5 h z 系统功能介绍 5系统结构框图 . 5各部分功能说明 . 5二、系统方案 6系统设计与结构框图 6方案论证与比较 6虚拟仿真模块 6控制器模块 8交通灯显示模块 9数码管显示模块 10蜂鸣器模块 13矩阵键盘模块 14三、方案不足与改进方案 15控制器模块 . 15显示输出模块(数码管模块、红绿灯模块) . 15输入模块(矩阵键盘模块) 16拓展模块 17四、项目清单与注意事项 17项目清单 17注意事项 174.2.1 模拟仿真 17连接电路 18

2、软件调试与故障排除 18五、程序代码 18附录、相关芯片资料 4174HC573中文资料 . 41摘要:本系统是以 STC 公司的 STC12C5A60S2 单片 机为主控制器,通过 74HC573 驱动 4 位数码管显 示红绿灯倒计时, 能实现红绿灯的模拟控制, 并具 有比较强的适应性和可调性。关键词:44 矩阵键盘;STC12C5A60S2;74HC573。系统功能介绍1.1 系统结构框图1.2 各部分功能说明(1)红绿灯模块可以实现红绿灯系统的显示模拟,在黄灯亮时,另一个方向上的红灯会闪烁;(2)数码管模块可以显示路口各个方向红灯、黄 灯和绿灯的持续时间,并进行倒计时;(3)矩阵键盘模块

3、可以进行对倒计时时间的修改, 修改的时间可由数码管显示;(4)蜂鸣器在交通灯的状态发生改变时,会有不 同的声音提示。二、系统方案系统设计与结构框图根据题目要求, 本系统主要由虚拟仿真模块, 控 制器模块, 交通灯显示模块, 数码管显示模块, 蜂 鸣器模块,矩阵键盘模块组成。方案论证与比较2.2.1 虚拟仿真模块我们决定先通过 proteus 软件仿真, 设计好电路 与程序,再动手焊接系统板。因为通过软件仿真, 设计系统时灵活性会大一些,可以提前选择好硬 件,便于硬件部分的修改, 也可以做到软件部分的 即时调试。仿真时的状况如图 2-2 所示:图 2-1 Proteus 软件欢迎界面图 2-2

4、Proteus 仿真情况控制器模块控 制 器 模 块 我 们 决 定 选 择 STC 公 司 的 STC12C5A32S2 单片机。STC12C5A60S2/AD/PWM 系列单片机是 STC 生产的单时钟 /机器周期( 1T) 的单片机,是高速 /低功耗 /超强抗干扰的新一代 8051 单片机,指令代码完全兼容传统 8051,但速 度快 8-12 倍。内部集成 MAX810 专用复位电路,2 路 PWM,8 路高速 10 位 A/D 转换(250K/S,即 25 万 次 / 秒 ), 针 对 电 机 控 制 , 强 干 扰 场 合 。 (STC12C5A32S2 系列单片机器件手册);内部

5、结构相对简单, 可用作入门级芯片; 而且我们手中 已经有几块 STC12C5A32S2 系列单片机最小应用 系统,便于硬件电路的焊接。 最小系统电路图参考 图 2-3:图 2-3 最小系统电路图交通灯显示模块方案一:采用四组红黄绿三色二极管, 通过 10K 的排阻分别连至单片机的 P1.0-P1.6 口,通过改变 P1.1-P1.6 的输出电平控制交通灯的亮灭。缺点是 占用 I/O 口较多,但易于编程控制;方案二:采用 74HC573 芯片控制四组发光二极 管。通过 P0.0-P0.5 向 74HC573 发送信号, P2 中 某一 I/O 口控制芯片的开启和关闭。 优点是能比较 大的节约 I

6、/O 口,缺点是会增加编程复杂度。由于单片机的 I/O 口足够用来实现系统的基本 功能,所以我们决定采用方案一。 如果之后扩展功 能时还会需要更多的 I/O 口时,可以考虑换成方案方案一的电路图如下:图 2-4 交通灯模块电路图(方案一)2.2.4 数码管显示模块方案一:采用两片 74HC595 芯片驱动共阳极四 位数码管。 一片控制段选, 一片控制位选。 位选信 号通过三极管 9012 放大。优点是占用 I/O 口较少, 但在仿真过程中出现了一些问题。 问题如下: 静态 显示时数码管显示正常, 但动态仿真时虽然单片机的各个引脚的电平变化正常,但位选信号( 9012 的基极输入信号) 的一直为

7、零。更改限流电阻以后, 数码管全部显示 8。经查阅资料,得知在程序和硬 件电路正常显示的情况下, 数码管不正常显示的原 因,可能是因为数码管的响应时间过短,对 PNP 三极管的仿真速度太低。资料中建议使用 NPN 型 三极管,并将数码管的 minimum Trigger Time 值 调高。这也说明了仿真与硬件电路之间的不统一。 电路图如下图所示:方案二:采用两片 74HC573 芯片驱动共阴极四 位数码管。一片控制段选,一片控制位选。通过 P0 口控制输出电平,故需要上拉电阻。上拉电阻 采用 10K 的排阻。优点是软件控制比较简单,但 相比方案一要占用更多的 I/O 口。此方案在仿真时 也出

8、现了问题, 即数码管显示乱码。 之后通过对数 码管进行软件清屏的方法使数码管显示正常。 方案 二的电路图如下图所示:为了使硬件电路与仿真有较高的统一性, 我们决 定采用方案二。图 2-5 数码管电路仿真图(方案一)图 2-6 数码管电路仿真图(方案二)2.2.5 蜂鸣器模块方案一:通过控制蜂鸣器, 使蜂鸣器发出不同的 声音,指示交通灯路口的不同状态。 其优点是控制 较为简易, 缺点是通过蜂鸣器的发声, 不同路口之 间通行状态是通过蜂鸣器的不同频率的声音决定 的,但不同频率的声音与不同方向的通行状态之间 的对应关系不直观,交互性较差。方案二:通过 ISD400 x 系列语音芯片,录放不 同的声音

9、, 指示交通灯路口的不同状态。 其优点是 可以让通行者直观的了解各个方向下一步的通行 状态,有很强的交互性, 缺点是硬件电路和软件控 制较为复杂, 占用较多的 I/O 口,而且与其他部分 之间的时序比较难以协调。由于本系统的制作本着仿真模拟的原则, 暂时通 过蜂鸣器来代替语音信息, 但在以后的实验中可以 考虑用 ISD400 x 系列语音芯片代替蜂鸣器。2.2.6 矩阵键盘模块根据题目要求,本系统最少三个按键就可以实现 按键调节时间功能。 但为了更好的完成项目, 和以 后的功能拓展,我们决定采用 4*4 矩阵按键。方案一:通过 P3 口控制矩阵按键。优点是易于 编程,其缺点是占用过多的 I/O

10、 口。但由于按键在 一般情况下都是断开的, 所以同一个引脚还可以扩 充其他功能。其原理图如下图所示:方案二:采用改进型 I/O 端口键盘。优点是 I/O 端口只占用 4 个,但在编程上复杂度增加。 其原理 图如下图所示:所以目前在 I/O 口比较充足的情况下, 我们决定 先采用方案一,在以后的改进工作中考虑将其换成图 2-7 矩阵键盘仿真电路图(方案一)三、方案不足与改进方案控制器模块I/O 口的利用情况较差。在各引脚中, P0 口和 P2.6, P2.7 用来控制 74HC573 驱动数码管, P2.0 P2.5 用来控制红绿灯; P3 控制按键; P1.0 控制蜂鸣器,还有 P1.1P1.

11、7 没有用。这几个口 可以用来接更多的外设, 比如 AD 模块等。但在很 多模块上,存在着引脚“浪费”的情况。矩阵按键 可以用四个 I/O 口实现,也可以用 P0 口的模数转 化器 ADC 通道实现。可以考虑把两片 74HC573 芯片换成功能更强大的 MAX7219 芯片;如果仍使 用 74HC573 芯片的话,可以考虑将红绿灯模块也 用该芯片驱动,这样只会再增加一个 I/O 口的使 用。显示输出模块(数码管模块、红绿灯模块)1、显示模块就占用了 P1,P2 的 14 个 I/O 口,使 得系统的可改进程度降低。 可以考虑更换显示模块 的驱动芯片,如 3.1 中所述,也可以将红绿灯与倒 计时

12、协调起来,用另外一片 74HC573 驱动。2、倒计时方面,由于在各个方向上(除一个方向 上亮黄灯, 另一个方向上红灯闪烁外) 倒计时的显 示相同,在做仿真模拟时只选择了两位数码管进行 倒计时显示。 在改进阶段, 需要把黄灯亮, 红灯闪 烁的情况考虑进去, 将数码管 SEG1 的剩余两位用 上,SEG1 的前两位和后两位分别显示不同方向上 的倒计时。3、做好倒计时模块以后,还有 SEG2 数码管没有 用上。可以考虑将其做成一个温度计, 选择功能比 较强大的如 DS18xx 数字化温度传感器, 占用线口 少、连接方便、测量精度高的传感器。输入模块(矩阵键盘模块)1、4*4 的矩阵键盘占用了 P3

13、 口,限制了功能的拓 展。但按键在释放的状态下, P3 口还是可以用来 实现更多功能,只要按键不被按下, P3 口的其他 功能就不会受影响;2、矩阵键盘 16 个按键目前为止只用了四个, 分别 是:时间选择键、个 /十位切换键、增加键、减小 键。但还有 12 个键没有使用。这十二个键可以仿 照小键盘的模式, 分别对应 0-9 这十个数, 另外两 个键设定为紧急状态键。3、若在之后的改进中存在 I/O 口不够用的情况, 可以换成改进型 I/O 端口键盘。拓展模块1、可以考虑用压力传感器模拟超载监测装置; 2、可以考虑用光敏电阻、 ADC ,DAC 来制作可调 光强的红绿灯。四、项目清单与注意事项

14、项目清单( 1)数码管显示模块: 74HC573,( 2)MCU 控制模块: STC12C5A32S2, IC 座, LED ,SPI 插座等(3)基本元器组件:电阻、瓷片电容,电解电容,9012,8050,1N4007,排针,杜邦线,开关,导 线注意事项4.2.1 模拟仿真模拟仿真只是工具,仿真的目的是为了更好的制 作硬件和辅助调试软件。 当程序和电路图没有问题 时却得不到正确的仿真效果, 应该考虑是不是仿真 本身的问题; 或者将该模块的硬件先搭出来, 通过 硬件电路调试。不要过度的依赖仿真。连接电路连接电路前尽量都要做出仿真实验, 避免不必要 的麻烦和损失(元器件烧坏等问题) ;做不出仿真

15、 的先手动搭出硬件电路, 经测试成功后再焊接。 电 路板可以选用一种多个金属环连接在一起的板子, 减少焊接线的数量。软件调试与故障排除如果在调试中出现问题, 应考虑是硬件问题还是 软件问题。 若是硬件问题, 对照电路图检查连接是 否有误;检查芯片是否坏掉; 检查各焊点是否存在 虚焊等接触不良的问题; 若是软件问题, 检查算法 是否有误;还有编译器自身的问题。五、程序代码(本程序在 proteus 上已仿真成功)#includereg51.h#define uchar unsigned char#define uint unsigned intsbit dula=P26;/U2 锁存器的锁存端s

16、bit wela=P27;/U3 锁存器的锁存端uchar code table= 0 x3f,0 x06,0 x5b,0 x4f, 0 x66,0 x6d,0 x7d,0 x07, 0 x7f,0 x6f,0 x77,0 x7c, 0 x39,0 x5e,0 x79,0 x71,0 x08;/最后一个是下划线, 用来做闪烁uint code jiepai=524,262,293,330,349,392,440,494; / 节拍 uchar code yindiao=55,110,98,87,82,73,65,58; / sbit P20=P20;/ 红绿灯的位定义 sbit P21=P21

17、;sbit P22=P22;sbit P23=P23;sbit P24=P24;sbit P25=P25;sbit s1=P30;/定义按键,功能键sbit s2=P31;/定义按键,十位个位选择键sbit s3=P32;/定义按键,增大键sbit s4=P33; /定义按键,减小键sbit rd=P37;sbit fmq=P10; / 蜂鸣器定义端ucharnum1, /倒计时剩余时间,单位是秒num2, /50ms 计数标志位shi,ge; /十位个位倒计时暂存变量uchar s1num; / 按键功能判断标志, 取值为 1,2,3,4, 分别对应两个方向的倒计时不同状态uint time

18、r4=10,5,10,5; /数组,里面的数据是4 种不同状态倒计时的时间unsigned int m; / 红灯闪烁延时uint cnt=1;/ 状态切换标志uint flag=0;/ 时间调整个位十位切换位void delayms(unit);/延时函数声明void display(uchar,uchar); /数码管显示函数声明void matrixkeyscan(); /扫描键盘函数void move(); / 修改定位void save_data(uint,uint);/ 保存数据void yanzou(uchar yindiao,uint jiepai);/ 蜂鸣器函 数声明/*函

19、数功能:主函数*/void main(void)num1=timer0;TMOD=0 x01; /计时器设置 TH0=(65536-45872)/256; / 计时器设置 TL0=(65536-45872)%256; /计时器设置TR0=1; /计时器设置ET0=1; /计时器设置EX0=1; /emergency 中断设置IT0=1; /emergency 中断设置 EA=1;/总开关num1=timer0;shi=num1/10; /使数码管初始显示正确 ge=num1%10;s1num=0;rd=0;while(1)matrixkeyscan(); / 在主函数中不停进行按 键扫描swi

20、tch (cnt)case 1:while(1)/在主函数中不停进 /状态 1 matrixkeyscan(); 行按键扫描display(shi,ge); /数码管倒计时显示P20=1;/红绿灯显示P21=1;P22=0;P23=0;P24=1;P25=1;if(cnt=2)yanzou(yindiao1,jiepai1/2);yanzou(yindiao2,jiepai2/2);break; break;case 2: while(1) /状态 2 matrixkeyscan(); /在主函数中不停进 行按键扫描display(shi,ge);P20=1;P21=0;P22=1;P23=1

21、;for(m=150;m0;m-)display(shi,ge);P23=0;for(m=150;m0;m-)display(shi,ge);P24=1;P25=1;if(cnt=3)yanzou(yindiao2,jiepai2/2);yanzou(yindiao3,jiepai3/2); break; break;case 3:while(1)/状态 3matrixkeyscan(); /在主函数中不停进行按键扫描display(shi,ge);P20=0;P21=1;P22=1; P23=1; P24=1;P25=0;if(cnt=4) yanzou(yindiao5,jiepai5/2

22、); yanzou(yindiao6,jiepai6/2);break; break; case 4: while(1) /状态 4 matrixkeyscan(); /在主函数中不停进 行按键扫描display(shi,ge);P21=1;P22=1;P23=1;P24=0;P25=1;P20=1;for(m=150;m0;m-)display(shi,ge);P20=0;for(m=150;m0;m-)display(shi,ge);if(cnt=1)yanzou(yindiao6,jiepai6/2);yanzou(yindiao1,jiepai1/2); break; break;/*

23、函数功能:延迟 cnt 毫秒*/void delay (long cnt)/ 闪烁延时函数 uint i,j;for(i=cnt;i0;i-) for(j=110;j0;j-);/*/*函数功能:将十位和个位数字送至数码管显 示*/void display(uchar shi,uchar ge) / 显示子函数dula=1;P0=tableshi;/送段选数据dula=0;P0=0 xff; /* 送位选数据前关闭所有 显示,防止打开位选锁存时wela=1;/原来的段选数据通过位选锁存器造成混乱 */P0=0 xfe;/送位选数据wela=0;delay(1);/延时约 1 毫秒P0=0 x0

24、0;dula=1;P0=tablege;dula=0;P0=0 xff;wela=1;P0=0 xfd;wela=0;delay(1);P0=0 x00;/*/*函数功能:中断服务函数,可计算出送给数码管的数据*/void T0_time(void) interrupt 1 / 时间延时函数TH0=(65536-45872)/256; /计时器设置TL0=(65536-45872)%256; / 计时器设置num2+;if(num2=20)秒时间已到 num2=0;计 20 次 num1-; shi=num1/10;分别送给数码管显示 ge=num1%10;/如果到了 20 次,说明 1/然后

25、把 num2 清 0 重新再/把一个 2 位数分离后/十位和个位if(num1=0)/ 这个数用来送数码管显示,到 60后归 0cnt+;switch(cnt)case 1:num1=timer0;break;case 2:num1=timer1;break;case 3:num1=timer2;break;case 4:num1=timer3;break;default:cnt=1;num1=timer0;break;/*/*函数功能:键盘扫描*/void matrixkeyscan()if(s1=0)delay(5);if(s1=0)s1num+;while(!s1);if(s1num=1

26、)/绿灯时长TR0=0;move(); / 修改定位shi=num1/10;/把一个 2 位数分离后分别送给数码管显示ge=num1%10;/十位和个位/shining(); /修改闪烁if(s1num=2)/黄灯时长move(); / 修改定位shi=num1/10;/把一个 2 位数分离后分别送给数码管显示ge=num1%10;/十位和个位/shining(); /修改闪烁if(s1num=3)/绿灯时长TR0=0;move(); / 修改定位shi=num1/10;/把一个 2 位数分离后分别送给数码管显示ge=num1%10;/十位和个位/shining(); /修改闪烁if(s1nu

27、m=4)/黄灯时长move(); / 修改定位 shi=num1/10;/把一个 2 位数分离后分别送给数码管显示ge=num1%10;/十位和个位/shining(); /修改闪烁if(s1num=5)/若满四则归 0s1num=0;TR0=1; /启动定时器使时钟开始走if(s1num!=0) if(s2=0) delay(5); if(s2=0)flag+; flag=flag%2; if(s3=0) delay(5); if(s3=0)while(!s3);/等待按键释放switch(flag)case 0:ge+;if(ge=10)ge=0;display(shi,ge); / 将修

28、改以后的数显示save_data(shi,ge);/保存数据break;case 1:shi+;if(shi=7) /若满 6 则清 0shi=0;display(shi,ge); / 将修改以后的数显示save_data(shi,ge);/保存数据 break; if(s4=0)delay(5); if(s4=0) while(!s4);switch(flag)case 0:ge-;if(ge=-1) ge=9;display(shi,ge); / 将修改以后的数 显示save_data(shi,ge);/保存数据 break;case 1:shi-;if(shi=-1) /若满 6 则清 0 shi=6;display(shi,ge); / 将修改以后的数 显示save_data(shi,ge);/保存数据 break;/*/*函数功能:蜂鸣器函数入口参数: yindao ,jiepai*/void yanzou(uchar yindiao,uint jiepai) uchar yd;uint jp;if(jiepai=1) delay(250); /空半拍elseif(jiepai=2) delay(500); / 空一拍 elsefor(jp=jiepai;jp0;jp-)fmq=0; for(yd=yindiao;yd0;yd-); fmq=1;for(yd=

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论