智能交通灯+点阵+音乐文档格式.docx
《智能交通灯+点阵+音乐文档格式.docx》由会员分享,可在线阅读,更多相关《智能交通灯+点阵+音乐文档格式.docx(30页珍藏版)》请在冰豆网上搜索。
整体实验连接电路如下图所示:
图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//交通灯通行时间设置减数开关
{
bianl=(bianl-1)%100;
}
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<
reg52.h>
#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;
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*/
3*/
0x82,0xFE,0x92,0x12,0x12,0x12,0x0C,0x00,/*"
P"
2*/
5*/
0x00,0xC2,0xE3,0xA1,0xB1,0x99,0x89,0x8F,/*"
2"
6*/
7*/
0x00,0x80,0x82,0x82,0xFF,0xFF,0x80,0x80,/*"
1"
8*/
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,
//穿越千年的哀愁
//是你在尽头等我
//最美丽的感动会值得
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;
//音乐变量
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;
TH2=0;
TL2=0;
a=0;
bianl=30;
//计数变量
red2=1;
green2=0;
yellow2=0;
aa=0;
temp=0;
temp=~temp;
//黄灯闪烁变量
cntb=0;
//
qdxs=1;
//点阵开关标志
SEGXS=1;
//显示管开关标志
quhao=0;
voidKEY()//按键处理
if(!
K1)//暂停
delay
(1);
K1)
{ET0=0;
biaozhi=1;
if(!
K2)//启动播放
K2)
ET0=1;
TR0=1;
if(biaozhi!
=1)
{TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
aa=0;
}
}
K3)//yinyue按钮
delay(3);
K3)
ET0=0;
second=30;
green1=0;
red2=0;
yellow1=0;
red1=0;
song();
K4)//显示管开关
delay(10);
K4)
{SEGXS=~SEGXS;
while(!
K4){;
}
K7)//点阵开关
{delay(10);
K7)
{flag=0;
cnta=0;
cntb=0;
qdxs=~qdxs;
TR1=~TR1;
ET1=~ET1;
TH1=(65535-50000)/256;
TL1=(65535-50000)%256;
K7){;