单片机源程序如下:
#include #include #define uhar unsigned char #define uint unsigned int sbit key1=P3^2;//定义按key1可切换花样 sbit key2=P3^3;//定义按key2可切换歌曲 sbit fm=P3^5;//蜂鸣器连续的IO口,接蜂鸣器的管脚 sbit rs=P2^0; sbit rw=P2^1; sbit ep=P2^2; uchar i; uchar Tong_index=0;//音乐片段索引音符索引 uchar song_index=0; uchar *discode;//暂存LCD需要显示的歌名 uchar *song_Tone,*song_Time; uchar code dis1[]={"song1"};//第一首歌名,dis1~dis4位LCD第一行要显示的歌名; uchar code dis2[]={"song2"}; uchar code dis3[]={"song3"}; uchar code dis4[]={"song4"}; uchar code dis[]={"K1:Down K2:Up"}; //第二行显示的内容 uint code Tong_tab[]={62018,62401,62491,62895,63184,63441,63506,63773, 63965,64137,64215,64360,64488,64603,64654,64751,64836,64876,64948,65012,65067,65535}; //---------------------------简谱--------------------------------------- //编程规则:字节高位是简谱,低位是持续时间,代表多少个十六分音符。 //1-7代表中央C调,8-E代表高八度,0代表停顿 //最后的0是结束标志 //uchar code song1_Tone[]={ // 歌曲1的演奏音符 //11,9,11,14,12,14,12,11,11,7,8,9,8,7,8, //11,9,11,14,13,12,14,11,11,7,8,9,6,7, //12,14,14,13,12,13,14,12,13,14,12,12,11,10,7,8, //11,9,11,14,13,12,14,11,11,8,9,10,6,7,0xff};//结束标志 //uchar code song1_Time[]={ // 歌曲1的节拍频率 //4,2,2,8,4,2,2,8,4,2,2,4,2,2,12, //4,2,2,4,2,4,4,8,4,2,2,4,2,12, //4,4,8,4,2,2,8,2,2,2,2,2,2,2,2,16, //4,2,2,4,2,4,4,8,4,2,2,4,2,12,0xff}; //uchar code song2_Tone[]={ // 歌曲2的演奏音符 //7,8,9,7,7,8,9,7,9,10,11,9,10,11, //11,12,11,10,9,7,11,12,11,10,9,7,7,4,7,7,4,7,0xff};//结束标志 //uchar code song2_Time[]={ // 歌曲2的节拍频率 //4,4,4,4,4,4,4,4,4,4,8,4,4,8, //2,2,2,2,4,4,2,2,2,2,4,4,4,4,8,4,4,8,0xff}; //uchar code song3_Tone[]={ // 歌曲3的演奏音符 //7,7,7,8,9,9,9,9,10,11,12,12,11,10,9,11,11,8,9,7, //7,7,7,8,11,9,9,9,10,11,12,12,11,10,9,11,11,8,9,7,0xff};//结束标志 //uchar code song3_Time[]={ // 歌曲3的节拍频率 //2,2,2,2,4,2,2,2,2,4,2,2,2,2,4,2,2,2,2,4, //2,2,2,2,4,2,2,2,2,4,2,2,2,2,4,2,2,2,2,5,0xff}; //uchar code song4_Tone[]={ // 歌曲4的演奏音符 //5,9,9,9,9,8,7,8,7,6,5,12,12,12,12,12,11, //2,11,11,10,9,9,12,12,11,9,8,7,8,7,6,5,9, //2,7,7,6,5,9,8,7,6,4,12,0xff};//结束标志 //uchar code song4_Time[]={ // 歌曲4的节拍频率 //2,2,2,2,2,2,2,2,2,2,8,2,2,2,2,4,2, //2,2,2,2,8,2,2,2,2,4,2,2,2,2,2,4,2, //2,2,2,2,4,2,2,2,2,2,8,0xff}; void delayms(uint ms) { uchar a; while(ms--) { for(a=230;a>0;a--); } } uchar Busy_Check(void)//测试LED忙碌状态 { uchar LCD_Status; rs=0; rw=1; ep=1 _nop_(); _nop_(); _nop_(); _nop_(); LCD_Status=P0&0x80; ep=0; return LCD_Status; } void led_wemd(uchar cmd)//写入指令数据到LCD { while(Busy_Check()); rs=0; rw=0; ep=0; _nop_() _nop_() P0=cmd; _nop_() _nop_() _nop_() _nop_() ep=1; _nop_() _nop_() _nop_() _nop_() ep=0; } void lcd_pos(uchar pos) { lcd_wcmd(pos|0x80); } void lcd_wdat(uchar dat) { while(Busy_Check()); rs=0; rw=0; ep=0; _nop_() _nop_() P0=cmd; _nop_() _nop_() _nop_() _nop_() ep=1; _nop_() _nop_() _nop_() _nop_() ep=0; } void lcd_init(void) //lcd初始化设定 { lcd_wcmd(0x38); //设置显示格式为16*2行显示,5*8点阵,8位 delay(1); lcd_wcmd(0x0C); //0x0c-显示开关设置 delay(1); lcd_wcmd(0x06); //0x06读写后指针+1 delay(1); lcd_wcmd(0x01);//清除lcd显示内容 } //----------------------------简谱音调对应的定时器初值--------------------------- //适合11.0592M的晶振,对定时器置入的初值 uchar code cuzhi[]={ 0xff,0xff,//占位用的,没有实际的意义 0xFC,0x8E,//中央C调1-7 0xFC,0xED, 0xFD,0x43, 0xFD,0x6A, 0xFD,0xB3, 0xFD,0xF3, 0xFE,0x2D, 0xFE,0x47, //高八度1-7 0xFE,0x76, 0xFE,0xA1, 0xFE,0xC7, 0xFE,0xD9, 0xFE,0xF9, 0xFF,0x16 }; uchar yinyue[]={0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0x0,0x0}; //将音调转化为对应的LED样式 void delay1(uint z); //延时1MS void delay(uint z); //延时165MS,即十六分音符 void song(); void beep();//蜂鸣器叫一声 void int0() interrupt 0 { delayms(100); if(INT0==0) { TR0=0; if(song_index>5) { song_index=5; } else{song_index++;} if(song_index==1) {temp=songl[i];discode=dis2;} if(song_index==2) {temp=song2[i];discode=dis3;} if(song_index==3) {temp=song3[i];discode=dis4;} if(song_index==4) {temp=song4[i];discode=dis1;song_index=0;} TR0=1; i=0; } } void int1() interrupt 2 //外部中断1 { delayms(100); if(INT1==0) { TR1=0; if(song_index<1) { song_index=0; } else{song_index--;} if(song_index==1) {temp=song[i];discode=dis2;} if(song_index==2) {temp=song2[i];discode=dis3;} if(song_index==3) {temp=song3[i];discode=dis4;} if(song_index==4) {temp=song4[i];discode=dis1;song_index=0;} TR0=1;
上一篇:51单片机计算器(加减乘除)完善
下一篇:STC15F104W单片机四路按键循环开关程序
推荐阅读最新更新时间:2024-11-10 18:16
设计资源 培训 开发板 精华推荐
- NCV890100 1.2A、2MHz 汽车降压开关稳压器的典型应用
- LT1074CT 抽头电感降压转换器的典型应用
- 基于STM32的POCSAG发送设备_public
- AD9520-5/PCBZ,用于评估 AD9520-5 PLL 时钟合成器的评估板
- R_151_V10基于IPS2电机换向传感器的设计
- CocoPI
- LTM4608AEV 2.7V 至 5.5Vin、1.2V 输出 DC/DC 稳压器在扩频操作中的典型应用电路
- DC2063A,用于 LTC2875 60V 故障保护 3.3V 或 5V 高速 CAN 收发器的演示板
- 0.8 至 3.3V DC 至 DC 单输出笔记本电源
- 【涂鸦智能】立创EDA & 涂鸦智能温湿度传感器
- TI有奖直播:使用 MSPM0 AEC-Q100 MCU 设计更智能的汽车系统
- 免费申请英飞凌FMCW雷达解决方案Position2Go,角度,距离,速度,运动方向检测一板搞定!
- 下载安森美半导体 KNX 技术文档赢精美礼品!
- 恩智浦无线MCU应用征集+100套开发套件申请
- 年末芯币竞价最后一期——RIGOL 数字示波器
- 私人定制,开启个性化测试模式
- 【在线研讨会讲义下载】TOF 技术介绍及产品应用
- 学AM335X课程,赢超值BB-Black团购资格,更有DIY大奖赛预热中!
- 分分钟完成电子设计的奥秘—2015WEBENCH邀你共同见证!
- 学习赢京东卡 | 从12V电池及供电网络优化的角度分析电动汽车E/E架构的趋势