音乐倒数计数器单片机课程设计.docx
《音乐倒数计数器单片机课程设计.docx》由会员分享,可在线阅读,更多相关《音乐倒数计数器单片机课程设计.docx(26页珍藏版)》请在冰点文库上搜索。
音乐倒数计数器单片机课程设计
第1章概述
1.1发展前景
随着人们生活水平的不断提高单片机控制无疑是人们追求的目标之一,它给人带来的方便也是不可置否的,人们对它的要求越来越高,要为现代人工作、科研、生活、提供更好的更方便的设施就需要从单片机技术入手,一切向着数字化控制,智能化控制方向发展。
本设计利用AT89C51单片机结合字符型LCD显示器设计一个简易的倒数计数器,可用来煮方便面、煮开水或小睡片刻等。
做一小段时间倒计数,当倒计数为0时,则发出一段音乐声响,通知倒计数终了,该做应当做的事。
1.2设计要求
利用数字AT89C51单片机实现倒数计数器的功能,设定时间后在LED数码管上显示相应的时间。
其功能和性能指标如下:
1、字符型LCD(16 2)显示器,显示格式为“TIME分分:
秒秒”。
2、用4个按键操作来设置当前想要倒计数的时间。
3、一旦按下键则开始倒计数,当计数为0时,发出一阵音乐声。
4、程序执行后工作指示灯LED闪动,表示程序开始执行,按下操作键K1~K4动作如下:
(1)K1—可调整倒计数的时间1~60分钟。
(2)K2—设置倒计数的时间为5分钟,显示“0500”。
(3)K3—设置倒计数的时间为10分钟,显示“1000”。
(4)K4—设置倒计数的时间为20分钟,显示“2000”。
5、复位后LCD的画面应能显示倒计时的分钟和秒数,此时按K1键,则在LCD上显示出设置画面。
此时,若:
(1)按操作键K2—增加倒计数的时间1分钟。
(2)按操作键K3—减少倒计数的时间1分钟。
(3)按操作键K4—设置完成。
1.3设计方案
音乐倒数计数器所倒数的时间由数字显示,控制器使用单片机AT89C51。
本设计基于单片机技术原理,以单片机芯片AT89C51作为核心控制器,通过硬件电路的制作以及软件程序的编制,设计制作出一个计数器,包括以下功能:
输出时间,按下键就开始计时,并将时间显示在LCD1602显示器上。
当倒计数为0时,蜂鸣器就发出音乐声响等等。
该计数器系统主要由计数器模块、LCD显示器模块、蜂鸣器模块、键盘模块、复位模块等部分组成。
总体设计方框图如图1-1所示。
图1-1总体设计方框图
第2章系统结构及主要元器件
2.1AT89C51单片机
AT89C51是一种带4K字节闪烁可编程可擦除只读存储器(FPEROM—FalshProgrammableandErasableReadOnlyMemory)的低电压,高性能CMOS8位微处理器,俗称单片机。
AT89C2051是一种带2K字节闪烁可编程可擦除只读存储器的单片机。
单片机的可擦除只读存储器可以反复擦除100次。
该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,AT89C2051是它的一种精简版本。
AT89C单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
图2-1AT89C51单片机引脚
2.2LCD显示器
1602液晶也叫1602字符型液晶,它是一种专门用来显示字母、数字、符号等的点阵型液晶模块。
它由若干个5×7或者5×11等点阵字符位组成,每个点阵字符位都可以显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用。
图2-2LCD1602引脚图
表2-1LCD1602各引脚功能表
引脚
符号
功能说明
1
VSS
一般接地
2
VDD
接电源+5V
3
V0
液晶显示器对比度调整
4
RS
高电平1时选择数据寄存器、低电平0时选择指令寄存器
5
R/W
高电平1时进行读操作、低电平0时进行写操作
6
E
使能端,下降沿使能
7
DB0
低4位三态、双向数据总线0位
8
DB1
低4位三态、双向数据总线1位
9
DB2
低4位三态、双向数据总线2位
10
DB3
低4位三态、双向数据总线3位
11
DB4
高4位三态、双向数据总线4位
12
DB5
高4位三态、双向数据总线5位
13
DB6
高4位三态、双向数据总线6位
14
DB7
高4位三态、双向数据总线7位
15
BLA
背光电源正级
16
BLK
背光电源负极
第3章硬件设计
3.1显示电路
显示电路硬件连接如图3-1所示,有单片机和一个LCD1602液晶显示器组成,P0为输入口,P2为片选口。
图3-1显示电路连接图
3.2输入电路
按键用于控制数码显示、LCD显示、扬声器等模块的工作。
通过扫描按键是否按下,来设定各模块的工作情况,使各模块可以在按键的控制下,有序地进行工作。
设计中使用单个按键实现单个功能,属于较为简单的控制方式。
在多功能系统设计的试验中我们使用五个按键分别与单片机的P1.0、P1.1、P1.2、P1.3、P1.4相连。
通过按下相应的按键来处理相应的程序。
输入电路连接图如图3-2所示。
图3-2输入电路连接图
3.3复位电路
当MCS-5l系列单片机的复位引脚RST(全称RESET)出现2个机器周期以上的高电平时,单片机就执行复位操作。
如果RST持续为高电平,单片机就处于循环复位状态。
上电复位要求接通电源后,自动实现复位操作。
当单片机已在运行当中时,按下复位键后松开,也能使RST为一段时间的高电平,从而实现上电或开关复位的操作。
复位电路连接如3-4所示。
图3-3复位电路连接图
3.4报警电路
利用I/O定时翻转电平来产生驱动波形的方式必须利用定时器来做定时,通过定时翻转电平产生符合蜂鸣器要求的频率的波形,这个波形就可以用来驱动蜂鸣器了。
比如为2500Hz的蜂鸣器的驱动,可以知道周期为400μs,这样只需要驱动蜂鸣器的I/O口每200μs翻转一次电平就可以产生一个频率为2500Hz,占空比为1/2duty的方波,再通过三极管放大就可以驱动这个蜂鸣器了。
本设计中用单片机的P1.5引脚控制蜂鸣器。
报警电路连接图如图3-4所示。
图3-4报警电路连接图
第4章软件设计
4.1程序流程图
主程序开始初始化,然后扫描键盘、复位电路和计数器。
当键盘按键有按下时,调整计数器值,LCD显示新值。
当K5键按下时开始计时,当计数器值倒计为0时,蜂鸣器发出声音,计数器停止倒计,程序结束。
主程序流程图如图4-1所示。
图4-1主程序流程图
4.2程序源代码
#include
#include
#definetime100
#defineuintunsignedint
#defineucharunsignedchar
uintt,flag,flag0,flag1,flag2,flag3,flag4,flag5,minute,second=60;
ucharnum,j,i,k=0;
ucharcodetable[]="TIME00:
00";
uintcodetable1[]={64580,64684,64777,64820,64898,64968,65030};
sbitkey1=P1^0;
sbitkey2=P1^1;
sbitkey3=P1^2;
sbitkey4=P1^3;
sbitkey5=P1^4;
sbitP1_5=P1^5;
sbitRS=P2^6;
sbitRW=P2^5;
sbitLcdE=P2^7;
sbitled_green=P2^0;
voidwrite_time(uintaddr,uintdate);
voiddelay(uintz)
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
voiddelay1(void)
{
uchara,b,c;
for(c=13;c>0;c--)
for(b=247;b>0;b--)
for(a=142;a>0;a--);
_nop_();}
voidwrite_com(ucharcom)
{
RS=0;
RW=0;
P0=com;
delay(5);
LcdE=1;
delay(10);
LcdE=0;
}
voidwrite_date(uchardate)
{
RS=1;
RW=0;
P0=date;
delay(5);
LcdE=1;
delay(10);
LcdE=0;
}
voidKEY1()
{
while(flag1)
{
if(key2==0)
{
delay(time);
if(key2==0)
{
if(minute<60)
minute=minute+1;
write_time(7,minute);
}
}
if(key3==0)
{
delay(time);
if(key3==0)
{
if(minute>0)
minute=minute-1;
write_time(7,minute);
}
}
if(key4==0||key5==0)
{
delay(150);
if(key4==0||key5==0)
{
flag1=0;
flag=1;
TR0=1;
}
}
}
}
voidKEY2()
{
minute=5;
write_time(7,minute);
while(flag2)
{
if(key5==0)
{
delay(time);
if(key5==0)
{
flag2=0;
flag=1;
TR0=1;
}
}
}
}
voidKEY3()
{
minute=10;
write_time(7,minute);
while(flag3)
{
if(key5==0)
{
delay(time);
if(key5==0)
{
flag3=0;
flag=1;
TR0=1;
}
}
}
}
voidKEY4()
{
minute=20;
write_time(7,minute);
while(flag4)
{
if(key5==0)
{
delay(150);
if(key5==0)
{
flag4=0;
flag=1;
TR0=1;
}
}
}
}
voidwrite_time(uintaddr,uintdate)
{
uintge,shi;
ge=date%10;
shi=date/10;
write_com(0x80+addr);
write_date(0x30+shi);
write_date(0x30+ge);
if(addr==7&&date==0)
j=1;
if(j==1&&addr==10&&date==0)
{
flag0=1;
TR0=0;
TR1=1;
flag5=1;
}
}
voidinit()
{
P1=0xff;
RW=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80);
TMOD=0x11;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
TH0=0xff;
TL0=0xff;
ET0=1;
ET1=1;
TR0=0;
TR1=0;
EA=1;
flag0=1;
for(num=0;num<12;num++)
{
write_date(table[num]);
delay(20);
}
}
voidstart()
{
if(key1==0)
{
delay(time);
if(key1==0)
{
flag0=0;
flag1=1;
KEY1();
}
}
if(key2==0)
{
delay(time);
if(key2==0)
{
flag0=0;
flag2=1;
KEY2();
}
}
if(key3==0)
{
delay(time);
if(key3==0)
{
flag0=0;
flag3=1;
KEY3();
}
}
if(key4==0)
{
delay(150);
if(key4==0)
{
flag0=0;
flag4=1;
KEY4();
}
}
}
voidwrite_time0()
{
minute=minute-1;
write_time(7,minute);
write_time(10,59);
flag=0;
}
voidcounter()
{
if(t==20)
{
led_green=led_green^1;
if(flag==1)
write_time0();
t=0;
second=second-1;
write_time(10,second);
if(k==1&&second==59)
{
if(minute>0)
minute=minute-1;
write_time(7,minute);
}
if(second==0)
{
k=1;
second=60;
}
}
}
intmain()
{
init();
while
(1)
{
while(flag0)
start();
counter();
while(flag5)
{
delay1();
i++;
if(i>7)
i=0;
}
}
return0;
}
voidTimer0()interrupt1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
t++;
}
voidTimer1()interrupt3
{
TH1=table1[i]/256;
TL1=table1[i]%256;
P1_5=~P1_5;
if(key5==0)
{
delay(100);
if(key5==0)
{
TR1=0;
flag5=0;
k=0;
j=0;}
}
}
第5章系统仿真及调试
5.1软件调试
软件调试是通过对程序的汇编、连接、执行来发现程序中存在的语法错误与逻辑错误并加以排除纠正的过程。
通过反复调试修改找出了程序中的语法与逻辑错误,并加以改正,最后调试成功。
5.2软硬件调试
软硬件联调是指把调试无误的软件程序烧制进单片机芯片内部,通上电源后,检查硬件工作是否有预期的效果,如果没有则需要检测软件是否在实现功能上有欠缺。
若有错误,通过改写软件来调试,直至达到预期效果,则设计圆满成功。
本程序在调试时发现k1键未达到预期效果,通过反复试验,不断修改最后达到了预期效果。
修改后的部分程序如下。
voidKEY1()
{
while(flag1)
{
if(key2==0)
{
delay(time);
if(key2==0)
{
if(minute<60)
minute=minute+1;
write_time(7,minute);
}
}
if(key3==0)
{
delay(time);
if(key3==0)
{
if(minute>0)
minute=minute-1;
write_time(7,minute);
}
}
if(key4==0||key5==0)
{
delay(150);
if(key4==0||key5==0)
{
flag1=0;
flag=1;
TR0=1;
}
}
}
}
5.3系统仿真
图5-1总效果图
图5-2程序运行效果图
图5-3按K2键效果图
图5-4按K3效果图
图5-5按K4效果图
图5-6复位后按K1再按K2效果图
图5-7复位后按K1再按K3效果图
图5-8倒计时效果图
参考文献
[1]张毅刚.单片机原理及应用[M].北京:
高等教育出版社,2003.
[2]李广第.单片机基础[M].北京:
北京航空航天打学出版社,2009.
[3]吴金戎.8051单片机实践与应用[M].北京:
清华大学出版社,2003.
[4]杨文龙.单片机技术及其应用[M].北京:
电子工业出版社,2008.
[5]王德彪.MCS-51单片机原理及接口技术[M].北京:
电子工业出版社,2005.
[6]戴佳,戴卫恒.51单片机C语言程序设计实例精选[M].北京:
电子工业出版社,2006.
东北石油大学课程设计成绩评价表
课程名称
单片机课程设计
题目名称
音乐倒数计数器
学生姓名
学号
指导教师姓名
李艳辉
职称
序号
评价项目
指标
满分
评分
1
工作量、工作态度和出勤率
按期圆满的完成了规定的任务,难易程度和工作量符合教学要求,工作努力,遵守纪律,出勤率高,工作作风严谨,善于与他人合作。
20
2
课程设计质量
课程设计选题合理,计算过程简练准确,分析问题思路清晰,结构严谨,文理通顺,撰写规范,图表完备正确。
45
3
创新
工作中有创新意识,对前人工作有一些改进或有一定应用价值。
5
4
答辩
能正确回答指导教师所提出的问题。
30
总分
评语:
指导教师:
年月日