《单片机C语言程序设计实训100例---基于8051和PROTEUS仿真》案例
if(K2==0) Play(2); if(K3==0) Play(3); if(K4==0) Play(4); } }
23 播放音乐
/* 名称:播放音乐
说明:程序运行时播放生日快乐歌, 未使用定时器中断,所有频率完全用延时实现 */
#include
#define uchar unsigned char #define uint unsigned int sbit BEEP=P3^7;
//生日快乐歌的音符频率表,不同频率由不同的延时来决定 uchar 12,142,159,
212,212,106,126,159,169,190,119,119,126,159,142,159,
51
code
SONG_TONE[]={212,212,190,212,159,169,212,212,190,2
《单片机C语言程序设计实训100例---基于8051和PROTEUS仿真》案例
0};
//生日快乐歌节拍表,节拍决定每个音符的演奏长短 uchar
SONG_LONG[]={9,3,12,12,12,24,9,3,12,12,12,24,
9,3,12,12,12,12,12,9,3,12,12,12,24,0};
//延时
void DelayMS(uint x) {
uchar t;
while(x--) for(t=0;t<120;t++); }
//播放函数 void PlayMusic() {
uint i=0,j,k;
while(SONG_LONG[i]!=0||SONG_TONE[i]!=0) { //播放各个音符,SONG_LONG为拍子长度 for(j=0;j BEEP=~BEEP; //SONG_TONE延时表决定了每个音符的频率 for(k=0;k 52 code 《单片机C语言程序设计实训100例---基于8051和PROTEUS仿真》案例 } DelayMS(10); i++; } } void main() { BEEP=0; while(1) { PlayMusic(); //播放生日快乐 DelayMS(500); //播放完后暂停一段时间 } } 24 INT0中断计数 /* 名称:INT0中断计数 说明:每次按下 计数键时触发INT0中断,中断程序累加计数, 计数值显示在3只数码管上,按下清零键时数码管清零 53 《单片机C语言程序设计实训100例---基于8051和PROTEUS仿真》案例 */ #include #define uchar unsigned char #define uint unsigned int //0~9的段码 uchar 07,0x7f,0x6f,0x00}; //计数值分解后各个待显示的数位 uchar DSY_Buffer[]={0,0,0}; uchar Count=0; sbit Clear_Key=P3^6; //数码管上显示计数值 void Show_Count_ON_DSY() { DSY_Buffer[2]=Count/100; //获取3个数 DSY_Buffer[1]=Count0/10; DSY_Buffer[0]=Count; if(DSY_Buffer[2]==0) //高位为0时不显示 { DSY_Buffer[2]=0x0a; if(DSY_Buffer[1]==0) //高位为0,若第二位为0同样不显示 54 code DSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x 《单片机C语言程序设计实训100例---基于8051和PROTEUS仿真》案例 DSY_Buffer[1]=0x0a; } P0=DSY_CODE[DSY_Buffer[0]]; P1=DSY_CODE[DSY_Buffer[1]]; P2=DSY_CODE[DSY_Buffer[2]]; } //主程序 void main() { P0=0x00; P1=0x00; P2=0x00; IE=0x81; //允许INT0中断 IT0=1; //下降沿触发 while(1) { if(Clear_Key==0) Count=0; //清0 Show_Count_ON_DSY(); } } //INT0中断函数 void 55 EX_INT0() interrupt 0