基于某80C51单片机地交通灯设计.docx
- 文档编号:10432061
- 上传时间:2023-02-11
- 格式:DOCX
- 页数:18
- 大小:116.55KB
基于某80C51单片机地交通灯设计.docx
《基于某80C51单片机地交通灯设计.docx》由会员分享,可在线阅读,更多相关《基于某80C51单片机地交通灯设计.docx(18页珍藏版)》请在冰豆网上搜索。
基于某80C51单片机地交通灯设计
基于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
#defineEW_H0
#defineEW_L1
#defineSN_H2
#defineSN_L3
//函数声明
voidEW_NONE();
voidEW_RED();
voidEW_YELLOW();
voidEW_GREEN();
voidSN_NONE();
voidSN_RED();
voidSN_YELLOW();
voidSN_GREEN();
voidLED_INIT();
voidLED_WRITE(intdat,intcon);
//根据原理图定义交通灯的引脚
sbitEW_LED_RED=P1^0;
sbitEW_LED_YELLOW=P1^1;
sbitEW_LED_GREEN=P1^2;
sbitSN_LED_RED=P1^3;
sbitSN_LED_YELLOW=P1^4;
sbitSN_LED_GREEN=P1^5;
//定义P2^0-P2^3=LED数码管控制
sbitEW_weixuan_H=P2^0;
sbitEW_weixuan_L=P2^1;
sbitSN_weixuan_H=P2^2;
sbitSN_weixuan_L=P2^3;
//定义P0^0-P0^7=LED数码管段选引脚
sbitLED_DATA_A=P0^0;
sbitLED_DATA_B=P0^1;
sbitLED_DATA_C=P0^2;
sbitLED_DATA_D=P0^3;
sbitLED_DATA_E=P0^4;
sbitLED_DATA_F=P0^5;
sbitLED_DATA_G=P0^6;
sbitSCL=P1^6;
sbitSDA=P1^7;
//变量声明
unsignedcharcounter,ew_sign,sn_sign,ew_time,sn_time,hour
//定义段码
codecharLED_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
unsignedew_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}//东西各时间段绿灯亮总时间
unsignedcharsn_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)
{
hour=GET_HOUR();
counter=3600;
switch(hour)
{
case5:
ew_time=30;
sn_time=33;
ew_sign=1;
sn_sign=0;
EW_GREEN();
SN_RED();
break;
case7:
ew_time=30;
sn_time=33;
ew_sign=1;
sn_sign=0;
EW_GREEN();
SN_RED();
break;
case12:
ew_time=60;
sn_time=63;
ew_sign=1;
sn_sign=0;
EW_GREEN();
SN_RED();
break;
case18:
ew_time=30;
sn_time=33;
ew_sign=1;
sn_sign=0;
EW_GREEN();
SN_RED();
break;
default:
break;
}
}
if(ew_time==0)
{
switch(ew_sign)
{
case0:
ew_sign=1;
ew_time=ew_total_time[hour];
EW_GREEN();
break;
case1:
ew_sign=2;
ew_time=3;
EW_YELLOW();
break;
case2:
ew_sign=0;
ew_time=sn_total_time[hour]+3;
EW_RED();
break;
}
}
if(sn_time==0)
{
switch(sn_sign)
{
case0:
sn_sign=1;
sn_time=sn_total_time[hour];
SN_GREEN();
break;
case1:
sn_sign=2;
sn_time=3;
SN_YELLOW();
break;
case2:
sn_sign=0;
sn_time=ew_total_time[hour]+3;
SN_RED();
break;
}
}
LED_WRITE(ew_time/10,EW_H);
LED_WRITE(ew_time%10,EW_L);
LED_WRITE(sn_time/10,SN_H);
LED_WRITE(sn_time%10,SN_L);
}
}
//main函数到此结束,以下是所用到函数的定义
/*所用函数的定义*/
voidLED_INIT()
{
LED=0x00;
EW_weixuan_H=1;
EW_weixuan_L=1;
SN_weixuan_H=1;
SN_weixuan_L=1;
}
voidLED_WRITE(intdat,intcon)
{
EW_weixuan_H=0;
EW_weixuan_L=0;
SN_weixuan_H=0;
SN_weixuan_L=0;
if(dat<10)
{
LED=LED_CODE[dat];
switch(con)
{
caseEW_H:
{
EW_weixuan_H=1;
break;
}
caseEW_L:
{
EW_weixuan_L=1;
break;
}
caseSN_H:
{
SN_weixuan_H=1;
break;
}
caseSN_L:
{
SN_weixuan_L=1;
break;
}
}
}
}
voidtimer_int()interrupt0
{
EA=0;
counter--;
switch(hour)
{
case0:
case1:
case2:
case3:
case4:
EW_YELLOW();
SN_YELLOW();
EW_NONE();
SN_NONE();
break;
default:
ew_time--;
sn_time--;
if(ew_sign==1&&ew_time<=3&&ew_time>0)
{
EW_GREEN();
EW_NONE();
}
if(sn_sign==1&&sn_time<=3&&sn_time>0)
{
SN_GREEN();
SN_NONE();
}
break;
}
EA=1;
}
/*延迟函数定义*/
voidDELAY2()
{
_nop_();
_nop_();
}//延迟2us
voidDELAY4()
{
DELAY2();
DELAY2();
}//延迟4us
voidDELAY8()
{
DELAY4();
DELAY4();
}//延迟8us
//
voidIIC_WRITE(unsignedchardat)
{
unsignedchartemp;
for(temp=0;temp<8;temp++)
{
SCL=0;
if((dat< { SDA=1; } else { SDA=0; } DELAY2(); SCL=1; DELAY4(); SCL=0; } DELAY4(); SDA=1; DELAY2(); SCL=1; DELAY4(); SCL=0; } unsignedcharGET_HOUR() { //START hour=0; unsignedchartemp; SDA=1; SCL=1; DELAY8(); SDA=0; DELAY8(); //WRITE IIC_WRITE(0XD0); //HOURADDRESS IIC_WRITE(0X02); //RESTART SDA=1; SCL=1; DELAY8(); SDA=0; DELAY8(); //READ IIC_WRITE(0XD1); //READHOUR SDA=1; for(temp=0;temp<8;temp++) { hour=hour<<1; SCL=1; DELAY2(); if(SDA==1) { hour++; } SCL=0; } //SENDNOACK SDA=1; SCL=1; DELAY4(); SCL=0; //STOP SDA=0; SCL=1; DELAY8(); SDA=1; DELAY4(); SCL=0; returnhour; } 四、心得体会 通过这次的实验设计,我深入了对单片机的了解,也明白了日常生活中处处有自动控制的例子,其中不乏有各种系列的单片机,同时我也认识到对单片机的学习应该更加深入才能得心应手,虽然只是一个芯片而已,但是如果你具备足够的知识,就可以充分利用,根据自己的设想就可以做出各种实用的东西,而我现在发现自己基本还处于初级阶段,需要更加努力,特别是编程能力,当然也有收获,首先我对protel的使用更有信心了,又发现了其中的一些功能,同时我也了解了一些其它芯片,比如EEPROM存储芯片AT24C02的非易失性,DS1302时钟芯片可以精确的计时,为了与电脑进行串口通讯必须采用转串口芯片比如MAX232,从而实现单片机的TTL电平到RS232电平的转换。 总之这次设计实验收获不少,反省也不少,但重要的是更激发了我对单片机学习的热情。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 80 C51 单片机 交通灯 设计
![提示](https://static.bdocx.com/images/bang_tan.gif)