智能交通灯+点阵+音乐.docx
《智能交通灯+点阵+音乐.docx》由会员分享,可在线阅读,更多相关《智能交通灯+点阵+音乐.docx(30页珍藏版)》请在冰豆网上搜索。
智能交通灯+点阵+音乐
实训报告
学院
电子与信息学院
课程名称
单片机
设计题目
基于单片机的智能交通灯系统设计
专业
班级
姓名
学号
指导教师
时间
2012.11.28
`目录
单片机课程设计
一、原理功能图与要求
由于我国经济的快速发展从而导致了汽车数量的猛增,大中型城市的城市交通,正面临着严峻的考验,从而导致交通问题日益严重,其主要表现如下:
交通事故频发,对人类生命安全造成极大威胁;交通拥堵严重,导致出行时间增加,能源消耗加大;空气污染和噪声污染程度日益加深等。
日常的交通堵塞成为人们司空见惯而又不得不忍受的问题,在这种背景下,结合我国城市道路交通的实际情况,开发出真正适合我们自身特点的智能信号灯控制系统已经成为当前的主要任务。
随着电子技术的发展,利用单片机技术对交通灯进行智能化管理,已成为目前广泛采用的方法。
十字路口车辆穿梭,行人熙攘,车行车道,人行人道,有条不紊。
那么靠什么来实现这井然秩序呢?
靠的就是交通信号灯的自动指挥系统。
交通信号灯控制方式很多。
1.1功能图
1.2基本要求
本系统需要采用MSC-51系列单片机AT89S52作为中心器件来设计交通灯控制器,实现以下功能:
1.用两位七段LED显示通行时间。
2.初始东西绿灯亮,南北红灯亮,东西方向通车。
3.延时25s,东西路口绿灯熄灭,黄灯闪烁5秒,伴随蜂鸣器叫五秒。
4.黄灯闪烁后,东西路口红灯亮同时南北路口绿灯亮,南北方向开始通车。
5.延时25s,南北方向绿灯灭,黄灯闪烁5秒,然后又切换成东西方向通车,如此重复。
6.当某条路上发生交通意外时,可以按暂停键,设置那条道路为红灯进行交通事故的处理。
当事故处理完毕,按播放键或者复位键都可以重新按上述方式工作。
7.加数键和减数键可以设置绿灯通行时间,毎按一次加(减)变化1秒,最后黄灯的闪烁时间都为5秒。
8.深夜时,七段显示管可以用按键关掉,节约电能。
9.为了更好学习单片机,我还设置了音乐按钮,可以在浮躁之余可以听听音乐。
10.为了更好学习单片机,探究点阵的应用,我用点阵显示我的作品“金CJP21号”移动显示,并设置了点阵开关,随时可以关闭点阵。
二、硬件和软件设计
2.1硬件电路图
硬件电路图通过Proteus7.5SP3仿真之后如图1所示,其中:
整体实验连接电路如下图所示:
图1整体连接电路图
2.1.1AT89S52单片机简介
AT89S52是一种带4K字节闪存可编程可擦除只读存储器(FPEROM—FlashProgrammableandErasableReadOnlyMemory)的低电压、高性能CMOS8位微处理器,俗称单片机。
单片机的可擦除只读存储器可以反复擦除1000次。
该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89S52是一种高效微控制器。
AT89S52单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
主要特性:
·与MCS-51兼容
·4K字节可编程闪烁存储器
·寿命:
1000写/擦循环
·数据保留时间:
10年
·全静态工作:
0Hz-24MHz
·三级程序存储器锁定
·128×8位内部RAM
·32可编程I/O线
·两个16位定时器/计数器
·5个中断源
·可编程串行通道
·低功耗的闲置和掉电模式
·片内振荡器和时钟电路
2.1.274LS595芯片介绍
74595的数据端:
QA--QH:
八位并行输出端,可以直接控制数码管的8个段。
QH':
级联输出端。
我将它接下一个595的SI端。
SI:
串行数据输入端。
74595的控制端说明:
/SCLR(10脚):
低点平时将移位寄存器的数据清零。
通常我将它接Vcc。
SCK(11脚):
上升沿时数据寄存器的数据移位。
QA-->QB-->QC-->...-->QH;下降沿移位寄存器数据不变。
(脉冲宽度:
5V时,大于几十纳秒就行了。
我通常都选微秒级)
RCK(12脚):
上升沿时移位寄存器的数据进入数据存储寄存器,下降沿时存储寄存器数据不变。
通常我将RCK置为低点平,当移位结束后,在RCK端产生一个正脉冲(5V时,大于几十纳秒就行了。
我通常都选微秒级),更新显示数据。
/G(13脚):
高电平时禁止输出(高阻态)。
如果单片机的引脚不紧张,用一个引脚控制它,可以方便地产生闪烁和熄灭效果。
比通过数据端移位控制要省时省力。
注:
1)74164和74595功能相仿,都是8位串行输入转并行输出移位寄存器。
74164的驱动电流(25mA)比74595(35mA)的要小,14脚封装,体积也小一些。
2)74595的主要优点是具有数据存储寄存器,在移位的过程中,输出端的数据可以保持不变。
这在串行速度慢的场合很有用处,数码管没有闪烁感。
3)595是串入并出带有锁存功能移位寄存器,它的使用方法很简单,在正常使用时SCLR为高电平,G为低电平。
从SER每输入一位数据,串行输595是串入并出带有锁存功能移位寄存器,它的使用方法很简单,如下面的真值表,在正常使用时SCLR为高电平,G为低电平。
从SER每输入一位数据,串行输入时钟SCK上升沿有效一次,直到八位数据输入完毕,输出时钟上升沿有效一次,此时,输入的数据就被送到了输出端。
入时钟SCK上升沿有效一次,直到八位数据输入完毕,输出时钟上升沿有效一次,此时,输入的数据就被送到了输出端。
其实,看了这么多595的资料,觉得没什么难的,关键是看懂其时序图,说到底,就是下面三步(引用):
第一步:
目的:
将要准备输入的位数据移入74HC595数据输入端上。
方法:
送位数据到P1.1。
第二步:
目的:
将位数据逐位移入74HC595,即数据串入
方法:
P1.3产生一上升沿,将P1.0上的数据移入74HC595中.从低到高。
第三步:
目的:
并行输出数据。
即数据并出
方法:
P1.2产生一上升沿,将由P1.0上已移入数据寄存器中的数据
送入到输出锁存器。
说明:
从上可分析:
从P1.2产生一上升沿(移入数据)和P1.1产生一上升沿
(输出数据)是二个独立过程,实际应用时互不干扰。
即可输出数据的
同时移入数据。
而具体编程方法为
2.1.3单片机最小系统
提供单片机工作环境。
2.1.4控制模块
各个按键的功能都如右图的
名字所示,加数、减数、暂
停、播放都是对于交通灯的,
另外还有显示管开关、音乐
开关、点阵开关,还有整个
电路的复位开关在单片机最
小系统里面。
2.1.5交通灯模块
共阴七段数码管显示通行时间,另外红绿黄灯都是高电平驱动。
2.1.6点阵显示模块
显示我的名字代号“金”。
并显示我的姓名拼音首字母“CJP”,还有我的学号“21号”,向左移动显示。
2.1.7蜂鸣器
蜂鸣器用于黄灯通行报警;
并且用于音乐播放器。
高电平驱动。
2.2软件设计
2.2.1程序流程图
2.2.2程序源代码
1、子程序部分
#include<74HC595.H>//74hc595输出子程序
voiddelay(ucharz);//延时1MS子程序
voidinit();//初始化子程序
voidKEY();//键盘扫描程序
voiddianzhen();//点阵显示程序
voiddisplay();//数码管显示子程序
voidled();//led红绿黄子程序
voiddelay1(uintz);//延时165MS,即十六分音符
voidsong();//音乐程序
2、主程序部分
voidmain()
{init();
while
(1)
{
KEY();
dianzhen();
display();
led();
}
}
3、控制模块
sbitK1=P3^7;//暂停
sbitK2=P3^0;//播放
sbitK3=P3^4;//还原30S
sbitK4=P3^5;//显示管开关
sbitK7=P3^1;//点阵开关
voidEX_INT0()interrupt0//交通灯通行时间设置加数
{
biaozhi=0;
ET0=0;TR0=0;
feng=0;
bianl=(bianl+1)%100;
second=bianl;
delay(50);
display();
}
voidEX_INT1()interrupt2//交通灯通行时间设置减数开关
{
biaozhi=0;
ET0=0;TR0=0;
feng=0;
bianl=(bianl-1)%100;
second=bianl;
delay(50);
display();
}
4、三个定时器
voiddaoshujishu()interrupt1//倒计时计数
{
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
a++;
if(a==20)
{
a=0;
if(second==0)
{second=bianl+1;}
second--;
aa++;
if(aa==2*(bianl+1))
aa=0;
}
if(a==0||a==10)
temp=~temp;
}
voiddzjishu()interrupt3//点阵计数
{
TH1=(65535-50000)/256;
TL1=(65535-50000)%256;
flag++;
if(flag==24)
{
flag=0;
cntb++;
}
if(cntb==82)
cntb=0;
}
voidyinyuedingshi()interrupt5//用于产生各种音调
{TF2=0;
TH2=timeh;
TL2=timel;
feng=~feng;
}
三、采用的工具
运用proteus软件进行仿真,对于这个软件,之前还不熟悉的我,通过这次作品的制作,已经运用得很熟练,有助于我以后对于各种电路设计开发的运用。
由自己设计的原理寻找各种元件,然后接线,接着仿真电路原理。
在运行的过程中,发现如果全部运用导线去链接的话,整个原理图很乱,有时线接错的时候找不出原因。
如果运用标号联系的话,原理图很清晰。
但是当你的电路比较复杂的时候,软件运行所耗的内存就多,很容易造成软件出错,无法运行,强制关机的话会没有保存数据。
所以也要在运行的之前先记得保存电路。
Protel软件是画电路原理图的,也可以生成PCB板。
但是由于宿舍没有这个条件,去工业中心比较不方便,所以这次我是用万能板进行焊接的。
四、心得体会
通过这次交通灯的课程设计,使我得到了一次用专业知识、专业技能分析和解决现实问题的能力。
使我在单片机的基本原理、单片机应用学习过程中,以及在常用编程设计思路技巧的掌握方面都能向前迈了一大步,为日后成为一名合格的应用型人才打下良好的基础。
综合课程设计让我把以前学习到的知识得到巩固和进一步的提高认识,对已有知识有了更深层次的理解和认识。
在此,由于自身能力有限,在课程设计中碰到了很多的问题,我通过查阅相关书籍、资料以及和周围同学交流得到解决。
在电路的调试过程中,发现了几个问题,并解决了:
1、发现绿灯LED亮度太暗,加了上拉电阻;
2、开关按钮不灵敏,在软件里面去抖,以防程序运行多次,加了等待程序;
3、点阵的led太亮,加了100欧姆的限流电阻,但是还是不够,觉得470欧姆的电阻差不多;
4、音乐在简单的电路中,不会失真,而在本电路中音乐会受外围电路的干扰,有点噪音失真,尚未解决;
这次为了学习单片机,做了交通灯的项目,加了一些附加功能,为了更好的学习单片机。
单片机是我们专业最基础的的一种东西,对于我们以后专业学习至关重要,这次项目能够为我们以后的工作于学习打下基础。
由于本人的水平有限,设计中难免会有一些不合理的部分,系统的稳定性还有待提高。
最后,对帮助我的所有同学和指导老师再次表示衷心的感谢!
五、效果图或者视频
看附带文件!
六、参考文献
【1】李伯成:
《单片机及嵌入式系统》,清华大学出版社,2005
【2】胡汉才:
《单片机原理及接口技术》,清华大学出版社,2000
【3】王田苗:
《嵌入式系统设计与实例开发》,清华大学出版社,2002
【4】蔡伟智:
《LED道路交通灯的研制》,液晶与显示,第20卷第五期
【5】张友德:
《单片机原理与应用》,复旦大学出版社,2002
【6】倪继烈:
《微型计算机原理与接口技术》,清华大学出版社,2005
【7】李群芳:
《单片微型计算机与接口技术(第三版)》,电子工业出版社,2008
【8】张大明:
《单片机控制实训》,机械工业出版社,2007
附录1
#include
#include<74HC595.H>//74hc595输出子程序
#defineucharunsignedchar
#defineuintunsignedint
sbitgreen1=P2^5;
sbityellow1=P2^4;
sbitred1=P2^3;
sbitgreen2=P2^2;
sbityellow2=P2^1;
sbitred2=P2^0;
sbitwei1=P2^6;
sbitwei2=P2^7;
sbitfeng=P1^0;
sbitK1=P3^7;//暂停
sbitK2=P3^0;//播放
sbitK3=P3^4;//还原30S
sbitK4=P3^5;//显示管开关
sbitK7=P3^1;//点阵开关
ucharcodetable[]={0x3f,0x09,0x5e,0x5d,0x69,0x75,0x77,0x19,0x7f,0x7d};//显示0~9
unsignedcharcodetab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//扫描点阵
unsignedcharcodedigittab1[]={
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//无显示
0x00,0x88,0xc4,0xaa,0xf9,0xaa,0xc4,0x88,//金
0x00,0x00,0x00,
0x00,0x3C,0x7E,0xC3,0x81,0x81,0x81,0xC3,/*"C",0*/
0x00,0x00,0x00,/*"",1*/
0x00,0x70,0xF0,0x80,0x80,0x80,0xFF,0x7F,/*"J",2*/
0x00,0x00,0x00,/*"",3*/
0x82,0xFE,0x92,0x12,0x12,0x12,0x0C,0x00,/*"P",2*/
0x00,0x00,0x00,/*"",5*/
0x00,0xC2,0xE3,0xA1,0xB1,0x99,0x89,0x8F,/*"2",6*/
0x00,0x00,0x00,/*"",7*/
0x00,0x80,0x82,0x82,0xFF,0xFF,0x80,0x80,/*"1",8*/
0x00,0x00,0x00,/*"",9*/
0x10,0x10,0x37,0x35,0xb5,0xf7,0x10,0x10,//“号”
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00//无显示
};
ucharcodeqnzl[]={//千年之恋
0x12,0x22,0x34,0x84,0x74,0x54,0x38,0x42,0x32,0x22,0x42,0x34,0x84,0x72,0x82,0x94,0xA8,0x08,
//前奏
0x32,0x31,0x21,0x32,0x52,0x32,0x31,0x21,0x32,0x62,
//竹林的灯火到过的沙漠
0x32,0x31,0x21,0x32,0x82,0x71,0x81,0x71,0x51,0x32,0x22,
//七色的国度不断飘逸风中
0x32,0x31,0x21,0x32,0x52,0x32,0x31,0x21,0x32,0x62,
//有一种神秘灰色的旋涡
0x32,0x31,0x21,0x32,0x83,0x82,0x71,0x72,0x02,
//将我卷入了迷雾中
0x63,0xA1,0xA2,0x62,0x92,0x82,0x52,
//看不清的双手
0x31,0x51,0x63,0x51,0x63,0x51,0x63,0x51,0x62,0x82,0x7C,0x02,
//一朵花传来谁经过的温柔
0x61,0x71,0x82,0x71,0x62,0xA2,0x71,0x76,
//穿越千年的伤痛
0x61,0x71,0x82,0x71,0x62,0x52,0x31,0x36,
//只为求一个结果
0x61,0x71,0x82,0x71,0x62,0xA3,0x73,0x62,0x53,
//你留下的轮廓指引我
0x42,0x63,0x83,0x83,0x91,0x91,
//黑夜中不寂寞
0x61,0x71,0x82,0x71,0x62,0x0A2,0x71,0x76,
//穿越千年的哀愁
0x61,0x71,0x82,0x71,0x62,0x52,0x31,0x36,
//是你在尽头等我
0x61,0x71,0x82,0x71,0x62,0xA3,0x73,0x62,0x53,
//最美丽的感动会值得
0x42,0x82,0x88,0x02,0x74,0x93,0x89,0xff//结束标志
//用一生守候
};
//----------------------------简谱音调对应的定时器初值---------------------------
//适合11.0592M的晶振
ucharcodecuzhi[]={
0xff,0xff,//占位
0xFC,0x8E,0xFC,0xED,0xFD,0x43,0xFD,0x6A,0xFD,0xB3,0xFD,0xF3,0xFE,0x2D,//中央C调1-7
0xFE,0x47,0xFE,0x76,0xFE,0xA1,0xFE,0xC7,0xFE,0xD9,0xFE,0xF9,0xFF,0x16//高八度1-7
};
uchara,aa,second,ge,shi;//
uintbiaozhi,temp,bianl,SEGXS;//
ucharcnta,cntb,flag,qdxs;//点阵变量
uchartimeh,timel,i,quhao;//音乐变量
voiddelay(ucharz);//延时1MS子程序
voidinit();//初始化子程序
voidKEY();//键盘扫描程序
voiddianzhen();//点阵显示程序
voiddisplay();//数码管显示子程序
voidled();//led红绿黄子程序
voiddelay1(uintz);//延时165MS,即十六分音符
voidsong();//音乐程序
voidmain()
{init();
while
(1)
{
KEY();
dianzhen();
display();
led();
}
}
voidinit()
{
TMOD=0x01;
EA=1;//开总中断
ET0=1;//开定时器
TR0=1;
TR1=1;
ET1=1;
ET2=1;
IT0=1;//开中断0,1
EX0=1;
IT1=1;
EX1=1;
TH1=(65536-50000)/256;//定时器初值
TL1=(65536-50000)%256;
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
TH2=0;
TL2=0;
a=0;
bianl=30;
second=bianl;//计数变量
red2=1;
green2=0;
yellow2=0;
aa=0;
temp=0;
temp=~temp;//黄灯闪烁变量
feng=0;
cntb=0;//
qdxs=1;//点阵开关标志
SEGXS=1;//显示管开关标志
quhao=0;
}
voidKEY()//按键处理
{
if(!
K1)//暂停
{
delay
(1);
if(!
K1)
{ET0=0;TR0=0;
feng=0;
biaozhi=1;}
}
if(!
K2)//启动播放
{
delay
(1);
if(!
K2)
EA=1;ET0=1;TR0=1;
feng=0;
if(biaozhi!
=1)
{TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
a=0;
aa=0;
}
}
if(!
K3)//yinyue按钮
{
delay(3);
if(!
K3)
biaozhi=0;
feng=0;
EA=1;ET0=0;TR0=0;
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
second=30;
green2=0;
green1=0;
red2=0;
yellow1=0;
yellow2=0;
red1=0;
song();
}
if(!
K4)//显示管开关
{
delay(10);
if(!
K4)
{SEGXS=~SEGXS;
while(!
K4){;}
}
}
if(!
K7)//点阵开关
{delay(10);
if(!
K7)
{flag=0;cnta=0;cntb=0;
qdxs=~qdxs;
TR1=~TR1;
ET1=~ET1;
TH1=(65535-50000)/256;
TL1=(65535-50000)%256;
while(!
K7){;}
}