单片机倒计时音乐闹钟课程设计.docx
《单片机倒计时音乐闹钟课程设计.docx》由会员分享,可在线阅读,更多相关《单片机倒计时音乐闹钟课程设计.docx(15页珍藏版)》请在冰豆网上搜索。
单片机倒计时音乐闹钟课程设计
五邑大学
单片机课程设计
课程设计题目:
倒计时音乐闹钟
院系信息工程学院
专业轨道交通自动化
学号3113002264
学生姓名梁杰帆
指导教师梁淑芬
完成日期2015年11月3日
基于单片机的倒计时音乐闹钟
一.设计目的……………………………………………………………2
二.硬件简介…………………………………………………………·3
三.设计要求……………………………………………………………4
四.硬件电路设计………………………………………………………5
五.流程图设计…………………………………………………………7
六.程序设计……………………………………………………………8
七.设计小结……………………………………………………………13
八.参考文献……………………………………………………………14
摘要
近年来随着科技的飞速发展,单片机的应用正在不断深入,渐渐的改变人们的生活习惯。
在生活中,单片机往往作为一个核心部件来使用,仅单片机方面知识是不够的,还应根据具体硬件结构软硬件结合,加以完善。
人们做事通常是要有目的和时间观念的,在平时对一些比较重要的事情应该是调好闹钟或者备忘录来提醒自己。
提醒的方式有很多,在学习了单片机的有关知识之后,运用相关知识来设计完成倒计时音乐闹钟。
我对单片机很感兴趣,所以在听了老师给我们讲解单片机相关知识以后,我自己课后查找资料, 不断学习单片机方面的知识。
这次课设给了我学以致用的机会,我利用自己学的单片机知识,做了一个基于51单片机的倒计时音乐闹钟的设计。
关键词:
单片机 倒计时LCD液晶屏
一、设计目的
(一)通过设计了解一个倒计时音乐闹钟的基本工作原理
(二)掌握51单片机计数器/定时器的工作方式和1602LCD的驱动工作原理;
(三)掌握keil4、AD10、prtues等软件的使用
(四)掌握调试电路和分析问题的能力
二、设计内容
(1)利用AT89C51单片机结合字符型LCD显示器设计一个简易的倒数计数器。
一分钟倒计数,当倒计数为0时,则发出一段音乐声响,通知倒计数到达。
(2)通过按键可以自主设置倒计数的时间(1-60min、5min、10min)。
一旦按下键则开始倒计数,当计数为0时,发出一阵音乐声。
三、总体设计与方案讨论
倒计时音乐器主要有六个模块组成:
①51单片机最小系统电路
②LCD1602液晶屏电路
③按键电路
④LED指示灯电路
⑤电源电路
⑥蜂鸣器电路
方案论证:
方案一:
由于STC89C52中自带有定时器T0、T1,所以倒计时音乐闹钟可采用定时器中断方式和定时产生可变方波方式。
此方式需要考虑两个定时器的优先级和定时器的交替开断需要精确。
所以变成比较麻烦,但是比较准备和稳定。
方案二:
只利用STC89C52的一个定时器用来倒计时,而音乐是通过有不同的延时来达到产生不同方波的目的。
这种方法虽然编程简单,但是音乐的效果不好。
对比以上两种方法,我最后选择的方案一,虽然编程较方案二麻烦,但是最终的效果比较好。
四、硬件介绍
序号
元器件名称
型号
可代用型号
数量
2
单片机
STC89C52
1
3
LED
2
4
晶振电容22p
2
5
复位按钮
1
7
10k复位电阻
2
8
单独按键
5
10
电解电容10uf
1
11
4.7K排阻
1
12
1k电阻
2
13
11.0592M晶振
2
1.所需元件
STC89C52介绍
单片机主控电路的主要元件是STC89C52,其外型及管脚如图1所示:
图1 STC89C51管脚排列图
STC89C52是一个低电压,高性能CMOS 8位单片机,片内含4k bytes的可反复擦写的只读程序存储器(PEROM)和128 bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器和Flash存储单元,内置功能强大的微型计算机的STC89C52提供了高性价比的解决方案。
STC89C52是一个低功耗高性能单片机,40个引脚,32个外部双向输入/输出(I/O)端口,同时内含2个外中断口,2个16位可编程定时计数器,2个全双工串行通信口。
3.1.2管脚说明:
VCC:
供电电压。
GND:
接地。
P0口:
P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门流。
P1口:
P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。
P2口:
P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流。
P3口:
P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。
P3口也可作为STC89C52的一些特殊功能口,如下所示:
P3.0 RXD(串行输入口)
P3.1 TXD(串行输出口)
P3.2 /INT0(外部中断0)
P3.3 /INT1(外部中断1)
P3.4 T0(记时器0外部输入)
P3.5 T1(记时器1外部输入)
P3.6 /WR(外部数据存储器写选通)
P3.7 /RD(外部数据存储器读选通)
1602LCD液晶屏简介
字符型液晶显示模块是一种专门用于显示字母、数字、符号等点阵式LCD。
管脚列表
四、硬件电路设计与仿真
原理图
PCB图
Protues仿真图
硬件总结:
由于考虑到元器件的布局、电路板的美观和减少飞线,我采用了双面板的形式。
因为这个倒计时音乐闹钟不是高速板,所以它的PCB布线不用太讲究,主要是不要违反基本规则就可以了。
个人比较喜欢在电路板加多一个LED用来指示电源正常和用另外一个LED来指示程序运行正常,所以额外加多了两个LED灯。
五、程序流程图
六、程序设计
主程序:
#include"reg52.h"
#include"1602.h"
sbitbeep=P2^0;
sbitLED=P1^4;
bitflag2;
ucharptr=0x00;
ucharhigh;
ucharlow;
uchartime;
ucharbeep_flag=0;
ucharm;
inta,b,y;
sbitswitch_one=P1^0;
sbitswitch_two=P1^1;
sbitswitch_three=P1^2;
sbitswitch_four=P1^3;
ucharmiao=60,fen=1,num=0;
ucharflag=1;
uchars1num=0;
ucharcodemusic[]={
0xFC,0x44,0x7F,0xFC,0x44,0x7F,0xFC,0x44,0xFF,0xFA,0x68,0xFF,
//3_3_31
0xFD,0x23,0x7F,0xFD,0x23,0x7F,0xFD,0x23,0xFF,0xFC,0x44,0xFF,
//1_3_55
0xFC,0x44,0x7F,0xFD,0x23,0x7F,0xFD,0x82,0xFF,0xFD,0x82,0xFF,
//4_3_2-
0xFD,0x23,0x7F,0xFD,0x23,0x7F,0xFC,0xAC,0xFF,0xFF,0xFF,0xFF,
//2_3_44
0xFC,0xAC,0x7F,0xFD,0x23,0x7F,0xFD,0x34,0xFF,0xFD,0x34,0xFF,
//3_2_31
0xFD,0x23,0x7F,0xFC,0xAC,0x7F,0xFD,0x23,0xFF,0xFC,0x44,0xFF,
//1_3_2.5
0xFC,0x44,0x7F,0xFD,0x23,0x7F,0xFC,0xAC,0xFF,0xFA,0x68,0xFF,
//.7_2_1-
0xFC,0x0C,0x7F,0xFC,0xAC,0x7F,0xFC,0x44,0xFF,0xFF,0xFF,0xFF,
0x00};
voiddelayms(intz)
{
inta,b;
for(a=z;a>0;a--)
for(b=112;b>0;b--);
}
voidtime_init()
{
TMOD=0x11;
TR1=0;
TH1=0xDC;//ÑÓʱ10ms
TL1=0x00;
ET1=1;
EA=1;
}
voidkeyscan()
{
if(switch_one==0)//Í£Ö¹¿ªÊ¼
{
s1num++;
while(!
switch_one);
if(s1num==1)
{
TR1=1;
}
if(s1num==2)
{
s1num=0;
TR1=0;
}
}
if(switch_two==0)//1~60·ÖÖӿɵ÷
{
fen++;
miao=0;
if(fen==60)
fen=0;
write_sfm(4,fen);
write_sfm(7,miao);
write_com(0x80+0x40+4);
write_com(0x80+0x40+7);
miao=60;
}
if(switch_three==0)//5·ÖÖÓ
{
fen=5;
miao=0;
write_sfm(4,fen);
write_sfm(7,miao);
write_com(0x80+0x40+4);
write_com(0x80+0x40+7);
miao=60;
}
if(switch_four==0)//10·ÖÖÓ
{
fen=10;
miao=0;
write_sfm(4,fen);
write_sfm(7,miao);
write_com(0x80+0x40+4);
write_com(0x80+0x40+7);
miao=60;
}
}
voidmain()
{
time_init();
lcd_init();
print_string("By:
Blue");
write_com(0x80+0x40);
print_string("TIM00:
00");//5689
while
(1)
{
keyscan();
if(beep_flag==1)
{
beep_flag=0;
do
{
m++;
for(a=0;a<2000;a++)
{
beep=~beep;for(b=0;b<24;b++);
}
for(a=0;a<2000;a++)
{
beep=~beep;for(b=0;b<25;b++);
}
for(a=0;a<2000;a++)
{
beep=~beep;for(b=0;b<26;b++);
}
for(a=0;a<2000;a++)
{
beep=~beep;for(b=0;b<27;b++);
}
}
while(m<5);
}
}
}
voidtime1()interrupt3
{
TH1=0xDC;//ÑÓʱ10ms
TL1=0x00;
num++;
if(num==90)
{
LED=~LED;
num=0;
miao--;
if(miao==59)
fen--;
if(miao==0)
{
miao=60;
if(fen==0)
{
TR1=0;
fen=0;
miao=0;
beep_flag=1;
}
}
write_sfm(4,fen);
write_sfm(7,miao);
}
}
1602LCD液晶屏驱动程序
#include"1602.h"
#include"reg52.h"
#include
sbitRS=P2^2;
sbitLCDRW=P2^3;
sbitEN=P2^4;
//--------------------------------------------
voidwrite_data(uchardat){
RS=1;
LCDRW=0;
DATA_PORT=dat;
delay_ms(5);
EN=1;
delay_ms(5);
EN=0;
}
//--------------------------------------------
voidwrite_com(ucharcom){
RS=0;
LCDRW=0;
DATA_PORT=com;
delay_ms(5);
EN=1;
delay_ms(5);
EN=0;
}
//--------------------------------------------
voidlcd_init(){
LCDRW=0;
RS=0;
write_com(0x36);
write_com(0x0f);
write_com(0x38);
write_com(0x06);
write_com(0x01);
write_com(0x0C);
write_com(0x80);
}
voidprint_string(char*str){
inti;
for(i=0;str[i]!
=0;i++)
{
write_data(str[i]);
}
}
//--------------------------------------------
voiddelay_ms(uchart){
intj;
for(;t!
=0;t--)
for(j=0;j<255;j++);
}
voidwrite_sfm(ucharadd,uchardate)
{
ucharshi,ge;
shi=date/10;
ge=date%10;
write_com(0x80+0x40+add);
write_data(0x30+shi);
write_data(0x30+ge);
}
七、设计小结
这是第一次做课程设计,在途中遇到了很多问题。
1、51片单机的两个定时器优先级问题,用于蜂鸣器唱歌的产生占空比的定时器1和倒计时的定时器1在设计的过程中存在干扰。
·解决办法:
后来通过慢慢的调试,把定时器1设置为最高优先级,在倒计时倒数到0时停止定时器1,给一个标志位,在主程序的大循环中判断标志位,然后才开启定时器0,产生不同占空比的方波,蜂鸣器唱歌。
2、蜂鸣器的三极管型号选不对,导致唱歌声音比较小。
·解决方法:
更换三极管,最后换成PNPS8550。
3、画电路图时LCD1602的数据口用P0口,只加了排阻,而忘了上拉,导致液晶屏只亮而没有数据
·解决方法:
在电路板上更换9脚排阻,一脚飞线到VCC。
有错误不用怕,仔细查资料问老师找出问题就可以了。
经过一周的努力,把一个个小问题解决后,终于把单片机课程设计做好了。
在这次课程设计中,我发现了自己存在的一些不足,有时不够细心导致做多了很多无用功,以后一定要改正这一点。
经过这次课程设计,我也学会了查找资料和调试电路,发现问题解决问题。
最后,感谢老师在这次课程设计中对我的帮助。
八、参考文献:
[1]谭浩强.C程序设计(第四版)清华大学出版社,2010
[2]刘焕成.工程背景下的单片机原理及系统设计,2011
[3]廖惜春.工模拟电子技术基础,2011
[4]郭天祥.51单片机程序设计及C语言,2011
[5]杨欣.电子设计从零开始第二版,2011