基于单片机交通灯设计

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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)

相关文档
最新文档