基于单片机LCD显示的音乐倒数计数器课程设计解析.docx
- 文档编号:5747944
- 上传时间:2022-12-31
- 格式:DOCX
- 页数:21
- 大小:345.24KB
基于单片机LCD显示的音乐倒数计数器课程设计解析.docx
《基于单片机LCD显示的音乐倒数计数器课程设计解析.docx》由会员分享,可在线阅读,更多相关《基于单片机LCD显示的音乐倒数计数器课程设计解析.docx(21页珍藏版)》请在冰豆网上搜索。
基于单片机LCD显示的音乐倒数计数器课程设计解析
课程论文
题目:
带有LCD显示的音乐倒数计数器
课程:
单片机的C语言程序设计与应用
学期:
班级:
姓名:
学号:
教师:
日期:
摘要
单片机技术是一门不可或缺的技术,对我们将来的工作以及生活和学习都有很密切的联系。
近年来,随着电子技术和微机计算机的迅速发展,单片机的档次不断提高,其应用领域也在不断的扩大,已在工业控制、尖端科学、智能仪器仪表、日用家电、汽车电子系统、办公自动化设备、个人信息终端及通信产品中得到了广泛的应用,成为现代电子系统中最重要的智能化的核心部件。
单片机由CPU、一定容量的RAM和ROM构成,定时、计数和多种接口于一体的微控制器。
它体积小,成本低,功能强,广泛应用于智能产业和工业自动化上。
而51系列单片机是各单片机中最为典型和最有代表性的一种。
这次课程设计通过对它的学习、应用,从而达到学习、设计、开发软、硬的能力。
本设计利用AT89C51单片机结合字符型LCD显示器设计一个简易的倒数计数器。
用4个按键操作来设置当前想要倒计数的时间。
做一小段时间倒计数,当倒计数为0时,则发出一段音乐声响,通知倒计数终了,该做应当做的事。
应用Proteus的ISIS软件和KeiluVision3来实现该计数器的设计与仿真。
该方法仿真效果真实、准确,节省了硬件资源。
该多功能计数器可以应用于一般的生活和工作中,也可以通过改装,提高性能,增加新功能,从而给人们的生活和工作带来更多的方便。
关键词:
AT89C51,计数器,键盘控制,LCD显示,Proteus,Keil
1设计概述和要求1
1.1设计概述1
1.2设计要求1
2系统设计3
2.1框图设计3
2.2元件清单3
3软件设计7
3.1程序流程图7
3.1.1主程序流程图7
3.1.2蜂鸣器发声程序流程图8
3.2蜂鸣器发声电路原理8
3.3蜂鸣器发声程序的关键代码9
4PROTEUS仿真结果10
4.1总体电路仿真结果10
4.2假设倒计时为5秒时的仿真结果10
5总结12
6附表(本设计所有程序)………………………………………….14
参考文献14
1设计概述和要求
本设计的任务是利用AT89C51单片机结合字符型LCD显示器设计一个简易的倒数计数器。
做一小段时间倒计数,当倒计数为0时,则发出一段音乐声响。
1.1设计概述
20世纪末,电子技术获得了飞速的发展。
在其推动下,现代电子产品几乎渗透到了社会的各个领域,有力的推动和提高了社会生产力的发展与信息化程度。
同时也使现代电子产品性能进一步提升,产品更新换代的节奏也越来越快。
随着科技的发展和社会的进步,人们对数字钟的要求越来越高,多功能数字钟不管在性能还是在样式上都发生了质的变化。
数字钟实际上是一个对标准频率进行计数的计数电路,走时精度高,稳定性好,使用方便,不需要经常调校。
单片计算机即单片微型计算机,是集CPU,RAM,ROM,定时/计数和多种接口于一体的微控制器。
它体积小成本低,功能强,广泛应用于智能产品和工业自动化上。
由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度远远超多老式钟表,钟表的数字化给人们生产生活带来了极大地方便,而且大大的扩展了钟表原先的报时功能,诸如定时自动报警、0按时自动打铃、定时广播、自动启闭路灯、定时开关烘箱、通断动力设备、甚至各种定时电气的自动启用等,所有这些,都是以数字化为基础的,因此研究数字钟及扩大其应用有着非常现实的意义。
本系统采用单片机作为数字钟的核心控制器,读取时钟的值,并通过LCD液晶显示器显示出来,而且可以通过按键电路控制执行信号,给时钟赋初值。
还可以设置闹钟,当计数为0时,发出一阵音乐声。
并可拓展其功能显示年月日。
1.2设计要求
利用AT89C51单片机结合字符型LCD显示器设计一个简易的倒数计数器,可用来煮方便面、煮开水或小睡片刻等。
作品先接受用户输入的倒数计数时间,然后由用户启动作品工作(可用一个闪烁的LED灯指示),当倒计数为0时,则发出一段音乐声响,通知倒计数终了,该做应当做的事。
定时闹钟的基本功能如下。
●字符型LCD(16 2)显示器。
●显示格式为“TIME分分:
秒秒”。
用4个按键操作来设置当前想要倒计数的时间。
一旦按下键则开始倒计数,当计数为0时,发出一阵音乐声
2系统设计
2.1框图设计
本项目的系统设计框图如图2-1所示:
图2-1系统框图
由系统框图可看出,本设计由单片机AT89C51、LCD液晶显示器、控制键盘、蜂鸣器、复位单路和定时器电路几大模块构成。
2.2元件清单
主控单片机采用AT89C51芯片,时钟模块选用一12MHZ晶振,产生时钟脉冲。
显示模块采用LCD1602,设置部分选用键盘按键电路,发声部分选用BUZZER蜂鸣器。
还有一些电源、电阻、电容、接地等。
主要元件清单如图2-2所示:
图2-2主要元件清单
AT89C51:
AT89C51是一种带4K字节闪存可编程可擦除只读存储器(FPEROM—FlashProgrammableandErasableReadOnlyMemory)的低电压,高性能CMOS8位微处理器,俗称单片机。
主要特性:
与MCS-51兼容、4K字节可编程闪烁存储器、寿命:
1000写/擦循环、数据保留时间:
10年、全静态工作:
0Hz-24MHz、三级程序存储器锁定、128×8位内部RAM、32可编程I/O线、两个16位定时器/计数器、5个中断源、可编程串行通道、低功耗的闲置和掉电模式、片内振荡器和时钟电路。
1602LCD:
1602液晶模块内部的控制器共有11条控制指令,如表2-1所示.
表2-11602液晶模块控制指令
序号
指令
RS
R/W
D7
D6
D5
D4
D3
D2
D1
D0
1
清显示
0
0
0
0
0
0
0
0
0
1
2
光标返回
0
0
0
0
0
0
0
0
1
*
3
置输入模式
0
0
0
0
0
0
0
1
I/D
S
4
显示开/关控制
0
0
0
0
0
0
1
D
C
B
5
光标或字符移位
0
0
0
0
0
1
S/C
R/L
*
*
6
置功能
0
0
0
0
1
DL
N
F
*
*
7
置字符发生存贮器地址
0
0
0
1
字符发生存贮器地址
8
置数据存贮器地址
0
0
1
显示数据存贮器地址
9
读忙标志或地址
0
1
BF
计数器地址
10
写数到CGRAM或DDRAM)
1
0
要写的数据内容
11
从CGRAM或DDRAM读数
1
1
读出的数据内容
键盘:
键盘采用5个button,分别控制倒计时开始、调分个位、调分十位、调秒个位、调秒十位;另外还加一个总开关用于控制所有电路的通电情况。
蜂鸣器:
用三极管、电阻和speaker组成蜂鸣器电路。
蜂鸣器最重要的特点是只要按照极性要求加上合适的直流电压就可以发出固有频率的声音。
3软件设计
3.1程序流程图
3.1.1主程序流程图
主程序开始初始化,然后扫描键盘、复位电路和计数器。
当键盘按键有按下时,调整计数器值,LCD显示新值。
当复位键有按下时,计数器复位为初值,重新倒计数。
当计数器值倒计为0时,蜂鸣器发出声音,计数器停止倒计,程序结束。
主程序流程图如图3-1所示:
图3-1主程序流程图
3.1.2蜂鸣器发声程序流程图
蜂鸣器发声程序流程图如图3-2所示:
图3-2蜂鸣器发声程序流程图
3.2蜂鸣器发声电路原理
对于单片机产生音乐,关键是控制频率的输出.我们知道,不同的声音对应不同的频率,产生有规律的频率输出就可以得到相应规律的声音.有8个基本音符:
do﹑re﹑mi﹑fa﹑so﹑la﹑xi﹑do,八个不同的音符对应着不同的频率.只要我们对照音符输出相对应的频率,就可以产生美妙的音乐.本文中采用了T0中断方式产生不同频率,并用按键控制音乐的播放和停止。
用三极管、电阻和BUZZER组成蜂鸣器电路。
蜂鸣器最重要的特点是只要按照极性要求加上合适的直流电压就可以发出固有频率的声音。
4PROTEUS仿真结果
4.1电路原理图及仿真
系统protel99se电路原理图和proteus电路仿真分别如图4-1(a)、图4-1(b)所示
图4-1(a)总体电路电路原理图
图4-1(b)电路仿真
4.2倒计时设置仿真如下图4-2(a)所示
图4-2倒计时设置仿真
倒计数设置为5秒时的仿真如下图4-2(b)所示
图4-2(b)倒计数5秒的仿真
4.3蜂鸣器的仿真如下图4-3所示
图4-3蜂鸣器的仿真
5总结
通过此次多功能数字计数器的设计制作,我们将从书本上学到的知识应用于实践,再次巩固了我的单片机知识,提高了我的电路仿真设计能力。
虽然设计过程中遇到了很多困难,但是在解决这些问题的过程无疑是对自身专业素质的提高。
当最终调试成功的时候也是对自己的一种肯定。
此次的设计不仅增强了自己在专业设计方面的信息,鼓舞了自己,更是一次兴趣的培养,为以后的学习方向明确了重点。
另外在这次设计中我们遇到了不少的问题,针对不同的问题我们采取不同的解决方法,最终一一解决了。
在我们遇到不懂得问题时,利用课本上、参考书上的知识,以及网上的资料最终解决问题。
和队友之间相互讨论,明白了团队合作的重要性。
本次项目设计还存在很多不足,比如,LCD的日期显示还不够完美,计数功能也不够详细等。
以后争取完善这个设计,以提高我们的单片机设计能力。
这里很感谢蓝会立老师给我们的指导和教育,感谢他给我们提供了良好的学习设计环境,也很感谢可爱的伙伴们,让我觉得团队的力量很伟大。
6附表(本设计所有程序)
#include
#include
sbitrs=P2^4;
sbitrw=P2^5;
sbitep=P2^6;
sbitk1=P1^4;
sbitk2=P1^5;
sbitk3=P1^6;
sbitk4=P1^7;
sbitk5=P1^3;
sbitspeaker=P3^0;
unsignedcharcodedis1[]={"605"};
unsignedcharcodedis2[]={"TIME00:
00"};
unsignedcharcodedis3[]={"0123456789"};
unsignedintnum=0;
unsignedintmiaogw=0;
unsignedintmiaosw=0;
unsignedintfengw=0;
unsignedintfensw=0;
unsignedcharflag=1;
unsignedchartimer0h,timer0l,time;
//世上只有妈妈好数据表
codeunsignedcharsszymmh[]={6,2,3,5,2,1,3,2,2,5,2,2,1,3,2,6,2,1,5,2,1,
6,2,4,3,2,2,5,2,1,6,2,1,5,2,2,3,2,2,1,2,1,
6,1,1,5,2,1,3,2,1,2,2,4,2,2,3,3,2,1,5,2,2,
5,2,1,6,2,1,3,2,2,2,2,2,1,2,4,5,2,3,3,2,1,
2,2,1,1,2,1,6,1,1,1,2,1,5,1,6,0,0,0
};
//音阶频率表高八位
codeunsignedcharFREQH[]={
0xF2,0xF3,0xF5,0xF5,0xF6,0xF7,0xF8,
0xF9,0xF9,0xFA,0xFA,0xFB,0xFB,0xFC,0xFC,//1,2,3,4,5,6,7,8,i
0xFC,0xFD,0xFD,0xFD,0xFD,0xFE,
0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF,
};
//音阶频率表低八位
codeunsignedcharFREQL[]={
0x42,0xC1,0x17,0xB6,0xD0,0xD1,0xB6,
0x21,0xE1,0x8C,0xD8,0x68,0xE9,0x5B,0x8F,//1,2,3,4,5,6,7,8,i
0xEE,0x44,0x6B,0xB4,0xF4,0x2D,
0x47,0x77,0xA2,0xB6,0xDA,0xFA,0x16,
};
voiddelayyy(unsignedchart)
{
unsignedchart1;
unsignedlongt2;
for(t1=0;t1 { for(t2=0;t2<8000;t2++) { ; } } TR0=0; } voidt0int()interrupt1 { TR0=0; speaker=! speaker; TH0=timer0h; TL0=timer0l; TR0=1; } voidsong() { TH0=timer0h; TL0=timer0l; TR0=1; delayyy(time); } voiddelay(unsignedcharms) { unsignedchari; while(ms--) { for(i=0;i<250;i++) { _nop_(); _nop_(); _nop_(); _nop_(); } } } bitlcd_bz() { bitresult; rs=0; rw=1; ep=1; _nop_(); _nop_(); _nop_(); _nop_(); result=(bit)(P0&0x80); ep=0; returnresult; } voidlcd_wcmd(unsignedcharcmd) { while(lcd_bz());//判断LCD是否忙碌 rs=0; rw=0; ep=0; _nop_(); _nop_(); P0=cmd; _nop_(); _nop_(); ep=1; _nop_(); _nop_(); ep=0; } voidlcd_pos(unsignedcharpos) { lcd_wcmd(pos|0x80); } voidlcd_wdat(unsignedchardat) { while(lcd_bz());//判断LCD是否忙碌 rs=1; rw=0; ep=0; P0=dat; _nop_(); _nop_(); ep=1; _nop_(); _nop_(); ep=0; } voidlcd_wshuzi(void) { lcd_pos(0x47); lcd_wdat(dis3[fensw]); lcd_pos(0x48); lcd_wdat(dis3[fengw]); lcd_pos(0x4A); lcd_wdat(dis3[miaosw]); lcd_pos(0x4B); lcd_wdat(dis3[miaogw]); } voidlcd_init()//LCD初始化 { lcd_wcmd(0x38); delay (1); lcd_wcmd(0x0c); delay (1); lcd_wcmd(0x06); delay (1); lcd_wcmd(0x01); delay (1); } voidkeyscan(void) { while(flag) { if(k1==0) { delay(10); if(k1==0) { fensw++; while(! k1); if(fensw==10) fensw=0; } } if(k2==0) { delay(10); if(k2==0) { fengw++; while(! k2); if(fengw==10) fengw=0; } } if(k3==0) { delay(10); if(k3==0) { miaosw++; while(! k3); if(miaosw==10) miaosw=0; } } if(k4==0) { delay(10); if(k4==0) {miaogw++; while(! k4); if(miaogw==10) miaogw=0; } } if(k5==0) flag=0; lcd_wshuzi(); } } voiddelay1s(void) { unsignedcharh,i,j,k; for(h=5;h>0;h--) for(i=4;i>0;i--) for(j=116;j>0;j--) for(k=214;k>0;k--); } voidmain(void) { unsignedcharj;unsignedchark,i; speaker=0; lcd_init();//初始化LCD delay(10); lcd_pos(0x02);//设置显示位置 j=0; while(dis1[j]! ='\0') { lcd_wdat(dis1[j]);//显示字符 j++; } while (1) { lcd_pos(0x42);//设置显示位置 i=0; while(dis2[i]! ='\0') { lcd_wdat(dis2[i]);//显示字符 i++;} keyscan(); num=fensw*600+fengw*60+miaosw*10+miaogw; while(num) { num--; fensw=num/60/10; fengw=num/60%10; miaosw=num%60/10; miaogw=num%60%10; delay1s(); lcd_wshuzi(); } TMOD=1;//置CT0定时工作方式1 EA=1; ET0=1;//IE=0x82//CPU开中断,CT0开中断 while (1) { i=0; while(i<100) {//音乐数组长度,唱完从头再来 k=sszymmh[i]+7*sszymmh[i+1]-1; timer0h=FREQH[k]; timer0l=FREQL[k]; time=sszymmh[i+2]; i=i+3; song(); } } } } 参考文献 [1]康华光,陈大钦.电子技术基础—模拟部分(第五版)[M].北京: 高等教育出版社,2005 [2]李珍.单片机原理与应用技术清华大学出版社,2003 [3]陈明荧.8051单片机课程设计实训教材清华大学出版社,2003 [4]苏家健、曹柏荣.单片机原理及应用技术[M].高等教育出版社 [5]焦春生.新型绿色能效D类音频放大器设计应用 [6]姜志海、赵艳雷、陈松.单片机的C语言程序设计与应用——基于Proteus仿真(第二版)电子工业出版社
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 单片机 LCD 显示 音乐 倒数 计数器 课程设计 解析