恩 趁现在精神还蛮不错 就继续往下写写吧 现在就总结一下蜂鸣器的驱动吧
      说白了 蜂鸣器的驱动 就是用PWM驱动 很简单就给它个脉冲 它便能发出声音 但为了配合前面做到程序 以便做一个小小的综合 便加上了LED灯显示  与按键的控制 这样便能做一个AVR端口的小小综合 好了  下面就是实现的代码
      先说明下端口的安排:A口控制按钮 B口控制LED D5口控制蜂鸣器
 
#include <iom16v.h>
#include <macros.h>
#define ucahr unsigned char
#define uint  unsigned int
 
uint tab[ ]={ 637,568,505,477,425,378,337};   //音符
 
//延时子程序
void DelayMs ( uchar i )
{
    uchar j;
    while ( i--)
    {
        j=167;
        while ( j--);
      }
}
 //键盘扫描程序
void KeyScan ( void)
{
     uchar temp ;    //存放音符
     uchar  KeyNum =0 ;  //存放键盘值
     DDRA = 0xff;
     PORTA = 0xff;
     DedlyMs  ( 1);
     DDRA =0x00;
     if  ( PINA !=0xff)
          DelayMs  (1) ;
      if  ( PINA !=0xff)
      {
          switch ( PINA & 0xff)
          {
                  case 0b11111110: KeyNum = 1;break;
                  case 0b11111101: KeyNum = 2;break;
                  case 0b11111011: KeyNum = 3;break;
                  case 0b11110111: KeyNum = 4;break;
                  case 0b11101111: KeyNum = 5;break;
                  case 0b11011111: KeyNum = 6;break;
                  case 0b10111111: KeyNum = 7;break;
                  case 0b01111111: KeyNum = 8;break;
                  default: break; 
          }
          while ( PINA != 0xff)
          {
                  DDRB = 0xff ;
                  PORTB &=~( 1<<( KeyNum-1)) ;
                  DDRA = 0xff;
                  PORTA = 0xff ;
                  //DelayMs ( 1);
                  temp = tab [ KeyNum-1] ;
                  while (  temp- -)
                         NOP ()   ;                
                  DDRD = ( 1<<5 )    ;
                  PORTD ^ = ( 1<<5 ) ;
          }
          DDRB =0xff ;
          PORTB = 0xff  ;
      }
}
//主程序
 void  main  ( void )
{
    DDRB = 0xff ;
    PORTB = 0xff ;
    //  DelayMs ( 200)  ;
    KeyScan ()  ;
}
 
通过自己做的板子调试 完全可行呢 心情打好呢