课题:基于51单片机交通灯系统设计专业:电子信息工程
班级:(1)班
学号: 20110169
姓名:峰
指导教师:
设计日期:
成绩:
重庆大学城市科技学院电气学院
基于51单片机三岔口交通灯控制系统设计
一、设计目的
1、掌握单片机最小系统电路的设计原理、组装与调试方法。
2、掌握LED 数码显示电路的设计和使用方法。
3、实现电子信息综合简单产品的模拟设计。
4、实现电气自动化控制简单产品的模拟设计。
5、实现机电传动控制简单产品的模拟设计。
二、设计任务与要求
1、设计一个三角路口交通灯控制系统
2、要求能用按键控制电路控制交通灯系统9个红绿黄LED 交通灯
3、经单片机处理后,要求用4位一体共阴LED 数码管来设计显示电路,以显示红绿黄LED 交通灯的计时
三、设计的具体实现
1系统设计方案与框图
单片机设计交通灯控制系统,可用单片机直接控制信号灯的状态变化,基本上可以指挥交通的具体通行,当然,接入LED 数码管就可以显示倒计时以提醒行使者,更具人性化。本系统在此基础上,加入了时间调整功能。
系统的总体框图
据此,本设计系统以单片机为控制核心,连接成最小系统,由按键设置模块产生输入,信号灯状态模块,LED 倒计时模块模块接受输出。系统的总体框图如上所示。
单片机上电后,系统进入正常工作状态,执行交通灯状态显示控制,同时将时间数据倒计时输入到LED 数码管上实时显示。 单片机 最小系统
外围接口电路 LED 数码管显示
红黄绿信号灯
按键 控制电路
对于单片机的选择,可以考虑使用8031与8051系列,由于8031没有内部RAM,系统又需要大量内存存储数据,因而不适用。ATC51 以低价位单片机可为提供许多高性价比的应用场合,可灵活应用于各种控制领域,对于简单的测温系统已经足够。单片机ATC51具有低电压供电和体积小等特点,四个端口只需要两个口就能满足电路系统的设计需要该器件是INTEL公司生产的MCS一5l系列单片机中的基础产品,采用了可靠的CMOS工艺制造技术,具有高性能的8位单片机,属于标准的MCS—51的CMOS产品。
AT51的管脚如下图所示:
A TC51芯片管脚图
3时钟电路
80C51时钟有两种方式产生,即内部方式和外部方式。80C51中有一个构成内部震荡器的高增益反向放大器,引脚XTAL1和XTAL2分别是该放大器的输入端和输出端。本次采用内部震荡电路,瓷片电容采用22PF,晶振为12MHZ。
晶体震荡电路图
4 复位电路
单片机系统的复位电路在这里采用的是上电+按钮复位电路形式,其中电阻R采用10KΩ的阻值,电容采用10μF的电容值。
复位电路以上的各个模块就组成了51单片机的最小系统电路。
最小系统原理图
5 显示计时电路
对于交通灯的计时显示,我们采用4位一体共阴LED数码管。由于P0口输出电流小,需外接上拉电阻,COME端接5V电源。
4位LED数码显示管6 交通灯指示电路
黄灯闪烁为3秒钟,红绿灯可以自行调整。
7 按键控制电路
各个按键的功能如下图所示
8 Proteus仿真步骤及结果
(1)根据电路图选择器件连接电路
(2)双击ATC51装入源程序编译生成的HEX文件
(3)单击运行按钮运行仿真
(4)根据仿真情况与程序实现任务对比,对于不能实现的任务修改并调试程序,重新装载重新运行调试仿真,直到能完全实现所要求的功能为止
(5)进一步改进和简化程序在进行调试仿真
四、总结
通过这次单片机实训课程学习,才深刻体会到自己实际操作能力的匮乏。从刚开始老师对单片机的整体介绍及其应用前景,对单片机产生了浓厚的兴趣,并利用自己的课余时间提前学习有关单片机的基本知识。但空有理路知识,却无半点的实际操作经验。后来在老师的建议下,选择运用单片机设计一个交通灯控制系统,从简单开始,后期逐步复杂化。
从给定电路图的分析到实际电路元件的识别、焊接,再到后期的程序设计以及系统调试,初步掌握了运用单片机系统设计特定功能的设计步骤,也对单片机有了更深的体会。了解和掌握了一些简单的编程思想,对单片机各管脚的功能,I/O口的使用条件都有了更深的理解。这次的课程设计让我把单片机的理论知识运用的实践中,实现了理论与实践的相结合,从中更懂得了理论是实践的基础,实践更能检验理论的真实性,让我受益匪浅。
五、参考文献
1、李群芳编.《单片微型计算机及接口技术》[M].电子工业出版社,2012.1
2、黄勤编.《计算机硬件技术基础实验教程》[M].重庆大学出版社,2002.3
3、乔瑞萍.《DSP原理及应用》[M].西安电子科技大学出版社,2012.2六、附录
系统原理电路图
最小系统板电路板
交通灯系统整体电路板交通灯控制系统设计器材表:
单片机STCC51芯片 1
按键开关 5
晶振12M 1
开个二极管 4
电容30PF 2 电解电容10UF 1
排针若干LED红黄绿指示灯各3个阻10k,3k,2k,1k,510,330 若干4位一体共阴数码管 1
导线若干
插线若干
USB电源接口 1源程序:
#include"reg51.h"
sbit P24=P2^4;//按键K1
sbit P25=P2^5;//按键K2
sbit P26=P2^6;//按键K3
sbit P27=P2^7;//按键K4
sbit P20=P2^0;//数码管位控制南北方向
sbit P21=P2^1;
sbit P22=P2^2;//数码管位控制东西方向
sbit P23=P2^3;
sbit l1=P1^0;//南北路口绿灯
sbit h1=P1^1;//南北路口黄灯
sbit r1=P1^2;//南北路口红灯
sbit l2=P1^3;//东西绿灯
sbit h2=P1^4;//东西黄灯
sbit r2=P1^5;//东西红灯
bit a0=1; //闪烁标志位
bit a1=1;//闪烁标志位
bit a2=1;//闪烁标志位
bit a3=1;//闪烁标志位
Unsigned char code x[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//unsigned char code x[10]={0xC0,0xF9,0xA4, 0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//共阳0~9
unsigned char ucled0; //数码管十位存储南北方向
unsigned char ucled1; //数码管个位存储
unsigned char ucled2; //数码管十位存储东西方向
unsigned char ucled3; //数码管个位存储
unsigned int dxz=0; //东西红灯时间
unsigned int nbz=0; //南北红灯时间
unsigned int sjz1; //南北方向时间存放
unsigned int sjz2; //东西方向时间存放
unsigned int cs=0; //k3按键次数
unsigned int CST=0; //50ms记数
bit nb=0; //南北红灯闪烁标志
bit dx=0; //东西红灯闪烁标志
/**********************************
短延时
***********************************/
void delay()
{
unsigned int j;for(j=0;j<200;j++)
}
/***********************************
定时器T0
************************************/
void Time0() interrupt 1
{
TH0=60;
TL0=176;
CST++; //50ms次数累加
ucled0=sjz1/10; //送南北十位数据
ucled1=sjz1%10; //个位
ucled2=sjz2/10; //送东西数据
ucled3=sjz2%10;//个位
if(CST==20) //定时1S
{
CST=0;//清零
if(r2==1) //东西红灯亮
{
if(sjz1==0)//南北绿灯时间
{
P1=0xE2; //南北黄灯亮
nb=1; //黄灯闪烁亮标志
sjz1=sjz2;// 赋黄灯时间
//sjz1--;sjz2--;
}
if(sjz2==0)//东西红灯时间到
{
P1=0xCC;//东西绿灯亮南北红灯亮 sjz1=nbz;sjz2=(nbz-3);//重新赋?
nb=0; //黄灯闪烁灭标志 }
else
{ sjz1--;sjz2--;} //数据自减 }
if(r1==1) //南北红灯亮
{
if(sjz2==0)//东西记时到
{
P1=0xD4;//东西方向黄灯亮
sjz2=sjz1;//附黄灯时间
dx=1; //黄灯闪烁亮标志 // sjz1--;sjz2--;
}
if(sjz1==0)//南北时间到
{
P1=0xE1;//南北绿灯亮东西红灯亮 sjz1=(dxz-3);sjz2=dxz;//重新赋值
dx=0; //黄灯闪烁灭标志
}
else
{ sjz1--;sjz2--;} //数据自减
}
}
}
/**************************************
定时器T1 闪烁
************************************/
void Time1() interrupt 3
{
TH0=60;
TL0=176;
if(nb==1)
{ h1=!h1;} //南北方向闪烁
if(dx==1)
{h2=!h2;} //东西方向闪烁
if(cs==1)
{a0=!a0;a3=1;} //第1位闪烁
if(cs==2)
{a1=!a1;a0=1;} //第2位闪烁
if(cs==3)
{a2=!a2;a1=1;} //第3位闪烁
if(cs==4)
{a3=!a3;a2=1;} //第4位闪烁}
/*****************************************
按键
******************************************/
void anjian() interrupt 0
{
P24=1; P25=1; P25=1; P27=1;
if(P24==0) //按键K1 进去修改状态并显示南北东西方向红灯时间
{
P1=0xd2; //只有黄灯亮
nb=1;dx=1;//黄灯闪烁
ucled0=nbz/10; //南北十位红灯时间
ucled1=nbz%10; //南北个位红灯时间
ucled2=dxz/10; //东西十位红灯时间
ucled3=dxz%10; //东西个位红灯时间
TR0=0; //关定时器
cs=1;
}
if(P25==0)
{
if(cs==1)
{ ucled0++; //南北十位加1
if(ucled0==10)
ucled0=0;
}
if(cs==2)
{
ucled1++; //南北个位加1
if(ucled1==10)
ucled1=0;
}
if(cs==3 )
{ ucled2++; //东西十位加1
if(ucled2==10)
ucled2=0;
}
if(cs==4 )
{ ucled3++; //东西个位加1if(ucled3==10)
ucled3=0;
}
}
if(P26==0 ) //按键K3按下数码管闪烁
{
switch(cs)
{
case 1: cs=2;break; //第一次按键
case 2: cs=3;break ; //第二次按键
case 3: cs=4;break; //第三次按键
case 4: cs=1;break; //第四次按键
default: break;
}
}
if(P27==0 ) //按键K4按?
{
TR0=1;
P1=0xCC;
nb=0;dx=0;cs=0;
nbz=ucled0*10+ucled1; //计算修改后的数据并送南北数据存储空间
dxz =ucled2*10+ucled3; //计算修改后的数存储
a0=1;
a1=1;
a2=1;
a3=1;
// if(r2==1)
sjz2=0;
//if(r1==1)
sjz1=0;
}
}
/****************************************
扫描显示
*****************************************/
void display(){ if(a0)
{
P0=x[ucled0]; //送南北十位数据 P20=0;
delay();
P20=1;
}
if(a1)
{
P0=x[ucled1]; //送南北个位数据
P21=0;
delay();
P21=1;
}
if(a2)
{
P0=x[ucled2];//送东西十位数据
P22=0;
delay();
P22=1;
}
if(a3)
{
P0=x[ucled3]; //送东西个位数据
P23=0;
delay();
P23=1;
}
}
/****************************
主函数
****************************/
void main()
{
TMOD=0x11;
TH1=60;
TL0=176; //定时T0赋初值
ET0=1;
TR0=1;
TH1=60; //定时器T1赋初值
TL1=176;
ET1=1;
TR1=1;IT0=1;
EX0=1;
EA=1; //开总中断控制位P1=0xE1;//赋初值
dxz=15;nbz=14;//红灯初值 while(1)
{
display();//调显示 }
}