1 实践任务
1.1 实践目的
分析路口红黄绿交通灯的设计要求,设计路口红黄绿交通灯的原理图,并完成路口红黄绿交通灯线路的搭建与调试,培养学生电子电路图的分析、设计、搭建与调试能力,培养团队协作能力与创新意识,增强学生的劳动观念和社会责任感。
1.2 实验内容
分析根据路口红黄绿交通灯的设计要求,设计路口红黄绿交通灯的原理图,并进行功能分析;
运用单片机、电阻、二极管、7段LED、导线等材料,并进行路口红黄绿交通灯电子电路的搭建与焊接;
完成路口红黄绿交通灯的电路的调试;
对路口红黄绿交通灯电路调试结果的分析与总结,并提出改进建议。
1.3 实现目标
东西向红灯33秒,南北向绿灯27秒,绿灯闪烁3秒(占空比50%),黄灯3秒;南北向红灯33秒,东西向绿灯27秒,绿灯闪烁3秒(占空比50%),黄灯3秒;循环动作。能在7段码上显示时间;
2 硬件设计
图1.1 Proteus仿真电路图
- 东西南北四方向LED红绿灯采用共阳极接法,单片机接口P1.0-P1.2控制东西向红黄绿LED,单片机接口P1.3-P1.5控制南北方向红黄绿LED
- 四位七段码数码管使用P2.0-P2.3作为控制位,P3接口作为段选位。
- 元器件清单:STC89c52RC单片机*1、LED灯若干、杜邦线若干、9012三极管*4、10K电阻*4、4位七段码数码管*1、510Ω电阻*8等元件。
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环境