单片机如何用定时器T0控制蜂鸣器发声

2019-07-15 20:14发布

唉  也不太清楚为什么 当键盘按下去以后  就没有挺  会一直哒哒哒的响   不连续啊    其实我是想做一个按键电子琴的  那都是后话了  只是拿这个程序试一下  发现响不了连续声音  对定时器还不是很了解   求解答啊


#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint  unsigned int
sbit P27=P2^7;
sbit fmq=P3^6;
uchar  key;
unsigned char code disp_code[]={
              0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
              0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf};

unsigned char code key_code[]={
              0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,
              0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77};



void delay1ms(uint i)
{

uchar j;
while(i--)
{
for(j=0;j<115;j++)          //1ms基准延时程序
{
  ;
}


}
  
}
void delay500us()
{

unsigned char j;

for(j=0;j<57;j++)          //500us基准延时程序
{
  ;
}
}


/*void beep()        //产生1KHZ频率声音的函数
{
        fmq=0;
        delay500us();
        fmq=1;
        delay500us();       

}        */




/**********************************************************

键盘扫描子函数

**********************************************************/
uchar  keyscan()
{
   uchar  scan1,scan2,keycode,j;

   P1=0xf0;
   scan1=P1;
   if((scan1&0xf0)!=0xf0)           //判键是否按下
   {
     delay1ms(20);                   //延时20ms
     scan1=P1;
     if((scan1&0xf0)!=0xf0)         //二次判键是否按下
     {
        P1=0x0f;  //线反转法的核心
        scan2=P1;
        keycode=scan1|scan2;         //组合成键编码

        for(j=0;j<=15;j++)
        {
           if(keycode== key_code[j])  //查表得键值
           {
              key=j;
              return(key);
           }
        }
     }
   }
   else  
   P1=0xff; //P1口写1 输入状态
   return (16);//"-"
}
main()
{
           uchar tt;
   P0 = 0xbf;                  //数码管显示"-"
   P27 =0;            
    P1 = 0xff;

   
         TMOD=0x01;
         EA=1;
         ET0=1;
         
   while(1)
   {
     P1=0xf0;
         if((P1&0xf0)!=0xf0){
     keyscan();
     P0=disp_code[key];
         fmq=~fmq;
         TH0=(65535-64201)/256;
         TL0=(65535-64201)%256;
         
         TR0=1;
       
         fmq=1;
         delay1ms(2000);


         }
     
   }
}

void t0()interrupt 1
{
TH0=(65535-64021)/256;
TL0=(65535-64021)%256;
fmq=~fmq;
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。