赞
踩
1 实践任务
1.1 实践目的
分析路口红黄绿交通灯的设计要求,设计路口红黄绿交通灯的原理图,并完成路口红黄绿交通灯线路的搭建与调试,培养学生电子电路图的分析、设计、搭建与调试能力,培养团队协作能力与创新意识,增强学生的劳动观念和社会责任感。
1.2 实验内容
分析根据路口红黄绿交通灯的设计要求,设计路口红黄绿交通灯的原理图,并进行功能分析;
运用单片机、电阻、二极管、7段LED、导线等材料,并进行路口红黄绿交通灯电子电路的搭建与焊接;
完成路口红黄绿交通灯的电路的调试;
对路口红黄绿交通灯电路调试结果的分析与总结,并提出改进建议。
1.3 实现目标
东西向红灯33秒,南北向绿灯27秒,绿灯闪烁3秒(占空比50%),黄灯3秒;南北向红灯33秒,东西向绿灯27秒,绿灯闪烁3秒(占空比50%),黄灯3秒;循环动作。能在7段码上显示时间;
2 硬件设计
图1.1 Proteus仿真电路图
3 软件设计
3.1 程序流程图
3.2 软件代码:
- #include "REGX52.H"
- #include "smg.h"
- #include "delay.h"
- #include "Timer0.h"
- int Time_SMG = 0, Timer0Count = 0, blink = 0, Timer0Count2 = 0;
- int flag = 1;
- // 定义IO口连接
- sbit RedEastWest = P1 ^ 0; // 东西向红灯
- sbit YellowEastWest = P1 ^ 1; // 东西向黄灯
- sbit GreenEastWest = P1 ^ 2; // 东西向绿灯
- sbit RedNorthSouth = P1 ^ 3; // 南北向红灯
- sbit YellowNorthSouth = P1 ^ 4; // 南北向黄灯
- sbit GreenNorthSouth = P1 ^ 5; // 南北向绿灯
- // 主函数
- void main()
- {
- Timer0Init();
- P3_7 = 0;
-
- while (1) {
- // 过程:东西红灯33秒,南北绿灯27秒,绿灯以占空比50闪烁3秒,黄灯三秒;
- if (flag == 0) {
- RedEastWest = 0;
- GreenEastWest = 1;
- YellowEastWest = 1;
- if (Time_SMG < 27) {
- GreenNorthSouth = 0;
- RedNorthSouth = 1;
- YellowNorthSouth = 1;
- } else if (Time_SMG >= 27 && Time_SMG <= 30) {
- blink = 1; // 绿灯闪烁
- } else if (Time_SMG > 30) {
- blink = 0;
- GreenNorthSouth = 1;
- YellowNorthSouth = 0;
- RedNorthSouth = 1;
- }
-
- } else if (flag == 1) {
- RedNorthSouth = 0;
- GreenNorthSouth = 1;
- YellowNorthSouth = 1;
- if (Time_SMG < 27) {
- GreenEastWest = 0;
- YellowEastWest = 1;
- RedEastWest = 1;
- } else if (Time_SMG >= 27 && Time_SMG <= 30) {
- blink = 1; // 绿灯闪烁
- } else if (Time_SMG > 30) {
- blink = 0;
- GreenEastWest = 1;
- YellowEastWest = 0;
- RedEastWest = 1;
- }
- }
-
- smg(1, Time_SMG % 10);
- smg(2, Time_SMG / 10);
- }
- }
- void Timer0Routine() interrupt 1 // 中断
- {
- TL0 = 0x66; // 设置定时初值
- TH0 = 0xFC; // 设置定时初值【注意:这里的定时初值要与函数Timer0Init内的初值一样】10ms
- Timer0Count++; // 每1ms打断一次,计数器加1
- Timer0Count2++;
-
- if (Timer0Count >= 1000) // 当计数器到1000,即经过1秒
- {
- Time_SMG++;
- Timer0Count = 0;
- }
- if (Time_SMG > 33) {
- Time_SMG = 0;
- flag = !flag;
- }
-
- if (Timer0Count2 >= 500) // 当计数器到100,即经过0.1秒
- {
- Timer0Count2 = 0;
- if (blink == 1) {
- if (flag == 0) {
- GreenNorthSouth = !GreenNorthSouth;
- } else if (flag == 1) {
- GreenEastWest = !GreenEastWest;
- }
- }
- }
- }
-
-
-
-
-
-
- 数码管函数:
- unsigned char smgText[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
- void smg(unsigned char location,number)
- {
- switch(location)
- {
- case 1:P2_0=0;P2_1=1;P2_2=1;P2_3=1;break;
- case 2:P2_0=1;P2_1=0;P2_2=1;P2_3=1;break;
- case 3:P2_0=1;P2_1=1;P2_2=0;P2_3=1;break;
- case 4:P2_0=1;P2_1=1;P2_2=1;P2_3=0;break;
- }
- P3=smgText[number];
- Delay(10);
- P3=0x00;
- }
4 系统调试与结论
首先,通过proteus搭建仿真电路,确定使用的元件和对应的接口。之后按照实现目标进行程序编写,结合proteus仿真在编程的过程中不断调试,以达到想要的实验结果。
LED单数表示南北方向,双数为东西方向。上电后先由南北向通行,27秒绿灯,27-30秒绿灯闪烁,30-33秒亮黄灯,之后切换为南北向通行。
上图为实际硬件,如图所示(a)(b)图表示在27秒时绿灯是闪烁状态。图(c)表示在30-33秒黄灯亮的效果。图(d)表示在换向之后的工作状态。
我的开发环境是vscode+eide
src文件夹里面是代码
自己需要自己移植到keil环境
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。