恩 趁现在精神还蛮不错 就继续往下写写吧 现在就总结一下蜂鸣器的驱动吧
说白了 蜂鸣器的驱动 就是用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 () ;
}
通过自己做的板子调试 完全可行呢 心情打好呢