【51单片机】路口红黄绿交通灯设计

您所在的位置:网站首页 51单片机开发板实验报告 【51单片机】路口红黄绿交通灯设计

【51单片机】路口红黄绿交通灯设计

2023-07-07 16:27| 来源: 网络整理| 查看: 265

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 = 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 = 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)表示在换向之后的工作状态。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3