基于单片机最小系统的彩屏显示及音乐播放.docx
《基于单片机最小系统的彩屏显示及音乐播放.docx》由会员分享,可在线阅读,更多相关《基于单片机最小系统的彩屏显示及音乐播放.docx(53页珍藏版)》请在冰豆网上搜索。
基于单片机最小系统的彩屏显示及音乐播放
目录
目录1
1设计任务书2
1.1基本设计要求2
1.2选作项目2
2设计阐明2
2.1设计内容2
2.2设计要求2
2.3设备及工作环境3
3系统方案整体设计3
3.1设计思路或设计方案论证3
3.2系统整体框图4
4硬件设计4
4.1系统硬件设计4
4.1.1最小单片机系统4
4.1.2彩屏显示电路5
4.1.3蜂鸣器发声电路6
4.2系统工作原理论述7
5软件设计8
5.1分析论证8
5.1.1彩屏显示模块8
5.1.2蜂鸣器模块8
5.1.5整体功效8
5.2程序流程图8
5.3程序清单9
6调试过程及分析32
7设计总结35
参考文献36
1设计任务书
1.1基本设计要求
(1)设计一最小系统,该系统能够实现串口下载。
(2)设计一彩屏驱动电路,将电路与最小系统连接起来驱动彩屏显示。
(3)设计一蜂鸣器驱动电路,将其与最小系统连接起来,驱动蜂鸣器。
(4)编写软件,使彩屏显示汉字、数字、英文、符号等。
(5)编写软件,使蜂鸣器播放音乐,播放音乐的同时彩屏显示歌曲名称等信息。
1.2选作项目
1、在彩屏上显示歌词。
2、在彩屏上显示图片等。
3、设计几个键,控制歌曲切换。
2设计阐明
2.1设计内容
在单片机最小系统基础上,设计外围电路,实现彩屏显示及音乐播放,彩屏启动时显示汉字、数字、字母、字符等相关信息,播放音乐的同时显示音乐相关信息。
设计中包含的内容:
单片机最小系统(含串口下载)
彩屏驱动
蜂鸣器音乐播放
2.2设计要求
(1)设计一最小系统,该系统能够实现串口下载。
(2)设计一彩屏驱动电路,将电路与最小系统连接起来驱动彩屏显示。
(3)设计一蜂鸣器驱动电路,将其与最小系统连接起来,驱动蜂鸣器。
(4)编写软件,使彩屏显示汉字、数字、英文、符号等。
(5)编写软件,使蜂鸣器播放音乐,播放音乐的同时彩屏显示歌曲名称等信息。
(6)上机调试程序。
(7)写出设计报告。
2.3设备及工作环境
(1)硬件:
计算机一台、单片机开发板一块、USB下载线一根。
(2)软件:
Windows操纵系统、KeilC51软件、取模软件。
3系统方案整体设计
3.1设计思路或设计方案论证
该系统包含单片机最小系统,彩屏驱动电路,蜂鸣器驱动电路三部分。
用单片机最小系统驱动彩屏,在编程的基础上可以显示各种字符,如汉字、数字、符号、英文等。
启动彩屏后,先使用程序清屏,然后再显示要显示的字符。
通过软件,可以改变字符的大小、颜色以及背景颜色。
电信号不同频率对应不同的音色,也就是“duolemifasuolaxi”,电信号的长短对应音长,所以通过软件编程即可实现一首音乐的播放。
3.2系统整体框图
图1系统整体框图
4硬件设计
4.1系统硬件设计
4.1.1最小单片机系统
电路图:
图2最小系统
工作原理:
最小系统由单片机、复位电路、时钟电路、串口下载电路组成。
时钟电路:
用于产生单片机工作时所需的控制信号。
复位电路:
复位是单片机的初始化操作,只需给单片机的复位引脚RST加上大于2个机器周期的高电平就可复位。
串口下载电路:
使用的是RS-232标准串行接口,下载时通过USB串口线到串口,再通过P3.0、P3.1给单片机编程。
4.1.2彩屏显示电路
电路图:
图3彩屏电路
工作原理:
彩屏部分已经集成了各种驱动芯片,彩屏作为一个整体,引出18个引脚.其各引脚功能如上,有8(DB0-DB7)位数据线,分别接接单片机P0.0-P0.7,实现数据传递;另外还有5个控制引脚,用于对彩屏的控制。
4.1.3蜂鸣器发声电路
电路图:
图4蜂鸣器电路
工作原理:
蜂鸣器一端接高电平,电流经驱动电路(R2-NPN)增大,驱动蜂鸣器发声。
4.2系统工作原理论述
整体电路图:
图5整体电路图
工作原理:
单片机通过与彩屏电路连接,通过编程控制彩屏显示,可以显示色彩和文字
先初始化彩屏,再清屏,就可以在屏幕上输入一行一行的字符,不过汉字要自己建字模库才能显示,直接写是现不出来的。
现完字符等待几秒,再清屏,再通过单片机控制彩屏显示《世上只有妈妈好》歌曲;接下来,通过控制蜂鸣器,输了电压,是其播放该歌曲。
5软件设计
5.1分析论证
本系统采用了单片机最小系统,彩屏及电路驱动,蜂鸣器及其驱动电路,只要编写相关显示程序,就可在彩屏上显示字符。
编写程序控制送给蜂鸣器端的电流的波形,就可使蜂鸣器发出有规律的声响,如音乐。
5.1.1彩屏显示模块
该模块主要功能是显示循环字符,并且要和歌曲同步。
通过单片机控制彩屏是彩屏显示字符及其颜色,用延时程序是显示文字暂时显示几秒钟,然后用清屏程序清屏,再显示歌曲名字,同时播放歌曲,使用循环使其循环显示。
5.1.2蜂鸣器模块
蜂鸣器模块主要功能是播放歌曲,并且实现同步。
通过编写音乐程序控制蜂鸣器端电平,控制器频率和时长即可实现音乐播放。
5.1.5整体功效
启动彩屏,清屏,一行一行显示要显示的字符,暂停几秒钟,再次清屏,显示《世上只有妈妈好》,同时播放该歌曲,无限循环前面过程。
5.2程序流程图
图2程序流程图
5.3程序清单
#include"reg52.h"
#defineWINDOW_XADDR_START0x0050//HorizontalStartAddressSet
#defineWINDOW_XADDR_END0x0051//HorizontalEndAddressSet
#defineWINDOW_YADDR_START0x0052//VerticalStartAddressSet
#defineWINDOW_YADDR_END0x0053//VerticalEndAddressSet
#defineGRAM_XADDR0x0020//GRAMHorizontalAddressSet
#defineGRAM_YADDR0x0021//GRAMVerticalAddressSet
#defineGRAMWR0x0022//memorywrite
/*LCDcolor*/
#defineWhite0xFFFF
#defineBlack0x0000
#defineBlue0x001F
#defineBlue20x051F
#defineRed0xF800
#defineMagenta0xF81F
#defineGreen0x07E0
#defineCyan0x7FFF
#defineYellow0xFFE0
sbitCS=P2^2;//片选
sbitRES=P2^1;//复位
sbitRS=P2^4;//数据/命令选择
sbitRW=P2^5;
sbitSPK=P1^2;//定义音乐输出端口
//数据口使用P0
/*---------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------/*
unsignedcharTimer0_H,Timer0_L,Time;
//世上只有妈妈好数据表
codeunsignedcharMUSIC[]={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,45,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,
};
/*------------------------------------------------------------------------------------------------
函数定义
--------------------------------------------------------------------------------------------------/*
voidmain(void);
voidILI9325_Initial(void);
voidshow_colour_bar(void);
voidWrite_Cmd_Data(unsignedcharx,unsignedinty);
voidWrite_Cmd(unsignedcharDH,unsignedcharDL);
voidWrite_Data(unsignedcharDH,unsignedcharDL);
voiddelayms(unsignedinttt);
voidshow_photo(void);
voidShow_RGB(unsignedintx0,unsignedintx1,unsignedinty0,unsignedinty1,unsignedintColor);
unsignedcharcodepic[];
voidWrite_Data_U16(unsignedinty);
staticvoidLCD_SetPos(unsignedintx0,unsignedintx1,unsignedinty0,unsignedinty1);
voidClearScreen(unsignedintbColor);
voidLCD_PutChar8x16(unsignedshortx,unsignedshorty,charc,unsignedintfColor,unsignedintbColor);
voidLCD_PutChar(unsignedshortx,unsignedshorty,charc,unsignedintfColor,unsignedintbColor);
voidLCD_PutString(unsignedshortx,unsignedshorty,char*s,unsignedintfColor,unsignedintbColor);
voidLCD_PutChar8x8(unsignedshortx,unsignedshorty,charc,unsignedintfColor,unsignedintbColor);
voidPutGB1616(unsignedshortx,unsignedshorty,unsignedcharc[2],unsignedintfColor,unsignedintbColor);
voidPutGB3232(unsignedshortx,unsignedshorty,unsignedcharc[2],unsignedintfColor,unsignedintbColor);
voidDelayUs2x(unsignedchart);
voidDelayMss(unsignedchart);
voiddelay(unsignedchart);
voidSong();
voidsongmain(void);
/*------------------------------------------------------------------------------------------------
主函数
-----------------------------------------------------------------------------------------------------/*
voidmain(void)
{
CS=1;
delayms(5);
RES=0;
delayms(5);
RES=1;
delayms(5);
ILI9325_Initial();
while
(1)
{
ClearScreen(Blue);//清屏
//show_colour_bar();
LCD_PutString(0,20,"单片机课程设计",White,Red);///前景颜色和背景颜色,可以直接预定义,也可以直接填入16进制数字
LCD_PutString(0,40,"MCUDesign",Black,Blue);
LCD_PutString(0,80,"基于单片机最小系统的彩屏显示",Magenta,Blue);
LCD_PutString(0,100,"音乐播放",Magenta,Blue);
LCD_PutString(0,120,"成员:
",Blue2,Blue);
LCD_PutString(0,140,"李建雄于大山柏欢胡文化",Blue2,Blue);
LCD_PutString(0,160,"信工081316寝室",Red,Blue);
LCD_PutString(0,180,"Notthefirst,buttheonlyone",Green,Blue);
LCD_PutString(0,200,"指导老师:
周华茂",Cyan,Blue);
LCD_PutString(0,220,"2011/6/10",Yellow,Blue);
PutGB3232(0,240,"我",White,Blue);//写入32x32汉字
PutGB3232(32,240,"爱",White,Blue);
PutGB3232(64,240,"单",White,Blue);
PutGB3232(96,240,"片",White,Blue);
PutGB3232(128,240,"机",White,Blue);
//show_photo();
delayms(2000);
ClearScreen(Blue);
LCD_PutString(0,20,"歌曲:
《世上只有妈妈好》",Yellow,Blue);
songmain();
}
}
/*------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------/*
voidClearScreen(unsignedintbColor)
{
unsignedinti,j;
LCD_SetPos(0,240,0,320);//320x240
for(i=0;i<320;i++)
{
for(j=0;j<240;j++)
Write_Data_U16(bColor);
}
}
/*------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------/*
#include"8X16.h"
voidLCD_PutChar8x16(unsignedshortx,unsignedshorty,charc,unsignedintfColor,unsignedintbColor)
{
unsignedinti,j;
LCD_SetPos(x,x+8-1,y,y+16-1);
for(i=0;i<16;i++){
unsignedcharm=Font8x16[c*16+i];
for(j=0;j<8;j++){
if((m&0x80)==0x80){
Write_Data_U16(fColor);
}
else{
Write_Data_U16(bColor);
}
m<<=1;
}
}
}
/*------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------/*
voidLCD_PutChar(unsignedshortx,unsignedshorty,charc,unsignedintfColor,unsignedintbColor)
{
LCD_PutChar8x16(x,y,c,fColor,bColor);
}
/*------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------/*
#include"GB1616.h"//16*16汉字字模
voidPutGB1616(unsignedshortx,unsignedshorty,unsignedcharc[2],unsignedintfColor,unsignedintbColor)
{
unsignedinti,j,k;
LCD_SetPos(x,x+16-1,y,y+16-1);
for(k=0;k<64;k++){//64标示自建汉字库中的个数,循环查询内码
if((codeGB_16[k].Index[0]==c[0])&&(codeGB_16[k].Index[1]==c[1])){
for(i=0;i<32;i++){
unsignedshortm=codeGB_16[k].Msk[i];
for(j=0;j<8;j++){
if((m&0x80)==0x80){
Write_Data_U16(fColor);
}
else{
Write_Data_U16(bColor);
}
m<<=1;
}
}
}
}
}
/*------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------/*
#include"GB3232.h"//32*32汉字字模
voidPutGB3232(unsignedshortx,unsignedshorty,unsignedcharc[2],unsignedintfColor,unsignedintbColor)
{unsignedinti,j,k;
LCD_SetPos(x,x+32-1,y,y+32-1);
for(k=0;k<5;k++){//5标示自建汉字库中的个数,循环查询内码
if((codeGB_32[k].Index[0]==c[0])&&(codeGB_32[k].Index[1]==c[1])){
for(i=0;i<128;i++){
unsignedshortm=codeGB_32[k].Msk[i];
for(j=0;j<8;j++){
if((m&0x80)==0x80){
Write_Data_U16(fColor);
}
else{
Write_Data_U16(bColor);
}
m<<=1;
}
}
}
}
}
/*------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------/*