基于单片机交通灯设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于80C51单片机的交通
灯设计
班级:电信1101
:XXXX
学号:0703110107
一、设计说明及材料清单
(一)设计说明:
本交通灯的设计简化了十字路交通灯,只将东西和南北两个路向的交通灯情况表示
出来,但也做了很多改进,设计了针对不同时间段不同的控制方案,并且采用串口
通讯可将不同的控制方案下载到芯片中,外接掉电保存程序的非易失性存储芯片和
掉电仍可计时的时钟芯片,以保证计时的正确性。
(二)材料清单:
二、电路原理图设计
本设计共用到四款主要芯片,分别为单片机芯片80C51、EEPROM芯片AT24C02、时钟芯片DS1302和转串口芯片MAX232。
(一)下图为80C51单片机芯片的管脚图,80C51有两个16位定时计数器,两个外中断,
两个定时计数中断,及一个串行中断,并有4个8位并行输入口即I/O口。80C51部有时钟电路,但需要石英晶体和微调电容外接,本系统中采用12MHz的晶振频率。
(二)下图为AT24C02芯片的原理图,该芯片是一种带有I2C总线结构的EEPROM芯片,
通过SDA和SCL端口与总线连接,具有非易失性,掉电仍可保存程序。其管脚功能如下:
管脚名称功能说明
A0、A1、A2 器件地址选择本设计全部接地
SDA 串行数据、地址与单片机的P1.6连接进行数据、地址的传输
SCL 串行时钟与单片机的P1.7相连,串行时钟信号输入
WP 写保护WP=1,只能对其读,写禁止,所以令WP=0
VCC +1.8V~6.0V工作电压电源输入
GND 地接地引脚
(三)下图是时钟芯片的电路原理图,DS1307是一款低功耗,地址和数据通过两线双向的串
行总线的传输,节省单片机资源,该芯片可以提供秒,分,小时等信息,芯片有一个置的电源感应电路,具有掉电检测和电池切换功能,本设计中需要其停电后继续计时。其中的7引脚是方波的输出端,可接入单片机的可引起中断的端口,利用引脚7产生的方波引起中断,从而显示时间的变化。
(四)下图是MAX232芯片的原理图,因为设计要求与电脑有串口通讯,就是将交通灯不同
时间段程序控制方案通过串口下载到单片机里,单片机上有一个全双工的串行通讯口,但电脑的串口是RS232电平的,而单片机的串口是TTL电平的,两者之间必须有一个电平转换电路,所以采用了专用芯片MAX232进行转换,下图中的7、8端口分别和电脑上的RS232端口的2、3连接,芯片的9和10端口与单片机的串口相连,如下图所示:
(五)下图为交通灯的总体原理图(不包括上述芯片原理图),根据要求选择六只LED灯作为
东西和南北方向的红绿黄交通灯,并且每个方向上有时间计数提示,每个方向有两位数码管动态显示,最大为99,采用共阴极7段数码管,单片机通过驱动器SN7404的放大电流驱动每位数码管。P1.0至P1.5控制六只LED灯,数码管由P0.0至P0.6控制进行段选,P2.0至P2.3控制位选。
三、程序设计(一)系统框图:
(二)主程序如下:
#include"reg51.h"
#include
#define EW_H 0
#define EW_L 1
#define SN_H 2
#define SN_L 3
//函数声明
void EW_NONE();
void EW_RED();
void EW_YELLOW();
void EW_GREEN();
void SN_NONE();
void SN_RED();
void SN_YELLOW();
void SN_GREEN();
void LED_INIT();
void LED_WRITE(int dat,int con); //根据原理图定义交通灯的引脚sbit EW_LED_RED = P1^0;
sbit EW_LED_YELLOW = P1^1;
sbit EW_LED_GREEN = P1^2;
sbit SN_LED_RED = P1^3;
sbit SN_LED_YELLOW = P1^4;
sbit SN_LED_GREEN = P1^5;
//定义P2^0-P2^3=LED数码管控制
sbit EW_weixuan_H = P2^0;
sbit EW_weixuan_L = P2^1;
sbit SN_weixuan_H = P2^2;
sbit SN_weixuan_L = P2^3;
//定义P0^0-P0^7=LED数码管段选引脚
sbit LED_DATA_A = P0^0;
sbit LED_DATA_B = P0^1;
sbit LED_DATA_C = P0^2;
sbit LED_DATA_D = P0^3;
sbit LED_DATA_E = P0^4;
sbit LED_DATA_F = P0^5;
sbit LED_DATA_G = P0^6;
sbit SCL = P1^6;
sbit SDA = P1^7;
//变量声明
unsigned char counter,ew_sign,sn_sign,ew_time,sn_time,hour
//定义段码
code char LED_CODE[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
/*main函数开始*/
main()
{
counter = 3;//计数器,每3600s查询一次当前hour
ew_sign = 0;//东西标志位,0代表红灯,1代表绿灯,2代表黄灯
sn_sign = 0;//南北标志位,0代表红灯,1代表绿灯,2代表黄灯
ew_time = 3;//东西时间
sn_time = 3;//南北时间
hour = 24;//当前hour
unsigned ew_total_time[24] = {1,1,1,1,1,30,30,30,30,30,30,30,60,60,60,60,30,30,
30,30,30,30}//东西各时间段绿灯亮总时间unsigned char sn_total_time[24] = {1,1,1,1,1,30,30,60,60,60,60,60,30,30,30,30,30,
30,30,30,30,30}//南北各时间段绿灯亮总时间LED_INTI();
EW_RED();
SN_RED();
while(1)
{
if(counter == 0)