电子琴

来源:互联网 发布:安东尼本内特体测数据 编辑:程序博客网 时间:2024/05/01 00:48
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义#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; }

0 0