单片机课程设_八音盒_第1页
单片机课程设_八音盒_第2页
单片机课程设_八音盒_第3页
单片机课程设_八音盒_第4页
单片机课程设_八音盒_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、单片机原理及应用单片机原理及应用课程设计课程设计-八音盒设计八音盒设计-院 系: 机电汽车工程学院 姓 名: 周治安 班 级: 机 101-4 班 组 长: 臧贻德 组 员:李越昌 刘凯 周治安 王伟明 林春鹏指导教师: 姜风国 完成时间: 2013 年 6 月 5 日 单片机课程设计单片机课程设计 - 2 -目录目录一、课程设计任务书一、课程设计任务书.3二、设计项目简介二、设计项目简介.3 2.1 总体设计思路总体设计思路.3 2.2 音符产生方法音符产生方法 .3 2.3 节拍产生方法节拍产生方法 .4 2.4 核心器件简介核心器件简介 .5 2.5 任务分工任务分工 .7三三、系统功能

2、简介系统功能简介.8四、电路原理图四、电路原理图.84.1 硬件电路设计框图硬件电路设计框图.104.2 键盘控制电路键盘控制电路.104.3 LCD 显示电路显示电路114.4 晶振和复位电路晶振和复位电路.114.5 扬声器和闪烁电路扬声器和闪烁电路.124.6 播放和停止电路播放和停止电路.12五五、程序框图程序框图.8六六、程序清单程序清单.12七、总七、总结结.31参考文献:参考文献:.32单片机课程设计单片机课程设计 - 3 -摘要摘要近年来随着科技的飞速发展,单片机的应用正在不断地走向深入。当今,利用单片机控制音乐播放举不胜举,而利用单片机存储音乐,控制播放最为广泛,它具有功能多

3、、价格优、外围电路简单等特点,很受音乐爱好者和音乐芯片制造商的青睐。本设计主要是应用单片机的原理和控制理论来设计音乐播放器的硬件电路,并利用 C 语言进行软件程序设计。通过控制单片机内部的定时器产生不同频率的方波,驱动蜂鸣器发出不同音调的音乐,再利用延时来控制发音时间的长短。把乐谱转化成相应的定时常数就可以从发音设备中演奏出悦耳动听的音乐。最后利用编程软件 uVision3 和仿真软件 PROTEUS 对该音乐播放器进行仿真,完全实现所需功能。关键词关键词 单片机;矩阵键盘;蜂鸣器;LCD;八音盒 单片机课程设计单片机课程设计 - 4 -一、课程设计任务书一、课程设计任务书 本设计利用 89C

4、51 单片机结合内部定时器以及外接 LCD 和矩阵键盘设计了一个八音盒,按下单键可以演奏预先设置的歌曲旋律。本设计可以学习 89C51 定时器程序设计,按键扫描及歌曲旋律简单直觉式输入法的设计方法。其基本功能为:1、使用 LCD 显示器来显示目前演奏的歌曲编号;2、具有 16 个按键操作来选择演奏哪一首歌曲;3、内建 10 首歌曲旋律,按下单键可以演奏歌曲;4、演奏时可以按键中断。程序执行后工作指示 LED 闪动,表示程序开始执行,按下单键 09 便可以演奏歌曲,歌曲演奏中,可以按键中断。二、设计项目简介二、设计项目简介1、设计思路:、设计思路: 选用 ATMEL 公司 89C51 单片机,它

5、具有 16KB 的内部 ROM, 2 个定时器/计数器,2 个外部中断。 通过中断实现歌曲的播放和暂停。 通过定时实现 LED 闪烁和音乐频率的变化。 通过键盘实现歌曲的选择。 2、音符产生方法:、音符产生方法: 不同的音调有不同的频率。频率不同,音调也就不同。利用定时器,使其工作在模式 0,定时中断,然后控制 P3.7 引脚的输出每次取反,就可以在 P3.7 的引脚输出相应的方波频率。改变计数初值,就改变了频率。定时器的定时时间等于半个周期,定时时间到就输出脉冲取反,重复此过程,就可在 P3.7 引脚得到一音频的脉冲。如:C 调中音 1 的频率=523HZ,周期 T=1/523=1912us

6、;定时器的定时时间为:T/2=1912/2us=956us;则其计数初值为:TH0=(8192-C)/32;TL0=(8192-C)%32;下面是音符及其程序中对应的编码 音符音符编码 音符音符编码 音符音符编码低音 1 l_dao 中音 1 dao高音 1h_dao低音 2 l_re 中音Re高音 2h_re低音 3 l_mi 中音Mi高音 3h_mi单片机课程设计单片机课程设计 - 5 -低音 4 l_fa 中音Fa高音 4h_fa低音 5 l_sao 中音Sao高音 5h_sao低音 6 l_la 中音La高音 6h_la低音 7 l_xi 中音Xi高音 7h_xi3、节拍产生方法:、节

7、拍产生方法: 音乐中的节拍用延时时间产生。假设 1/4 拍执行一次延时程序, 1/2 拍就执行两次延时程序,所以只要求出 1/4 延时时间,其余的节拍就是他的倍数。为方便记谱,将节拍数也进行编码,如下:节拍节拍编码(基本延时次数)1/4 11/2 23/4 34/4 4建立曲谱编码表,例如:简谱编码:re,sao,mi,re,mi,sao,mi,re,dao,re,re,sao,re,mi,sao, mi,re,dao,l_la,dao,dao,mi,re,mi,l_sao,re,l_xi,l_la,l_sao,l_la,dao,re,l_xi,l_la,l_sao,l_mi,l_sao,0

8、xff节拍编码:4,4,2,2,4,2,2,2,2,8,4,4,4,2,2,单片机课程设计单片机课程设计 - 6 - 2,2,2,2,8,4,4,2,2,4,2,2,2,2,4,6,2,2,2,2,2,164、核心器件简介、核心器件简介(1)AT89C51 的性能介绍的性能介绍 AT89C51 是一种带 4K 字节闪烁可编程可擦除只读存储器,高性能 CMOS8 位微处理器,俗称单片机。该器件采用 ATMEL 高密度非易失存储器制造技术制造,与工业标准的 MCS-51 指令集和输出管脚相兼容。由于将多功能 8 位 CPU 和闪烁存储器组合在单个芯片中,ATMEL 的AT89C51 是一种高效微控

9、制器,为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。 它可以提供以下的功能标准: 1)4K 的字节闪烁存储器;2)128 字节随机存取数据存储器;3)32 个 I/O 口;4)2 个 16 位定时/计数器;5)1 个串行通信口;6)片内振荡器和时钟电路。(2)蜂鸣器)蜂鸣器蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中作发声器件。 蜂鸣器主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型。1) 压电式蜂鸣器 压电式蜂鸣器主要由多谐振荡器、压电蜂鸣片、阻抗匹配器及共鸣箱、外壳等组成。有的压电式蜂鸣器

10、外壳上还装有发光二极管。多谐振荡器由晶体管或集成电路构成。当接通电源后(1.515V 直流工作电压),多谐振荡器起振,输出 1.52.5kHZ 的音频信号,阻抗匹配器推动压电蜂鸣片发声。压电蜂鸣片由锆钛酸铅或铌镁酸铅压电陶瓷材料制成。在陶瓷片的两面镀上银电极,经极化和老化处理后,再与黄铜片或不锈钢片粘在一起。 2) 电磁式蜂鸣器 电磁式蜂鸣器由振荡器、电磁线圈、磁铁、振动膜片及外壳等组成。 (3)矩阵键盘)矩阵键盘单片机系统中,若使用按键的数量比较多时,通常选用用矩阵式键盘。矩阵式键由行线和列线构成,按键位于行、列线的交叉点上, 键盘矩阵是由四行四列构成,矩阵的四列和 P2 口的低四位相连,四

11、行与 P2 口的高四位相连。其键盘识别方法如下:单片机课程设计单片机课程设计 - 7 -1) 判断键盘中有无键按下 将全部行线置低电平,然后检测列线的状态。只要有一列的电平为低,则表示键盘中有键被按下,而且闭合的键位于低电平线与 4 根行线相交叉的 4 个按键之中。若所有列线均为高电平,则键盘中无键按下。2) 判断闭合键所在的位置 在确认有键按下后,即可进入确定具体闭合键的过程。其方法是:依次将行线置为低电平,即在置某根行线为低电平时,其它线为高电平。在确定某根行线位置为低电平后,再逐行检测各列线的电平状态。若某列为低,则该列线与置为低电平的行线交叉处的按键就是闭合的按键(4)LCD1602

12、液晶显示器简介液晶显示器简介 工业字符型液晶,能够同时显示 16X02 即 32 个字符。 (16 列 2 行)1602 液晶也叫 1602 字符型液晶,它是一种专门用来显示字母、数字、符号等的点阵型液晶模块。它由若干个 5X7 或者 5X11 等点阵字符位组成,每个点阵字符位都可以显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用。 1602LCD 是指显示的内容为 16X2,即可以显示两行,每行 16 个字符液晶模块(显示字符和数字) 。 基本内容如下:单片机课程设计单片机课程设计 - 8 - 5、任务分工、任务分工(1)系统总体设计及调试方面-臧贻德(

13、2)键盘扫描程序编辑方面-刘凯(3)LCD 显示程序编辑方面-臧贻德(4)中断程序及 protues 仿真调试方面-周治安(5)扬声器、二极管闪烁程序以及 protues 硬件电路设计 -王伟明(6)歌曲搜集整理、歌曲播放程序及文档编写-林春鹏、李越昌、刘凯三、系统功能简介三、系统功能简介1、此 80C51 八音盒有矩阵式键盘共十个按键,09 按键用于选择歌曲,通过 P2 口与单片机相连。2、LCD 通过用于显示,显示当前正在播放的歌曲编号。P0 口输出编号,P1.4、P1.5、P1.6用于控制 LCD。 3、有中断按键,在单片机播放旋律时可以按外部中断 1 键实现歌曲暂停,再按中断 T0 实

14、现歌曲暂停后的播放。 4、LED 灯连接在 P1.7 口,用 LED 灯闪烁指示单片机处于工作状态。 5、歌曲音调经 P3.7 口的喇叭播放出来。四、电路原理图四、电路原理图单片机课程设计单片机课程设计 - 9 -电路原理图设计结果如下:具体设计如下:单片机课程设计单片机课程设计 - 10 -4.1 硬件电路设计框图硬件电路设计框图键盘控制电路89C51单片机LCD 显示电路LED 闪烁电路扬声器电路4.2 键盘控制电路键盘控制电路 按键功能:按键功能:单片机课程设计单片机课程设计 - 11 -09 键:十首歌曲选择键,按下某个按键可播放对应的歌曲。键盘中断通过三输入与门引入外部中断 0。4.

15、3 LCD 显示电路显示电路用 P1.4P1.6 作为 LCD 的 RS、R/W、E 的控制信号用 P0.0-P0.7 作为 LCD 的 D0-D7 的控制信号4.4晶振和复位电路晶振和复位电路 XTAL1 和单片机课程设计单片机课程设计 - 12 -XTAL2 的两端用来连接石英晶体和外接电容,即用来连接片内 OSC 的定时反馈回路。石英起振后应能在 XTAL2 线上输入一个 3V 左右的正弦波,以便使片内的电路按石英晶振相同频率自激振荡。4.5扬声器和闪烁电路扬声器和闪烁电路闪烁电路通过闪烁电路通过 P1.7 口驱动口驱动 扬声器通过扬声器通过 P3.7 驱动驱动4.6 播放和停止电路播放

16、和停止电路播放中断通过 T0 中断引入单片机;暂停中断通过外部中断 1 引入单片机。五、程序框图五、程序框图单片机课程设计单片机课程设计 - 13 -主程序定时器 T1、T2 初始化外部中断 0、1 的初始化LCD 初始化键盘扫描While(1)无限循环键盘扫描Switch判断defaultCase:music开始单片机课程设计单片机课程设计 - 14 -全列置零,全行扫描开始结束判断是否有键按下全列置零,全行扫描去抖延时行赋值全列置零,全行扫描列赋值计算键值键盘扫描是否单片机课程设计单片机课程设计 - 15 -音符播放程序 开始LCD 清屏显示歌曲编号判断是否是标志位计数器赋初值启动定时器控

17、制节拍延时关闭定时器播放下一个音符结束否是单片机课程设计单片机课程设计 - 16 -六、程序清单六、程序清单: 1、主函数 main.c#include main.h#include data.c#include fun.c/* 函数功能:键盘扫描中断服务程序(外部中断 0)*/void int0()interrupt 0 BZ=0;keyscan(); /* 函数功能:歌曲播放与暂停中断服务程序(外部中断 1 和计数器 T0 中断)*/void int1()interrupt 2 uchar temp; while(!bz); k=1; TR0=0; while(k) temp=bf;if(

18、temp=0)delayms(5);temp=bf;if(temp=0) while(!bf);k=0;TR0=1;break; /* 函数功能:定时器 1 的中断服务程序*/void timer1()interrupt 3 单片机课程设计单片机课程设计 - 17 - LED=!LED; keyscan(); /* 函数功能:定时器 T0 的中断服务子程序,使 P3.7 引脚输出音频的方波*/ void Time0(void ) interrupt 1 using 1 sound=!sound; /将 P3.7 引脚输出电平取反,形成方波 TH0=(8192-C)/32; /可证明这是 13

19、位计数器 TH0 高 8 位的赋初值方法 TL0=(8192-C)%32; /可证明这是 13 位计数器 TL0 低 5 位的赋初值方法 /* 函数功能:主函数*/void main(void) initialT012(); /LED 灯、定时器 T1、T2 初始化 initial(); /外部中断 0 和 1 的初始化 LCD(); /LCD 初始化*/ while(1) BZ=1; switch(keynum) case 0 x00: music0();break; case 0 x01: music1();break;case 0 x02: music2();break;case 0 x

20、03: music3();break;case 0 x04: music4();break;case 0 x05: music5();break;case 0 x06: music6();break;case 0 x07: music7();break;case 0 x08: music8();break;case 0 x09: music9();break; default : break; 单片机课程设计单片机课程设计 - 18 -2、功能函数 fun.c 用于播放歌曲、LCD 以及中断初始化#include main.h#include fun.h#include data.h/* 函数

21、功能: 歌曲 0好人一生平安 */void music0(void) LCD(); WriteData(m);WriteData(u);WriteData(s);WriteData(i); WriteData(c);WriteData( );WriteData(0);WriteData(!);i=0; /从第 1 个音符 f0开始播放 while(f0i!=0 xff) /只要没有读到结束标志就继续播放 if(BZ=0) break; C=460830/f0i; TH0=(8192-C)/32; /可证明这是 13 位计数器 TH0 高 8 位的赋初值方法 TL0=(8192-C)%32; /

22、可证明这是 13 位计数器 TL0 低 5 位的赋初值方法 TR0=1; /启动定时器 T0 for(j=0;jJP0i;j+) /控制节拍数 delay(); /延时 1 个节拍单位 TR0=0; /关闭定时器 T0 i+; /播放下一个音符 /* 函数功能: 歌曲 1保卫黄河 */void music1(void) LCD(); WriteData(m);WriteData(u);WriteData(s);WriteData(i); WriteData(c);WriteData( );WriteData(1);WriteData(!);i=0; /从第 1 个音符 f0开始播放 while

23、(f1i!=0 xff) /只要没有读到结束标志就继续播放 if(BZ=0)break; C=460830/f1i; TH0=(8192-C)/32; /可证明这是 13 位计数器 TH0 高 8 位的赋初值方法 TL0=(8192-C)%32; /可证明这是 13 位计数器 TL0 低 5 位的赋初值方法 TR0=1; /启动定时器 T0for(j=0;jJP1i;j+) /控制节拍数单片机课程设计单片机课程设计 - 19 - delay(); /延时 1 个节拍单位TR0=0; /关闭定时器 T0 i+; /播放下一个音符 /* 函数功能: 歌曲 2毕业歌 */void music2()

24、LCD(); WriteData(m);WriteData(u);WriteData(s);WriteData(i); WriteData(c);WriteData( );WriteData(2);WriteData(!); i=0; /从第 1 个音符 f0开始播放 while(f2i!=0 xff) /只要没有读到结束标志就继续播放 if(BZ=0) break; C=460830/f2i; TH0=(8192-C)/32; /可证明这是 13 位计数器 TH0 高 8 位的赋初值方法 TL0=(8192-C)%32; /可证明这是 13 位计数器 TL0 低 5 位的赋初值方法 TR0=

25、1; /启动定时器 T0 for(j=0;jJP2i;j+) /控制节拍数 delay(); /延时 1 个节拍单位 TR0=0; /关闭定时器 T0 i+; /播放下一个音符 /* 函数功能: 歌曲 3沂蒙山小调 */void music3() LCD(); WriteData(m);WriteData(u);WriteData(s);WriteData(i); WriteData(c);WriteData( );WriteData(3);WriteData(!); i=0; /从第 1 个音符 f0开始播放 while(f3i!=0 xff) /只要没有读到结束标志就继续播放 if(BZ=

26、0)break; C=460830/f3i; TH0=(8192-C)/32; /可证明这是 13 位计数器 TH0 高 8 位的赋初值方法单片机课程设计单片机课程设计 - 20 - TL0=(8192-C)%32; /可证明这是 13 位计数器 TL0 低 5 位的赋初值方法 TR0=1; /启动定时器 T0 for(j=0;jJP3i;j+) /控制节拍数 delay(); /延时 1 个节拍单位 TR0=0; /关闭定时器 T0 i+; /播放下一个音符 /* 函数功能:歌曲 4 套马杆 */void music4() LCD(); WriteData(m);WriteData(u);W

27、riteData(s);WriteData(i); WriteData(c);WriteData( );WriteData(4);WriteData(!);i=0; /从第 1 个音符 f0开始播放 while(f4i!=0 xff) /只要没有读到结束标志就继续播放 if(BZ=0)break; C=460830/f4i; TH0=(8192-C)/32; /可证明这是 13 位计数器 TH0 高 8 位的赋初值方法 TL0=(8192-C)%32; /可证明这是 13 位计数器 TL0 低 5 位的赋初值方法 TR0=1; /启动定时器 T0 for(j=0;jJP4i;j+) /控制节拍

28、数 delay(); /延时 1 个节拍单位 TR0=0; /关闭定时器 T0 i+; /播放下一个音符 /* 函数功能:歌曲 5军港之夜 */void music5() LCD(); WriteData(m);WriteData(u);WriteData(s);WriteData(i); WriteData(c);WriteData( );WriteData(5);WriteData(!); i=0; /从第 1 个音符 f0开始播放 while(f5i!=0 xff) /只要没有读到结束标志就继续播放 if(BZ=0)break; C=460830/f5i; TH0=(8192-C)/32

29、; /可证明这是 13 位计数器 TH0 高 8 位的赋初值方法 TL0=(8192-C)%32; /可证明这是 13 位计数器 TL0 低 5 位的赋初值方法单片机课程设计单片机课程设计 - 21 - TR0=1; /启动定时器 T0for(j=0;jJP5i;j+) /控制节拍数 delay(); /延时 1 个节拍单位 TR0=0; /关闭定时器 T0 i+; /播放下一个音符 /* 函数功能:歌曲 6童年 */void music6() LCD(); WriteData(m);WriteData(u);WriteData(s);WriteData(i); WriteData(c);Wr

30、iteData( );WriteData(6);WriteData(!); i=0; /从第 1 个音符 f0开始播放 while(f6i!=0 xff) /只要没有读到结束标志就继续播放 if(BZ=0)break; C=460830/f6i; TH0=(8192-C)/32; /可证明这是 13 位计数器 TH0 高 8 位的赋初值方法 TL0=(8192-C)%32; /可证明这是 13 位计数器 TL0 低 5 位的赋初值方法 TR0=1; /启动定时器 T0for(j=0;jJP6i;j+) /控制节拍数 delay(); /延时 1 个节拍单位 TR0=0; /关闭定时器 T0 i

31、+; /播放下一个音符 /* 函数功能: 歌曲 7爱情买卖 */void music7() LCD(); WriteData(m);WriteData(u);WriteData(s);WriteData(i); WriteData(c);WriteData( );WriteData(7);WriteData(!); i=0; /从第 1 个音符 f0开始播放 while(f7i!=0 xff) /只要没有读到结束标志就继续播放 if(BZ=0)break; C=460830/f7i; TH0=(8192-C)/32; /可证明这是 13 位计数器 TH0 高 8 位的赋初值方法 TL0=(81

32、92-C)%32; /可证明这是 13 位计数器 TL0 低 5 位的赋初值方法 TR0=1; /启动定时器 T0单片机课程设计单片机课程设计 - 22 - for(j=0;jJP7i;j+) /控制节拍数 delay(); /延时 1 个节拍单位 TR0=0; /关闭定时器 T0 i+; /播放下一个音符 /* 函数功能: 歌曲 8荷塘月色 */void music8() LCD(); WriteData(m);WriteData(u);WriteData(s);WriteData(i); WriteData(c);WriteData( );WriteData(8);WriteData(!)

33、; i=0; /从第 1 个音符 f0开始播放 while(f8i!=0 xff) /只要没有读到结束标志就继续播放 if(BZ=0)break; C=460830/f8i; TH0=(8192-C)/32; /可证明这是 13 位计数器 TH0 高 8 位的赋初值方法 TL0=(8192-C)%32; /可证明这是 13 位计数器 TL0 低 5 位的赋初值方法 TR0=1; /启动定时器 T0 for(j=0;jJP8i;j+) /控制节拍数 delay(); /延时 1 个节拍单位 TR0=0; /关闭定时器 T0 i+; /播放下一个音符 /* 函数功能:歌曲 9 我们走在大路上 */

34、void music9() LCD(); WriteData(m);WriteData(u);WriteData(s);WriteData(i); WriteData(c);WriteData( );WriteData(9);WriteData(!); i=0; /从第 1 个音符 f0开始播放 while(f9i!=0 xff) /只要没有读到结束标志就继续播放 if(BZ=0)break; C=460830/f9i; TH0=(8192-C)/32; /可证明这是 13 位计数器 TH0 高 8 位的赋初值方法 TL0=(8192-C)%32; /可证明这是 13 位计数器 TL0 低 5

35、 位的赋初值方法 TR0=1; /启动定时器 T0 for(j=0;jJP9i;j+) /控制节拍数单片机课程设计单片机课程设计 - 23 - delay(); /延时 1 个节拍单位 TR0=0; /关闭定时器 T0 i+; /播放下一个音符 /* 函数功能:LCD 预处理函数*/void LCD(void) LcdInitiate(); /调用 LCD 初始化函数 WriteAddress(0 x04); /将显示地址指定为第 1 行第 5 列 /* 函数功能:键盘扫描程序(利用 P2 口,给 keynum 赋值)*/void keyscan() uchar lnum,rnum;/定行号和

36、列号 P2=0 x0F; /全列置零,全行扫描 if(P2&0 x0F)!=0 x0F) delayms(10); /消抖延时 if(P2&0 x0F)!=0 x0F) /*-以下确定行号-*/ if(P2=0 x07) lnum=3; if(P2=0 x0B) lnum=2; if(P2=0 x0D) lnum=1; if(P2=0 x0E) lnum=0; /*-以下确定列号-*/ P2=0 xF0; / 全行置零,全列扫描 if(P2&0 xF0)!=0 xF0) if(P2=0 xE0) rnum=0; if(P2=0 xD0) rnum=1; if(P2=0

37、xB0) rnum=2; if(P2=0 x70)单片机课程设计单片机课程设计 - 24 - rnum=3; keynum=lnum*4+rnum; /计算键值 switch(keynum) case 0 x0a: pause();break;case 0 x0b: play();break;default : break; /* 函数功能:外部中断初始化程序*/void initial() /*初始化外部中断 0*/ IT0=1; /外部中断为下降沿触发 EA=1; /打开中断总开关 EX0=1; /打开中断 0 开关 PX0=0; /中断 0 为低优先级 /*初始化外部中断 1*/ IT1

38、=1; /外部中断为下降沿触发 EX1=1; /打开中断 1 开关 PX1=1; /中断 1 为高优先级 /* 函数功能:定时器初始化程序*/void initialT012() TMOD=0 x10; TH0=0 x00; TL0=0 x00; PT1=0; ET1=1; TR1=1; ET0=1; /定时器 T0 中断允许 PT0=1; /* 函数功能:判断液晶模块的忙碌状态 返回值:result。result=1,忙碌;result=0,不忙单片机课程设计单片机课程设计 - 25 -*/ uchar BusyTest(void) bit result;RS=0; /根据规定,RS 为低电

39、平,RW 为高电平时,可以读状态 RW=1; E=1; /E=1,才允许读写 _nop_(); /空操作 _nop_(); _nop_(); _nop_(); /空操作四个机器周期,给硬件反应时间 result=BF; /将忙碌标志电平赋给 resultE=0; return result; /* 函数功能:将模式设置指令或显示地址写入液晶模块 入口参数:dictate*/void WriteInstruction (uchar dictate) while(BusyTest()=1); /如果忙就等待 RS=0; /根据规定,RS 和 R/W 同时为低电平时,可以写入指令 RW=0; E=0

40、; /E 置低电平(根据表 8-6,写指令时,E 为高脉冲, / 就是让 E 从 0 到 1 发生正跳变,所以应先置0 _nop_(); _nop_(); /空操作两个机器周期,给硬件反应时间 P0=dictate; /将数据送入 P0 口,即写入指令或地址 _nop_(); _nop_(); _nop_(); _nop_(); /空操作四个机器周期,给硬件反应时间 E=1; /E 置高电平 _nop_(); _nop_(); _nop_(); _nop_(); /空操作四个机器周期,给硬件反应时间 E=0; /当 E 由高电平跳变成低电平时,液晶模块开始执行命令 /* 函数功能:指定字符显示

41、的实际地址 入口参数:x*/单片机课程设计单片机课程设计 - 26 - void WriteAddress(uchar x) WriteInstruction(x|0 x80); /显示位置的确定方法规定为80H+地址码 x /* 函数功能:将数据(字符的标准 ASCII 码)写入液晶模块 入口参数:y(为字符常量)*/ void WriteData(uchar y) while(BusyTest()=1); RS=1; /RS 为高电平,RW 为低电平时,可以写入数据 RW=0; E=0; /E 置低电平(根据表 8-6,写指令时,E 为高脉冲, / 就是让 E 从 0 到 1 发生正跳变,

42、所以应先置0 P0=y; /将数据送入 P0 口,即将数据写入液晶模块 _nop_(); _nop_(); _nop_(); _nop_(); /空操作四个机器周期,给硬件反应时间 E=1; /E 置高电平 _nop_(); _nop_(); _nop_(); _nop_(); /空操作四个机器周期,给硬件反应时间 E=0; /当 E 由高电平跳变成低电平时,液晶模块开始执行命令 /*函数功能:对 LCD 的显示模式进行初始化设置*/void LcdInitiate(void) delayms(15); /延时 15ms,首次写指令时应给 LCD 一段较长的反应时间 WriteInstruct

43、ion(0 x38); /显示模式设置:162 显示,57 点阵,8 位数据接口delayms(5); /延时 5msWriteInstruction(0 x38);delayms(5);WriteInstruction(0 x38);delayms(5);WriteInstruction(0 x0f); /显示模式设置:显示开,有光标,光标闪烁delayms(5);WriteInstruction(0 x06); /显示模式设置:光标右移,字符不移delayms(5);WriteInstruction(0 x01); /清屏幕指令,将以前的显示内容清除单片机课程设计单片机课程设计 - 27

44、-delayms(5); /* 函数功能:ms 级延时程序*/ void delayms(uchar x) uchar l; while(x-)!=0) for(l=0;l125;l+);/* 函数功能:1 个延时单位,延时 200ms*/void delay() unsigned char a,b; for(a=0;a250;a+) for(b=0;b250;b+); 3、数据函数(存放歌曲频率和节拍)data.c #include main.h#include fun.h#include data.h /以下是歌曲 0好人一生平安的一段简谱unsigned int code f0= re,

45、mi,re,dao,l_la,dao,l_la, /每行对应一小节音符 l_sao,l_mi,l_sao,l_la,dao, l_la,dao,sao,la,mi,sao, re, mi,re,mi,sao,mi, l_sao,l_mi,l_sao,l_la,dao, l_la,l_la,dao,l_la,l_sao,l_re,l_mi, l_sao, re,re,sao,la,sao, fa,mi,sao,mi, la,sao,mi,re,mi,l_la,dao, re, mi,re,mi,sao,mi, l_sao,l_mi,l_sao,l_la,dao,单片机课程设计单片机课程设计 -

46、28 - l_la,dao,re,l_la,dao,re,mi, re, l_la,dao,re,l_la,dao,re,mi, re,0 xff; /以 0 xff 作为音符的结束标志 /以下是简谱中每个音符的节拍 /4对应 4 个延时单位,2对应 2 个延时单位,1对应 1 个延时单位 unsigned char code JP0 = 4,1,1,4,1,1,2, 2,2,2,2,8, 4,2,3,1,2,2, 10, 4,2,2,4,4, 2,2,2,2,4, 2,2,2,2,2,2,2, 10, 4,4,4,2,2, 4,2,4,4, 4,2,2,2,2,2,2, 10, 4,2,2,

47、4,4, 2,2,2,2,6, 4,2,2,4,1,1,4, 10, 4,2,2,4,1,1,4, 10; /以下是 歌曲 1保卫黄河 的一段简谱unsigned int code f1= h_dao,h_dao,mi,sao,/每行对应一小节音符 h_dao,h_dao,mi,sao,mi,mi,sao,h_dao,h_dao,la,la,fa,h_re,h_re,sao,la,sao,fa,mi,re,mi,dao,sao,la,sao,fa,mi,re,mi,dao,sao,la,h_dao,mi,sao,h_mi,h_re,h_dao,sao,la,mi,sao,la,h_dao,mi

48、,sao,h_mi,h_re,h_dao, sao,la,h_dao,sao,mi,sao,la,sao,h_dao,h_dao,dao,sao,mi,sao,la,sao,h_re,h_re,dao,sao,la,h_dao,h_dao,单片机课程设计单片机课程设计 - 29 -sao,la,h_re,h_re,sao,la,h_mi,h_mi,sao,la,h_mi,h_re,h_dao,dao,0 xff; /以 0 xff 作为音符的结束标志 /以下是简谱中每个音符的节拍 /4对应 4 个延时单位,2对应 2 个延时单位,1对应 1 个延时单位 unsigned char code J

49、P1 = 4,2,2,8, 4,2,2,8,2,4,2,4,4, 2,4,2,4,4,3,1,2,2,2,2,2,2,3,1,2,2,2,2,2,2,6,2,4,4,3,2,2,2,6,2,8,6,2,4,4,3,2,2,2,6,2,8,2,1,1,2,2,2,2,4,2,1,1,2,2,2,2,4, 3,1,2,2,3,1,2,2,3,1,2,2,3,1,3,1,4,8;/以下是歌曲 2毕业歌的一段简谱unsigned int code f2= h_dao,h_dao,dao,h_dao,la,sao,mi,sao,dao,mi,re,dao,dao,dao,re,mi,fa,sao,la,

50、h_dao,dao,mi,mi,sao,h_dao,dao,mi,fa,sao,la,sao,la,sao,mi,dao,mi,re,re,dao,dao,re,mi,sao,mi,re,mi,re,dao,mi,re,dao,dao,mi,fa,sao,sao,sao,la,xi,h_dao,h_dao,dao,h_re,h_re,h_dao,h_la,xi,la,sao,sao,dao,re,mi,mi,mi,sao,la,mi,re,re,dao,re,re,dao,0 xff ; /以 0 xff 作为音符的结束标志 /以下是简谱中每个音符的节拍 /4对应 4 个延时单位,2对应 2

51、个延时单位,1对应 1 个延时单位 unsigned char code JP2 = 2,2,4,2,4,2,3,1,2,2,8,6,2,3,1,2,2,单片机课程设计单片机课程设计 - 30 -4,4,4,2,1,1,4,4,3,1,2,2,2,4,2,2,4,2,8,4,2,1,1,2,4,2,2,4,2,6,2,8,6,2,3,1,2,2,2,6,2,4,2,2,2,4,2,2,4,2,4,4,3,1,2,2,2,2,4,2,4,2,2,2,4,2; /以下是歌曲 3沂蒙山小调的一段简谱 unsigned int code f3= re,sao,mi,re,mi,sao,mi,re,da

52、o,re,re,sao,re,mi,sao, mi,re,dao,l_la,dao,dao,mi,re,mi,l_sao,re,l_xi,l_la,l_sao,l_la, dao,re,l_xi,l_la,l_sao,l_mi,l_sao,0 xff;/以 0 xff 作为音符的结束标志 /以下是简谱中每个音符的节拍 /4对应 4 个延时单位,2对应 2 个延时单位,1对应 1 个延时单位unsigned char code JP3 = 4,4,2,2,4,2,2,2,2,8,4,4,4,2,2, 2,2,2,2,8,4,4,2,2,4,2,2,2,2,4, 6,2,2,2,2,2,16;/以

53、下是歌曲 4套马杆的一段简谱 unsigned int code f4= dao,dao,dao,l_la,dao,re,mi,sao,la,sao,mi,re,mi, mi,la,la,h_dao,h_dao,la,sao,mi,mi,mi,sao,re,sao,la,sao,mi,l_la,l_la, dao,dao,re,re,mi,re,re,re,mi,l_sao,l_la, l_la,l_la,l_la,dao,re,mi,sao,mi,re,re,l_sao,l_xi,l_la, dao,dao,dao,l_la,dao,re,mi,sao,la,sao,mi,re,mi, mi

54、,la,la,h_dao,h_dao,la,sao,mi,mi,mi,sao,re,sao,la,sao,mi,l_la,l_la, dao,dao,re,re,mi,re,re,re,mi,l_sao,mi, re,re,re,mi,sao,re,re,re,la,sao,mi,0 xff; /以 0 xff 作为音符的结束标志 /以下是简谱中每个音符的节拍 /4对应 4 个延时单位,2对应 2 个延时单位,1对应 1 个延时单位 unsigned char code JP4 = 2,2,2,2,2,2,2,2,2,2,2,2,8,2,2,2,2,2,1,1,2,1,1,2,2,2,1,1,

55、6,1,1,2,2,2,1,1,10,2,2,2,2,8,2,2,2,2,2,2,2,2,2,2,2,2,8, 2,2,2,2,2,2,2,2,2,2,2,2,8,2,2,2,2,2,1,1,2,1,1,2,2,2,1,1,6,1,1,2,2,2,1,1,10,2,2,2,2,8,2,2,2,2,4,4,2,2,2,2,8; /以下是歌曲 5军港之夜的一段简谱unsigned int code f5= mi,sao,mi,sao,mi,dao,dao,mi,mi,sao,mi,sao,sao,mi,单片机课程设计单片机课程设计 - 31 - mi,re,mi,re,l_xi,l_la,l_xi

56、,l_la,l_sao,dao, l_sao,mi,mi,dao,re,mi,re,mi,mi,l_la,l_sao,dao,mi,sao,sao,mi,sao,sao,mi,mi,mi,re,dao,re, mi,l_xi,l_sao,l_la,l_xi,l_la,dao,l_xi,mi,mi,l_xi,l_la,l_xi,l_la,l_xi,mi,mi,l_xi,l_xi,l_la,l_xi,l_la, re,l_la,dao,l_xi,l_la,mi,sao,sao,mi,la,sao,la,sao,mi,sao,mi,dao,mi,mi,mi,sao,mi,sao,sao,mi, mi

57、,re,mi,re,l_xi,l_la,l_xi,l_la,l_sao,mi,mi,sao,sao,mi,la,sao,la,sao,mi,sao,mi,dao,mi,mi,sao, mi,sao,sao,mi,mi,mi,re,mi,re,l_xi,l_la,l_xi,l_la,l_sao,dao,mi,sao,sao,mi,mi,re,mi,re,xi,l_la,l_sao,0 xff; /以 0 xff 作为音符的结束标志 /以下是简谱中每个音符的节拍 /4对应 4 个延时单位,2对应 2 个延时单位,1对应 1 个延时单位 unsigned char code JP5 = 2,6,2,

58、6,2,2,2,2,2,6,2,2,2,2,2,1,1,4,2,1,1,2,2,8, 2,2,2,2,1,1,4,2,4,2,2,8,2,2,2,2,4,2,4,4,1,1,2,8, 4,2,2,1,1,4,2,2,2,2,2,1,1,6,2,2,2,2,2,1,1,4, 2,1,1,2,2,8,2,2,2,2,2,1,1,4,1,2,1,2,1,1,2,6,2,2,2,2, 2,1,1,4,2,1,1,2,2,8,2,2,2,2,2,1,1,4,1,2,1,2,2,2,6, 2,2,2,1,1,2,1,1,4,2,1,1,2,2,8,2,2,2,2,2,1,1,4,4,2,2; /以下是歌曲

59、 6童年的一段简谱unsigned int code f6= h_mi,h_mi,h_mi,h_mi,h_re,h_re,h_dao,h_dao,h_dao,h_re,h_dao, la,sao,sao,sao,sao,la,sao,h_re,h_mi,h_dao,h_dao,mi,sao,sao,sao,mi, la,la,xi,la,dao,la,la,sao,h_dao,h_dao,h_dao,h_dao,la,h_dao,la,sao,sao,mi,sao,sao,sao,mi,la,la,xi,la,dao,la,la,sao, h_dao,h_dao,h_dao,h_dao,la,

60、la,h_dao,h_re,h_re,h_sao,h_sao,h_sao,h_sao,h_sao,h_sao,h_mi,h_re,h_dao,h_dao,la,la,la,h_dao,la,h_dao, h_re,h_re,h_re,h_dao,h_re,h_dao,h_mi,h_re,h_re,h_re,h_mi,h_mi,h_mi,h_mi,h_re,h_re,h_dao,h_dao,h_dao,h_re,h_dao,la,sao,sao,sao,dao,sao,0 xff; /以 0 xff 作为音符的结束标志 /以下是简谱中每个音符的节拍 /4对应 4 个延时单位,2对应 2 个延时单位,1对应 1 个延时

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论