#include #define KeyPort P3 /*------------------------------------------------ 全局变量 ------------------------------------------------*/ unsigned char High,Low; //定时器预装值的高8位和低8位 sbit SPK=P1^2; //定义喇叭接口 unsigned char code freq[][2]={ 0xD8,0xF7,//00440HZ 1 0xBD,0xF8,//00494HZ 2 0x87,0xF9,//00554HZ 3 0xE4,0xF9,//00587HZ 4 0x90,0xFA,//00659HZ 5 0x29,0xFB,//00740HZ 6 0xB1,0xFB,//00831HZ 7 0xEF,0xFB,//00880HZ `1 }; /*------------------------------------------------ 函数声明 ------------------------------------------------*/ void Init_Timer0(void);//定时器初始化 /*------------------------------------------------ 主函数 ------------------------------------------------*/ void main (void) { unsigned char num; Init_Timer0(); //初始化定时器0,主要用于数码管动态扫描 SPK=0; //在未按键时,喇叭低电平,防止长期高电平损坏喇叭 while (1) //主循环 { switch(KeyPort) { case 0xfe:num= 1;break; case 0xfd:num= 2;break; case 0xfb:num= 3;break; case 0xf7:num= 4;break; case 0xef:num= 5;break; case 0xdf:num= 6;break; case 0xbf:num= 7;break; case 0x7f:num= 8;break; default:num= 0;break; } if(num==0) { TR0=0; SPK=0; //在未按键时,喇叭低电平,防止长期高电平损坏喇叭 } else { High=freq[num-1][1]; Low =freq[num-1][0]; TR0=1; } } } /*------------------------------------------------ 定时器初始化子程序 ------------------------------------------------*/ void Init_Timer0(void) { TMOD |= 0x01; //使用模式1,16位定时器,使用\"|\"符号可以在使用多个定时器时不受影响 EA=1; //总中断打开 ET0=1; //定时器中断打开 //TR0=1; //定时器开关打开 } /*------------------------------------------------ 定时器中断子程序 ------------------------------------------------*/ void Timer0_isr(void) interrupt 1 { TH0=High; TL0=Low; SPK=!SPK; } 因篇幅问题不能全部显示,请点此查看更多更全内容