完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
单片机音乐盒完整代码 该设计是使用C51单片机制作的音乐盒制作的一个音乐盒,可以实现进行歌曲的切换,暂停/播放。此外还增加了随机点歌,获取大气温湿度等功能。使用LCD1602显示器进行歌曲名称和大气温湿度的显示。将完整代码帖在下面,有需要的可以自己获取。完整代码可以在我的博客下面,我的资源下面进行下载使用。 由于我上传的资源需要积分,所以我重新更新了代码,现在以将完整代码贴出,有需要的可以自己看一下,如果遇到有什么问题的可以问一下我。如果觉得还行的请帮我点个赞,谢谢大家。 如果下面贴出的代码,大家不能看懂的,或者使用有麻烦的可以给我私信。 下面是一些实物图片 部分代码如下 main.c #include "main.h" #include "delay.h" #include "beep.h" uchar RH,RL,TH,TL;//定义变量用来存储温湿度变量的值 extern uchar timer1h, timer1l,time,K_Value,Singin_interface,Start,Stop; extern char Number; extern uchar code Player_Number1[9]; uchar KEY;//定义变量保存键值信息 //自定义1602显示心形字符 uchar code table1[]= { 0x03,0x07,0x0f,0x1f,0x1f,0x1f,0x1f,0x1f, 0x18,0x1E,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f, 0x07,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f, 0x10,0x18,0x1c,0x1E,0x1E,0x1E,0x1E,0x1E, 0x0f,0x07,0x03,0x01,0x00,0x00,0x00,0x00, 0x1f,0x1f,0x1f,0x1f,0x1f,0x0f,0x07,0x01, 0x1f,0x1f,0x1f,0x1f,0x1f,0x1c,0x18,0x00, 0x1c,0x18,0x10,0x00,0x00,0x00,0x00,0x00,//心图案 }; //定义流水灯断码 uchar code LED1[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40}; //定时器初始化函数 void timer_init() { TMOD=0x11;//定时器0和1都工作再方式一 TH0=(65536-30000)/256; TL0=(65536-30000)%256; EA=1;//开总中断 //开定时器中断 ET0=1; ET1=1; TR1=0;//首先关闭定时器T1 TR0=1;//开启定时器T0 PT1=1; PT0=0; } void main() { uchar i; uchar flag1=0; Player=1; Last_Song=1; Next_Song=1; Choose_Song=1;//点歌按钮 Confirmation=1;//确定按钮 P0=0xff; timer_init(); lcd_init (); delay (50); //向1602写入自定义字符 Write_CGRAM(0x40,table1); //再1602上显示自定义字符 //显示字符的前四位 lcd_pos (0x0c); for(i=0; i<4; i++) { lcd_wdat(i); } //显示自定义字符的后四位 lcd_pos (0x4c); for(i=4; i<8; i++) { lcd_wdat(i); } //在1602上显示自定义布局 lcd_pos(0x00); lcd_word("T:"); //温度 lcd_pos(0x04); lcd_wdat(0xdF); lcd_wdat('C'); //湿度 lcd_pos(0x07); lcd_word("H:"); lcd_pos(0x0b); lcd_wdat('%'); lcd_pos (0x40); lcd_word("Sg:"); lcd_word(Player_Number1); while(1) { Song(Number); } } void t0int() interrupt 1 { static uchar Num0=0,Num1=0,i=0; TH0=(65536-30000)/256; TL0=(65536-30000)%256; Num1++; //表示没有处于点个界面中,则进行数据刷新 if(Singin_interface==0) { Num0++; if(Num0==90)//控制定时2.7秒钟,用来刷新数据 { receive(); //显示温湿度 lcd_pos(0x02); lcd_wdat(TH/10+0x30); lcd_wdat(TL%10+0X30); //显示湿度 lcd_pos(0x09); lcd_wdat(RH/10+0X30); lcd_wdat(RL%10+0X30); Num0=0; } } //表示处于点歌界面中 else if(Singin_interface==1) { if(Start==1&&Stop==0) { Number=rand_init(); lcd_pos(0x48); lcd_wdat(Number+0x30); } } if(Num1==5) { P0=LED1; i++; if(i==7) { i=0; } Num1=0; } } void t1_int() interrupt 3 //T0中断程序,控制发音的音调 { TR1 = 0; //先关闭T0 s spaker =!spaker; //输出方波, 发音 TH1 = timer1h; //下次的中断时间, 这个时间, 控制音调高低 TL1 = timer1l; TR1 = 1; //启动T0 } main.h #ifndef _main_h #define _main_h #include #include #define uchar unsigned char #define uint unsigned int typedef bit BOOL; ***it spaker=P1^0;//定义音频输出管脚 ***it Player=P3^2;//播放按钮 ***it Last_Song=P3^3;//上一首按钮 ***it Next_Song=P3^5;//下一首 ***it Choose_Song=P3^6;//点歌按钮 ***it Confirmation=P3^7;//确定按钮 //1602相关函数 void lcd_wcmd (uchar cmd); void lcd_pos (uchar pos); void lcd_wdat (uchar dat); void lcd_init (); void lcd_word(uchar *word); void delay (int m); void Write_CGRAM(uchar *adder,uchar *p); //DHT11相关函数 void start1(); uchar receive_byte(); void receive(); //音乐发声相关函数 void song(); void key_scan(); void Song(uchar j); #endif 1602.c / /* 该文件用来编写LCD1602方面的程序 */ #include "main.h" #include "delay.h" #define Dat_1602 P2//1602数据口 ***it rs=P1^7; ***it rw=P1^6; ***it ep=P1^5; void delay (int m) { unsigned char i,j; for (i=0;i } //判断LCD1602是否处于忙碌状态 BOOL lcd_bz() { BOOL result; rs=0; // 读忙信号 rw=1; ep=1; _nop_(); _nop_(); _nop_(); _nop_(); result = (BOOL)(Dat_1602&0x80); ep=0; return result; } //向LCD62写命令 void lcd_wcmd (uchar cmd) { while (lcd_bz()); rs=0; rw=0; ep=0; _nop_(); _nop_(); Dat_1602=cmd ; _nop_(); _nop_(); _nop_(); _nop_(); ep=1; _nop_(); _nop_(); _nop_(); _nop_(); ep=0; } //指定当前LCD1602要显示字符的位置 void lcd_pos (uchar pos) { lcd_wcmd (pos|0x80); } void lcd_wdat (uchar dat) { while (lcd_bz()); rs=1; rw=0; ep=0; _nop_(); _nop_(); Dat_1602=dat ; _nop_(); _nop_(); _nop_(); _nop_(); ep=1; _nop_(); _nop_(); _nop_(); _nop_(); ep=0; } //LCD1602初始化 void lcd_init () { lcd_wcmd (0x38); //显示模式设置:16×2显示,5×7点阵,8位数据接口 delay (1); lcd_wcmd (0x0c); //显示模式设置:光标右移,字符不移 delay (1); lcd_wcmd (0x06); //显示模式设置:光标右移,字符不移 delay (1); lcd_wcmd (0x01); //清屏幕指令,将以前的显示内容清除 delay (1); } //向LCD1602发送字符串 void lcd_word(uchar *word) { uchar i=0; while(word!=' |