#include \
#define ADCDeltaOn 12 // ~2 Deg C delta
static unsigned int FirstADCVal; // holds 1st ADC result
void main(void) {
WDTCTL = WDTPW + WDTHOLD; // Stop watchdog BoardConfig(0xb8);
P3OUT = 0x00; // Clear P1 P3DIR = BIT4; // P3.4 as output
ADC12CTL1 = SHS_1 + SHP + CONSEQ_2; // TA trig., rpt conv. ADC12MCTL0 = SREF_1 + INCH_10; // Channel A10, Vref+ ADC12IE = 0x01; // Enable ADC12IFG.0
ADC12CTL0 = SHT0_8 + REF2_5V + REFON + ADC12ON + ENC; // Config ADC12 TACCTL1 = OUTMOD_4; // Toggle on EQU1 (TAR = 0) TACTL = TASSEL_2 + MC_2; // SMCLK, cont-mode while (!(0x01 & ADC12IFG)); // First conversion?
FirstADCVal = ADC12MEM0; // Read out 1st ADC value _BIS_SR(LPM0_bits + GIE); // Enter LPM0 w/ interrupt }
#pragma vector=ADC_VECTOR __interrupt void ADC12ISR (void) {
if (ADC12MEM0 <= FirstADCVal + ADCDeltaOn)
P3OUT &= ~BIT4; // LED off else P3OUT |= BIT4; // LED on }
/********************************************************* 程序功能:用固定频率的方波驱动蜂鸣器,共16种音调;在蜂鸣器 发出不同音调的同时,LED发光以二进制数字形式指示 当前音调的编号(1~16)
---------------------------------------------------------- 测试说明:聆听蜂鸣器发声的音调变化。
**********************************************************/ #include
uchar step = 0xff;
/************************主函数************************/ void main( void ) {
31
uchar i;
WDTCTL = WDTPW + WDTHOLD; //关狗
BoardConfig(0xb0); //关数码管、流水灯和电平转换
/*------选择系统主时钟为8MHz-------*/
BCSCTL1 &= ~XT2OFF; //打开XT2高频晶体振荡器 do {
IFG1 &= ~OFIFG; //清除晶振失败标志 for (i = 0xFF; i > 0; i--); //等待8MHz晶体起振 }
while ((IFG1 & OFIFG)); //晶振失效标志仍然存在?
BCSCTL2 |= SELM_2 + SELS; //MCLK和SMCLK选择高频晶振
TACCTL0 |= CCIE; //使能比较中断
TACTL |= TASSEL_2 + ID_3 ; //计数时钟选择SMLK=8MHz,1/8分频后为1MHz
TBCCR0 = 4096*2 - 1; //周期两秒 TBCCTL0 |= CCIE;
TBCTL |= TBSSEL_1 + ID_3 + MC_1; //时钟源ACLK/8,up mode
P6DIR |= BIT7; //蜂鸣器对应IO设置为输出 P2DIR = 0xff; P2OUT = 0xff;
_EINT();
LPM1; }
/******************************************* 函数名称:Timer_A
功 能:定时器A的中断服务函数,在这里驱动 蜂鸣器发声 参 数:无 返回值 :无
********************************************/ #pragma vector=TIMERA0_VECTOR __interrupt void Timer_A (void) {
P6OUT ^= BIT7; // Toggle P6.7 }
/******************************************* 函数名称:Timer_B
功 能:定时器B的中断服务函数,在这里更改
32
蜂鸣器发声频率 参 数:无 返回值 :无
********************************************/ #pragma vector=TIMERB0_VECTOR __interrupt void Timer_B (void) {
if(step == 0xff) //up mode TACTL |= MC_1; step++; switch(step) {
case 0: TACCR0 = 5000; P2OUT = ~1; break; // 100Hz case 1: TACCR0 = 2500; P2OUT = ~2; break; // 200Hz case 2: TACCR0 = 1250; P2OUT = ~3; break; // 400Hz case 3: TACCR0 = 625; P2OUT = ~4; break; // 800Hz case 4: TACCR0 = 500; P2OUT = ~5; break; // 1KHz case 5: TACCR0 = 250; P2OUT = ~6; break; // 2KHz case 6: TACCR0 = 167; P2OUT = ~7; break; // 3KHz case 7: TACCR0 = 125; P2OUT = ~8; break; // 4KHz case 8: TACCR0 = 100; P2OUT = ~9; break; // 5KHz case 9: TACCR0 = 83; P2OUT = ~10; break; // 6KHz case 10: TACCR0 = 71; P2OUT = ~11; break; // 7KHz case 11: TACCR0 = 63; P2OUT = ~12; break; // 8KHz case 12: TACCR0 = 56; P2OUT = ~13; break; // 9KHz case 13: TACCR0 = 50; P2OUT = ~14; break; // 10KHz case 14: TACCR0 = 33; P2OUT = ~15; break; // 15KHz case 15: TACCR0 = 25; P2OUT = ~16; break; // 20KHz case 16: step = 0xff; // 循环播放 } }
//《祝你平安》对应的编码 const unsigned char SONG[]= {
0x26,0x20,0x20,0x20,0x20,0x20,0x26,0x10,0x20, 0x10,0x20,0x80,0x26,0x20,0x30,0x20,0x30,0x20, 0x39,0x10,0x30,0x10,0x30,0x80,0x26,0x0,0x20, 0x20,0x20,0x20,0x1c,0x20,0x20,0x80,0x2b,0x20, 0x26,0x20,0x20,0x20,0x2b,0x10,0x26,0x10,0x2b, 0x80,0x26,0x20,0x30,0x20,0x30,0x20,0x39,0x10, 0x26,0x10,0x26,0x60,0x40,0x10,0x39,0x10,0x26, 0x20,0x30,0x20,0x30,0x20,0x39,0x10,0x6,0x10, 0x26,0x80,0x26,0x20,0x2b,0x10,0x2b,0x10,0x2b, 0x20,0x30,0x10,0x39,0x10,0x26,0x10,0x2b,0x10, 0x2b,0x20,0x2b,0x40,0x40,0x20,0x20,0x10,0x20,
33
0x10,0x2b,0x10,0x26,0x30,0x30,0x80,0x18,0x20, 0x18,0x20,0x26,0x20,0x20,0x20,0x20,0x40,0x26, 0x20,0x2b,0x20,0x30,0x20,0x30,0x20,0x1c,0x20, 0x20,0x20,0x20,0x80,0x1c,0x20,0x1c,0x20,0x1c, 0x20,0x30,0x20,0x30,0x60,0x39,0x10,0x30,0x10, 0x20,0x20,0x2b,0x10,0x26,0x10,0x2b,0x10,0x26, 0x10,0x26,0x10,0x2b,0x10,0x2b,0x80,0x18,0x20, 0x18,0x20,0x26,0x20,0x20,0x20,0x20,0x60,0x26, 0x10,0x2b,0x20,0x30,0x20,0x30,0x20,0x1c,0x20, 0x20,0x20,0x20,0x80,0x26,0x20,0x30,0x10,0x30, 0x10,0x30,0x20,0x39,0x20,0x26,0x10,0x2b,0x10, 0x2b,0x20,0x2b,0x40,0x40,0x10,0x40,0x10,0x20, 0x10,0x20,0x10,0x2b,0x10,0x26,0x30,0x30,0x80, 0x00 };
/********************************************* 程序功能:MCU控制蜂鸣器演奏歌曲《祝你平安》 ---------------------------------------------- 测试说明:聆听蜂鸣器“唱出”的乐曲
*********************************************/ #include
#define Buzzer BIT7 #define Buzzer_Port P6OUT #define Buzzer_DIR P6DIR
uchar counter;
void Play_Song(void);
/***************主函数****************/ void main(void) {
uchar i;
WDTCTL = WDTPW + WDTHOLD; //关闭看门狗 /*------选择系统主时钟为8MHz-------*/
BCSCTL1 &= ~XT2OFF; // 打开XT2高频晶体振荡器 do {
IFG1 &= ~OFIFG; //清除晶振失败标志 for (i = 0xFF; i > 0; i--); // 等待8MHz晶体起振 }
34
while ((IFG1 & OFIFG)); // 晶振失效标志仍然存在?
BCSCTL2 |= SELM_2 + SELS; //主时钟和从时钟都选择高频晶振
BoardConfig(0xf8); //关闭数码管、流水灯、电平转换
//设置定时器A每10ms中断一次 CCTL0 = CCIE; CCR0 = 10000;
TACTL |= TASSEL_2 + ID_3;
//设置控制蜂鸣器的IO方向为输出 Buzzer_DIR |= Buzzer; //打开全局中断 _EINT();
//循环演奏歌曲 while(1) {
Play_Song(); } }
/******************************************* 函数名称:TimerA_ISR
功 能:定时器A的中断服务函数 参 数:无 返回值 :无
********************************************/ #pragma vector = TIMERA0_VECTOR __interrupt void TimerA_ISR(void) {
counter++; }
/******************************************* 函数名称:Delay_Nms
功 能:延时N个ms的函数 参 数:n--延时长度 返回值 :无
********************************************/ void Delay_Nms(uchar n) {
uchar i,j;
for( i = 0;i < n; i++ ) {
for( j = 0;j < 3;j++ ) _NOP();
35