19 基于51单片机的倒计时音乐播放系统设计
目录
一、主要功能
二、硬件资源
三、程序编程
四、实现现象
一、主要功能
五个按键,分别为启动按键,则LCD1602显示倒计时,音乐播放
设置按键,可以设置倒计时的分秒,然后加减按键,还有最后一个暂停音乐按键。
二、硬件资源
基于KEIL5编写C++代码,PROTEUS8.15进行仿真,全部资源在页尾,提供安装包。
三、程序编程
#include <reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义#include "intrins.h" #define u8 unsigned char#define u16 unsigned int#define uchar unsigned char#define uint unsigned int
//温度值全局变量int fen=3,miao=0,tt,flag,flag1; //用于读取ADC数据unsigned char timer0h,timer0l,time;//timer0h,timer0l为定时器T0的高低位初值,time为对应的节拍时间unsigned int num;signed int fre; //对应频率数据表的地址static int gqbf=0;void delay(unsigned char t); //延时子函数,控制发音的时间长度void delayms(unsigned int t); //普通延时子程序,可用于按键消抖void song(void); //演奏一个音符void music_play(void); //播放歌曲//管脚声明 sbit speaker =P2^0; //蜂鸣器sbit key1 =P1^0;
sbit key2 =P1^1;
sbit key3 =P1^2;
sbit key4 =P1^3;
sbit key5 =P1^4;
sbit led =P3^0;/********************************************************************
* 名称 : delay_1ms()
* 功能 : 延时1ms函数
* 输入 : q
* 输出 : 无
***********************************************************************/void delay_ms(uint q){
uint i,j; for(i=0;i<q;i++) for(j=0;j<110;j++);
}/***********************************************************************************************************
LCD1602相关函数
***********************************************************************************************************///LCD管脚声明 (RW引脚实物直接接地,因为本设计只用到液晶的写操作,RW引脚一直是低电平)sbit LCDRS = P2^7;
sbit LCDEN = P2^6;
sbit D0 = P0^0;
sbit D1 = P0^1;
sbit D2 = P0^2;
sbit D3 = P0^3;
sbit D4 = P0^4;
sbit D5 = P0^5;
sbit D6 = P0^6;
sbit D7 = P0^7;
//《烟花易冷》unsigned char code song1\[\]={ 5,2,1, 3,2,1, 2,2,2, 2,2,4, 3,2,1, 1,2,1, 2,2,1, 3,2,4,
5,2,1, 3,2,1, 2,2,2, 2,2,2, 5,1,1, 3,2,1, 4,2,1, 3,2,4,
3,2,1, 3,2,1, 7,2,1, 3,2,1, 2,2,2, 1,2,1, 7,1,1, 1,2,1,
2,2,1, 3,2,1, 6,2,3, 6,1,1, 1,2,1, 3,2,1, 2,2,1, 6,1,1,
1,2,1, 7,1,1, 5,1,1, 6,1,6, 5,2,1, 3,2,1, 2,2,2, 2,2,1,
2,2,1, 3,2,1, 1,2,1, 2,2,1, 3,2,4, 5,2,1, 3,2,1, 2,2,2,
2,2,1, 2,2,1, 5,1,1, 3,2,1, 4,2,1, 3,2,4, 3,2,1, 3,2,1,
7,2,3, 3,2,1, 2,2,2, 1,2,1, 7,1,1, 1,2,1, 2,2,1, 3,2,1,
6,2,3, 6,1,1, 1,2,1, 3,2,1, 2,2,1, 6,1,1, 1,2,1, 7,1,2,
5,1,2, 6,1,6, 0,0,0 };unsigned char code FREQH\[\]={ 0xF2, 0xF3, 0xF5, 0xF5, 0xF6, 0xF7, 0xF8, //低音1234567
0xF9, 0xF9, 0xFA, 0xFA, 0xFB, 0xFB, 0xFC, 0xFC,//1,2,3,4,5,6,7,i
0xFC, 0xFD, 0xFD, 0xFD, 0xFD, 0xFE, //高音 234567
0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFF}; //超高音 1234567// 频率-半周期数据表 低八位unsigned char code FREQL\[\]={ 0x42, 0xC1, 0x17, 0xB6, 0xD0, 0xD1, 0xB6, //低音1234567
0x21, 0xE1, 0x8C, 0xD8, 0x68, 0xE9, 0x5B, 0x8F, //1,2,3,4,5,6,7,i
0xEE, 0x44, 0x6B, 0xB4, 0xF4, 0x2D, //高音 234567
0x47, 0x77, 0xA2, 0xB6, 0xDA, 0xFA, 0x16}; //超高音 1234567 //LCD延时void LCDdelay(uint z) //该延时大约100us(不精确,液晶操作的延时不要求很精确){
uint x,y; for(x=z;x>0;x--) for(y=10;y>0;y--);
}void LCD_WriteData(u8 dat) { if(dat&0x01)D0=1;else D0=0; if(dat&0x02)D1=1;else D1=0; if(dat&0x04)D2=1;else D2=0; if(dat&0x08)D3=1;else D3=0; if(dat&0x10)D4=1;else D4=0; if(dat&0x20)D5=1;else D5=0; if(dat&0x40)D6=1;else D6=0; if(dat&0x80)D7=1;else D7=0;
}//写命令void write_com(uchar com){
LCDRS=0;
LCD_WriteData(com);// DAT=com;
LCDdelay(5);
LCDEN=1; LCDdelay(5);
LCDEN=0;
}//写数据void write_data(uchar date){
LCDRS=1; LCD_WriteData(date);// DAT=date;
LCDdelay(5);
LCDEN=1; LCDdelay(5);
LCDEN=0;
}/*------------------------------------------------
选择写入位置
------------------------------------------------*/void SelectPosition(unsigned char x,unsigned char y) {
if (x == 0)
{
write_com(0x80 + y); //表示第一行
} else
{
write_com(0xC0 + y); //表示第二行
}
}/*------------------------------------------------
写入字符串函数
------------------------------------------------*/void LCD\_Write\_String(unsigned char x,unsigned char y,unsigned char *s) {
SelectPosition(x,y) ; while (*s)
{
write_data( *s);
s ++;
}
}void LCD\_Write\_Char(u8 x,u8 y,u16 s,u8 l) {
SelectPosition(x,y) ; if(l>=5) write_data(0x30+s/10000%10); //万位
if(l>=4) write_data(0x30+s/1000%10); //千位
if(l>=3) write_data(0x30+s/100%10); //百位
if(l>=2) write_data(0x30+s/10%10); //十位
if(l>=1) write_data(0x30+s%10); //个位}/*1602指令简介
write_com(0x38);//屏幕初始化
write_com(0x0c);//打开显示 无光标 无光标闪烁
write_com(0x0d);//打开显示 阴影闪烁
write_com(0x0d);//打开显示 阴影闪烁
*///1602初始化
四、实现现象
具体动态效果看B站演示视频:
基于51单片机的倒计时音乐播放系统设计_哔哩哔哩_bilibili
全部资料(源程序、仿真文件、安装包、演示视频):
通过百度网盘分享的文件:基于51单片机的倒计时音乐播放系统设计.zip
链接:https://pan.baidu.com/s/19RILEqXK6eeWC6n3ItDzYA?pwd=poos
提取码:poos
–来自百度网盘超级会员V4的分享