音乐倒数计数器基于单片机的课程设计Word格式.docx
《音乐倒数计数器基于单片机的课程设计Word格式.docx》由会员分享,可在线阅读,更多相关《音乐倒数计数器基于单片机的课程设计Word格式.docx(29页珍藏版)》请在冰豆网上搜索。
它的体积小、质量轻、价格便宜、为学习、应用和开发提供了便利条件。
同时,学习使用单片机了解计算机原理与结构的最佳选择。
现在,这种单片机的使用领域已十分广泛。
彩电、冰箱、空调、录像机、VCD、遥控器、游戏机、电饭煲等无处不见单片机的影子,单片机早已深深地融入我们每个人的生活之中。
单片机能大大地提高这些产品的智能性,易用性及节能性等主要性能指标,给我们的生活带来舒适和方便的同时,在工农业生产上也极大地提高了生产效率和产品质量。
单片机按用途大体上可分为两类,一种是通用型单片机,另一种是专用型单片机。
MCS-51单片机是美国INTEL公司于1980年推出的产品,与MCS-48单片机相比,它的结构更先进,功能更强,在原来的基础上增加了更多的电路单元和指令,指令数达111条,MCS-51单片机可以算是相当成功的产品,一直到现在,MCS-51系列或其兼容的单片机仍是应用的主流产品,各高校及专业学校的培训教材仍与MSC-51单片机作为代表进行理论基础学习。
MCS-51系列单片机主要包括8031、8051和8751等通用产品。
1.2单片机的发展趋势
单片机现在可以说是百花齐放,百家争鸣的时期,世界上各大芯片制造公司都推出了自己的单片机,从8位、16位到32位,数不胜数,应有尽有,有与主流C51系列兼容的,也有不兼容的,但它们各具特色,互成互补,为单片机的应用提供了广阔的天地。
纵观单片机的发展过程,可以预示单片机的发展趋势,大致有:
一、微型单片化
现在常规的单片机普遍都是将中央处理器(CPU)、随机存取数据存储(RAM)、只读程序存储器(ROM)、并行和串行通信接口,中断系统、定时电路、时钟电路集成在一块单一的芯片上,增强型的单片机集成了如A/D转换器、
PMW(脉宽调制电路)、WDT(看门狗)、有些单片机将LCD(液晶)驱动电路都集成在单一的芯片上,这样单片机包含的单元电路就更多,功能就越强大。
甚至单片机厂商还可以根据用户的要求量身定做,制造出具有自己特色的单片机芯片。
此外,现在的产品普遍要求体积小、重量轻,这就要求单片机除了功能强和功耗低外,还要求其体积要小。
现在的许多单片机都具有多种封装形式,其中SMD(表面封装)越来越受欢迎,使得由单片机构成的系统正朝微型化方向发展。
二、低功耗CMOS化
MCS-51系列的8031推出时的功耗达630mW,而现在的单片机普遍都在100mW左右,随着对单片机功耗要求越来越低,现在的各个单片机制造商基本都采用了CMOS(互补金属氧化物半导体工艺)。
像80C51就采用了HMOS(即高密度金属氧化物半导体工艺)和CHMOS(互补高密度金属氧化物半导体工艺)。
CMOS虽然功耗低,但由于其物理特征决定其工作速度不够高,而CHMOS则具备了高速和低功耗的特点,这些特征,更适合于要求低功耗像电池供电的应用场合。
所以这种工艺将是今后一段时期单片机发展的主要途径。
三、主流与多品种共存
现在虽然单片机的品种繁多,各具特色,但仍以89C51为核心的单片机占主流,兼容其结构和指令系统的有PHILIPS公司的产品,ATMEL公司的产品和中国台湾的Winbond系列单片机。
所以89C51占据了半壁江山。
而Microchip公司的PIC精简指令集合(RISC)也有着强劲的发展势头,中国台湾的HOLTEX公司近年的单片机产量与日俱增,与其底价质优的优势,占据一定的市场份额。
此外还有MOTOROLA公司的产品,日本几大公司的专用单片机。
在一定的时期内,这种情形将得以延续,将不存在某个单片机一统天下的垄断局面,走的是依存互补、相辅相成、共同发展的道路。
九十年代以后,单片机在结构上采用双CPU或内部流水线,CPU位数有8位、16位、32位,时钟频率高达20MHZ,片内带有PWM输出、监视定时器WDT、可编程计数器阵列PCA、DMA传输、调制解调器等。
芯片向高度集成化、低功耗方向的发展,使得单片机在大量数据的实时处理、高级通信系统、数字信号处理、复杂工业过程控制、高级机器人以及局域网等方面得到大量应用。
这类单片机有NEC公司的MPD7800,MITSUBISHI公司的M337700,REVKWELL公司的R6500。
1.3项目设计任务与要求
⏹设计任务:
利用STC89C52单片机结合字符型LCD显示器设计一个简易的倒数计数器。
做一小段时间倒计数,当倒计数为0时,则发出一段音乐声响,通知倒计数终了,该做应当做的事。
⏹设计要求:
1.字符型LCD(16×
2)显示器,显示格式为“TIME分分:
秒秒”。
2.用4个按键操作来设置当前想要倒计数的时间。
3.一旦按下键则开始倒计数,当计数为0时,发出一阵音乐声。
4.程序执行后工作指示灯LCD闪动,表示程序开始执行,按下操作键K1~K4动作如下:
●K1---可调整倒计数的时间1~60分钟。
●K2---设置倒计数的时间为5分钟,显示“0500”。
●K3---设置倒计数的时间为10分钟,显示“1000”。
●K4---设置倒计数的时间为20分钟,显示“2000”。
5.复位后LCD的画面应能显示倒计时的分钟和秒数,此时按K1键,则在LCD上显示出设置画面。
此时,若:
⏹按K2键---增加倒计数的时间1分钟。
⏹按K3键---减少倒计数的时间1分钟。
⏹按K4键---设置完成。
2系统设计
2.1框图设计
框图设计是为了能够从整体上把握系统的各个大的模块以及各个模块之间的联系。
同时罗列出需要主要使用到的各个器件,以方面系统开发中器件的选取。
通过框图设计,让设计者从整体上把握系统的开发。
本系统设计的框图如下图2-1所示。
2.2部分硬件方案论述
◆LCD1602显示方式的方案比较。
方案一:
采用花样显示,花样显示是指LCD显示某一屏字符时,采取从左到右或者是从右到左的整屏移动的显示方式。
在这种显示方式下,给人的感觉就是程序是在执行的,同时如果控制好了移动一屏的时间间隔的话,在整体视觉上可以达到很好的效果。
方案二:
采用静态显示,静态显示是指LCD显示某一屏字符时,时钟保持当前字符的显示,不使用移屏显示。
便于控制,同时能够满足正常的显示效果。
由于在显示中存在播放时间的动态变化,这样的话,即使是不产生整屏移动,也能给人动态感,也易于控制。
基于以上各种特点,我选择了方案二。
2.3电路原理图
电路原理图如图2-2所示。
图2-2电路原理图
2.4元件清单
2.4.1AT89C51芯片
STC89C52芯片图如下图2-3所示。
图2-3AT89C51芯片图
主要性能:
与MCS-51单片机产品兼容、8K字节在系统可编程Flash存储器、1000次擦写周期、全静态操作:
0Hz~33Hz、三级加密程序存储器、32个可编程I/O口线、三个16位定时器/计数器八个中断源、全双工UART串行通道、低功耗空闲和掉电模式、掉电后中断可唤醒、看门狗定时器、双数据指针、掉电标识符。
功能特性描述
STC89C52是一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程Flash存储器。
使用高密度非易失性存储器技术制造,与工业80C51产品指令和引脚完全兼容。
片上Flash允许程序存储器在系统可编程,亦适于常规编程器。
在单芯片上,拥有灵巧的8位CPU和在线系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。
STC89C52具有以下标准功能:
8k字节Flash,256字节RAM,32位I/O口线,看门狗定时器,2个数据指针,三个16位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。
另外,STC89C52可降至0Hz静态逻辑操作,支持2种软件可选择节电模式。
空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。
掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位
为止。
8位微控制器8K字节在系统可编程Flash
2.4.2字符型LCD1602
字符型lcd1602如下图2-4所示。
图2-4lcd1602图
1602字符型LCD通常有14条引脚线或16条引脚线的LCD,多出来的2条线是背光电源线。
VCC(15脚)和地线GND(16脚),其控制原理与14脚的LCD完全一样,各引脚符号及其功能表如下表2-1所示。
表2-1LCD各引脚及其功能表
引脚
符号
功能说明
1
VSS
一般接地
2
VDD
接电源(+5V)
3
V0
液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高(对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度)。
4
RS
RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。
5
R/W
R/W为读写信号线,高电平
(1)时进行读操作,低电平(0)时进行写操作。
6
E
E(或EN)端为使能(enable)端,下降沿使能。
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位(最高位)(也是busyflag)
15
BLA
背光电源正极
16
BLK
背光电源负极
2.4.3按键控制模块
按键用于控制数码显示、LCD显示、扬声器等模块的工作。
通过扫描按键是否按下,来设定各模块的工作情况,使各模块可以在按键的控制下,有序地进行工作。
设计中使用单个按键实现单个功能,属于较为简单的控制方式。
在多功能系统设计的试验中我们使用四个按键分别与单片机的p1.0、p1.1、p1.2、p1.3相连。
通过按下相应的按键来处理相应的程序。
如下图2-5所示。
图2-5按键控制模块图
2.4.4其它元件
其它元件图如下图2-6所示。
图2-6其它元件图
3软件设计
3.1程序流程图
主程序开始初始化,然后扫描键盘、复位电路和计数器。
当键盘按键有按下时,调整计数器值,LCD显示新值。
当复位键有按下时,计数器复位为开机画面,当计数器值倒计为0时,蜂鸣器发出声音,计数器停止倒计,程序结束。
主程序流程图、lcd显示流程图和按键流程图分别如下图3-1、图3-2和图3-3所示。
图3-1主程序流程图
4系统的仿真与调试
4.1硬件调试
硬件调试分为静态调试和动态调试,对于硬件调试而言,只要认真焊接,硬件一般不会出现什么问题的。
静态调试一般采用的工具是万用表,它是在用户系统未工作时的一种硬件检测。
动态调试是在用户系统工作的情况下发现和排查错误的一种硬件检测。
调试步骤是:
首先把电路分为若干模块,调试过程中与该模块无关的元件可以不加考虑,这样可把故障限定在一定的范围内;
故障清除后,把各个模块合在一起进行联调,即可完成整个硬件调试工作。
4.2软件调试
软件调试是通过对程序的汇编、连接、执行来发现程序中存在的语法错误与逻辑错误并加以排除纠正的过程。
4.3软硬件调试
软硬件联调是指把调试无误的软件程序烧制进单片机芯片内部,通上电源后,检查硬件工作是否有预期的效果,如果没有则需要检测软件是否在实现功能上有欠缺。
若有错误,通过改写软件来调试,直至达到预期效果,则设计圆满成功。
本课程设计调试结果如下图4-1所示。
图4-1调试结果图
实物图片
5总结
经过将近两个星期的课程设计,简单带有LCD显示的音乐倒数计数器基本完成,系统基本功能基本实现,测试运行也基本正常。
该系统基本上完成了计数闹时的功能。
当然这个系统还存在许多有待完善的地方:
▲功能相对较少,有待于添加,比方说没有时钟功能;
▲焊接工艺比较差,布局有点凌乱。
这次课程设计的时间虽然不算很长,但使我对很多东西有了更深刻的认识。
平时在课堂上无法掌握的集体操作都有了一定的进步。
总结如下:
●查阅资料和阅读相关文献的重要性。
●向同学请教的重要性,团结协作的重要性。
●勤动手的重要性,自己动手,丰衣足食!
以前很多时候一遇到问题常常都会问同学,但是通过这次设计,我学会了自己努力解决困难,提高了自己解决问题的能力。
●对待任何事情都要有耐心和恒心,遇到问题要冷静地思考,积极找出症结所在,逐个解决。
●做事情要步步为营,不能一蹴而就,就像焊接电路,只有确保每一部都真确,才有可能实现整个电路正常工作。
通过本次课程设计,我更深刻的认识到了教学实践在大学课程中的重要性,同时也发觉到了自己在学习方面存在的许多不足之处,在以后的学习中我会努力改进这些不足,不断提高自己的动手实践能力。
参考文献
单片机原理及接口技术第三版(李朝青编)
单片机C语言程序设计完全自学手册(郭惠吴迅编)
基于Proteus的单片机系统设计与仿真实例(蒋辉平周国雄编)
#include<
reg51.h>
#defineucharunsignedchar
#defineuintunsignedint
#definebusy0x80
sbitk1=P1^0;
sbitk2=P1^1;
sbitk3=P1^2;
sbitk4=P1^3;
sbitk5=P1^4;
sbitRS=P2^5;
sbitRW=P2^6;
sbitE=P2^7;
sbitled=P2^0;
sbitsound=P3^7;
ucharcodetableee[]="
20:
00"
;
ucharcodetablee[]="
10:
ucharcodetable[]="
05:
ucharcodetable1[]={'
0'
'
1'
2'
3'
4'
5'
6'
7'
8'
9'
};
ucharcodetable3[]="
11ziyidk"
ucharcodetable2[]="
3108008066"
ucharcodetable5[]="
00:
ucharcodetable4[]="
TIMEOUT!
"
uchard,e,num,t,shishi,shige,fenshi,fenge,miaoshi,miaoge,b,b1,a,aa;
uintcounter=0;
ucharcodearray[]=
{
0x18,0x30,0x1C,0x10,
0x20,0x40,0x1C,0x10,
0x18,0x10,0x20,0x10,
0x1C,0x10,0x18,0x40,
0x1C,0x20,0x20,0x20,
0x1C,0x20,0x18,0x20,
0x20,0x80,0xFF,0x20,
0x30,0x1C,0x10,0x18,
0x20,0x15,0x20,0x1C,
0x20,0x20,0x20,0x26,
0x40,0x20,0x20,0x2B,
0x20,0x26,0x20,0x20,
0x20,0x30,0x80,0xFF,
0x20,0x20,0x1C,0x10,
0x18,0x10,0x20,0x20,
0x26,0x20,0x2B,0x20,
0x30,0x20,0x2B,0x40,
0x20,0x30,0x1C,0x10,
0x18,0x20,0x15,0x20,
0x26,0x40,0x20,0x20,
0x2B,0x20,0x26,0x20,
0x20,0x20,0x30,0x80,
0x20,0x10,0x1C,0x10,
0x20,0x20,0x26,0x20,
0x2B,0x20,0x30,0x20,
0x2B,0x40,0x20,0x15,
0x1F,0x05,0x20,0x10,
0x1C,0x10,0x20,0x20,
0x26,0x40,0x20,0x20,
0x2B,0x20,0x26,0x20,
0x20,0x20,0x30,0x30,
0x18,0x40,0x1C,0x20,
0x20,0x20,0x26,0x40,
0x13,0x60,0x18,0x20,
0x15,0x40,0x13,0x40,
0x18,0x80,0x00
};
charshi,fen,miao;
voiddelay(ucharz)
{ucharx,y;
for(x=z;
x>
0;
x--)
for(y=200;
y>
y--);
}
bitlcd_busy()//测试LCD忙碌状态
{bitresult;
E=0;
RS=0;
//指令
RW=1;
//读出
E=1;
delay(4);
//高电平读出1us
result=(bit)(P0&
busy);
returnresult;
}
voidwrite_1602cmd(ucharcmd)//写命令
{while(lcd_busy());
RS=0;
delay(5);
RW=0;
E=0;
P0=cmd;
E=1;
delay(10);
voidwrite_1602Data(ucharData)//写数据
{while(lcd_busy());
RS=1;
P0=Data;
}
//lcd初始化
voidLCD_init()
{
write_1602cmd(0x01);
//清屏
write_1602cmd(0x38);
//功能设定
delay(5);
write_1602cmd(0x0c);
//光标不闪烁
delay(5);
write_1602cmd(0x06);
//lcd模式设定,i/d=1(计数地址加1)
voidinit()
{
t=0,led=1;
TMOD=0X11;
//设置定时器0,置定时器1在工作方式1
TH0=0xff;
TL0=0xff;
TH1=(65536-50000)/256;
//给定时器1装初值
TL1=(65536-50000)%256;
EA=1;
//开启总中断
ET0=1;
//开启外部中断0中断
ET1=1;
//开启定时器1中断
TR0=0;
TR1=0;
LCD_init();
write_1602cmd(0x80);
for(num=0;
num<
14;
num++)
{
write_1602Data(table3[num]);
delay(5);
}
write_1602cmd(0x80+0x40);
12;
write_1602Data(table2[num]);