MSP430入门学习程序

更新时间:2024-04-01 22:39:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

1、 点亮LED

(1)、闪烁灯

/*************************************************** 程序功能:控制8个LED闪烁,用于测试下载功能是否正常 --------------------------------------------------- 测试说明:观察LED闪烁

***************************************************/ #include #include \

/****************主函数****************/ void main(void) {

WDTCTL = WDTPW + WDTHOLD; //关闭看门狗

BoardConfig(0xf0); //关闭数码管和电平转换,打开流水灯

CCTL0 = CCIE; //使能CCR0中断

CCR0 = 2047; //设定周期0.5S

TACTL = TASSEL_1 + ID_3 + MC_1; //定时器A的时钟源选择ACLK,增计数模式 P2DIR = 0xff; //设置P2口方向为输出 P2OUT = 0xff;

_EINT(); //使能全局中断

LPM3; //CPU进入LPM3模式 }

/******************************************* 函数名称:Timer_A

功 能:定时器A的中断服务函数 参 数:无 返回值 :无

********************************************/ #pragma vector = TIMERA0_VECTOR __interrupt void Timer_A (void) {

P2OUT ^= 0xff; //P2口输出取反 }

(2)流水灯

/*********************************************** 程序功能:实现流水灯以三种流动方式和四种流动速度 的不同组合而进行点亮\流动\------------------------------------------------

测试说明:观察流水灯流动顺序和速度的变化

************************************************/ #include #include \

uint i = 0,j = 0,dir = 0;

uint flag = 0,speed = 0; //flag--灯光流动方式,speed--灯光流动速度

/****************主函数****************/ void main(void) {

WDTCTL = WDTPW + WDTHOLD; //关闭看门狗 BoardConfig(0xf0);

CCTL0 = CCIE; //使能CCR0中断 CCR0 = 50000;

TACTL = TASSEL_2 + ID_3 + MC_1; //定时器A的时钟源选择SMCLK,增计数模式 P2DIR = 0xff; //设置P2口方向为输出 P2OUT = 0xff;

_EINT(); //使能全局中断

LPM0; //CPU进入LPM0模式 }

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

函数名称:Timer_A

功 能:定时器A的中断服务函数,在这里通过标志 控制流水灯的流动方向和流动速度 参 数:无 返回值 :无

********************************************/ #pragma vector = TIMERA0_VECTOR __interrupt void Timer_A (void) {

if(flag == 0) {

P2OUT = ~(0x80>>(i++)); //灯的点亮顺序D8 -> D1

}

else if(flag == 1) {

P2OUT = ~(0x01<<(i++)); //灯的点亮顺序D1 -> D8 } else {

if(dir) //灯的点亮顺序 D8 -> D1,D1 -> D8,循环绕圈 {

P2OUT = ~(0x80>>(i++)); } else {

P2OUT = ~(0x01<<(i++)); } }

if(i == 8) {

i = 0; dir = ~dir; }

j++;

if(j == 40) {

i = 0; j = 0; flag++;

if(flag == 4) flag = 0; switch(speed) {

case 0:

TACTL &=~ (ID0 + ID1); TACTL |= ID_3; break; case 1:

TACTL &=~ (ID0 + ID1); TACTL |= ID_2; break; case 2:

TACTL &=~ (ID0 + ID1); TACTL |= ID_1; break;

case 3:

TACTL &=~ (ID0 + ID1); TACTL |= ID_0; break; default: break; }

if(flag != 3) speed++; if(speed == 4) speed = 0; } } (3)、PWM控制LED

/******************************************************* 程序功能:用从P2.3和P2.4输出的PWM波形驱动LED闪烁 P2.3口输出方波的占空比为75% P2.4口输出方波的占空比为25% -------------------------------------------------------

测试说明:观察LED的亮灭的时间长短

*******************************************************/ #include #include \void main(void) {

WDTCTL = WDTPW + WDTHOLD; // 关狗

BoardConfig(0xb0); // 关闭数码管和电平转换,打开流水灯 P2DIR = 0xff; // P2端口设置为输出 P2OUT = 0xff; // 关闭其他LED

P2SEL |= BIT3 + BIT4; // P2.3和P2.4连接内部模块 CCR0 = 4096-1; // PWM周期为1S CCTL1 = OUTMOD_7; // CCR1 reset/set

CCR1 = 3072; // CCR1 PWM duty cycle CCTL2 = OUTMOD_7; // CCR2 reset/set

CCR2 = 1024; // CCR2 PWM duty cycle TACTL = TASSEL_1 + ID_3 + MC_1; // ACLK/8, up mode

_BIS_SR(LPM3_bits); // Enter LPM3 }

2、 数码管

(1)、显示012345

/********************************************** 程序功能:在六位数码管上显示六个数字012345

-----------------------------------------------

测试说明:观察数码管显示

***********************************************/ #include #include \

//数码管7位段码:0--f

uchar scandata[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //记录显示位数的全局变量 uchar cnt = 0;

/********************主函数********************/ void main(void) {

WDTCTL = WDT_ADLY_1_9; // 设置内部看门狗工作在定时器模式,1.9ms中断一次

IE1 |= WDTIE; // 使能看门狗中断

BoardConfig(0x88);

P4DIR = 0xff; //设置P4,P5的IO方向为输出 P5DIR = 0xff;

P4OUT = 0x00; //设置P4,P5的输出初值 P5OUT = 0xff;

_BIS_SR(LPM3_bits + GIE); //CPU进入LPM3低功耗模式,同时打开全局中断 }

/******************************************* 函数名称:watchdog_timer

功 能:看门狗中断服务函数,在这里输出数码管的 段选和位选信号 参 数:无 返回值 :无

********************************************/ #pragma vector=WDT_VECTOR

__interrupt void watchdog_timer(void) {

P5OUT = 0xff;

P4OUT = scandata[cnt]; //输出段选信号 P5OUT &= ~(1 << cnt); //输出位选信号

cnt++; //位计数变量在0~5之间循环 if(cnt == 6) cnt = 0; }

(2)、在数码管上逐次显示数字0~9和字母A~F

/********************************************** 程序功能:在数码管上逐次显示数字0~9和字母A~F -----------------------------------------------

测试说明:观察数码管显示

***********************************************/ #include #include \

//数码管7位段码:0--f

uchar scandata[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //记录显示位数的全局变量 uchar cnt = 0;

/********************主函数********************/ void main(void) {

WDTCTL = WDT_ADLY_1000; // 设置内部看门狗工作在定时器模式,1000ms中断一次

IE1 |= WDTIE; // 使能看门狗中断

BoardConfig(0x88); //打开数码管,关闭流水灯和电平转换

P4DIR = 0xff; //设置P4,P5的IO方向为输出 P5DIR = 0xff;

P4OUT = 0x00; //设置P4,P5的输出初值 P5OUT = 0x00;

_BIS_SR(LPM3_bits + GIE); //CPU进入LPM3低功耗模式,同时打开全局中断 }

/******************************************* 函数名称:watchdog_timer

功 能:看门狗中断服务函数,在这里输出数码管的 段选和位选信号 参 数:无

返回值 :无

********************************************/ #pragma vector=WDT_VECTOR

__interrupt void watchdog_timer(void) {

P4OUT = scandata[cnt]; //输出段选信号

cnt++; //位计数变量在0~5之间循环 if(cnt == 16) cnt = 0; }

(3)在六位数码管上显示一个绕动的光圈,光圈的速度自由变化(快-->慢-->快) /********************************************** 程序功能:在六位数码管上显示一个绕动的光圈,光 圈的速度自由变化(快-->慢-->快) ----------------------------------------------- 测试说明:观察数码管显示

***********************************************/ #include #include \

#define NBIT(x) ~(1 << x)

//绕动光圈对应的字符

uchar scandata[16] = {0x01,0x01,0x01,0x01,0x01,0x01,0x20,0x10,

0x08,0x08,0x08,0x08,0x08,0x08,0x04,0x02}; //显示字符的控制变量 uchar step = 0; //绕动圈数的变量 uint circle = 0;

/********************主函数********************/ void main(void) {

WDTCTL = WDTPW + WDTHOLD; //关闭看门狗 BoardConfig(0x88);

P4DIR = 0xff; //设置P4,P5的IO方向为输出 P5DIR = 0xff;

P4OUT = 0x00; //设置P4,P5的输出初值 P5OUT = 0xff;

CCR0 = 164;

TACCTL0 |= CCIE; //使能比较中断

TACTL |= TASSEL_1 + MC_1; //ACLK, up mode

_BIS_SR(LPM3_bits + GIE); //CPU进入LPM3低功耗模式,同时打开全局中断 }

/******************************************* 函数名称:TimerA_ISR

功 能:定时器A中断服务函数,在这里输出数码管的 段选和位选信号 参 数:无 返回值 :无

********************************************/ #pragma vector=TIMERA0_VECTOR __interrupt void TimerA_ISR(void) {

step++;

if(step == 16) {

step = 0; circle++;

if(circle == 10) //如果已经绕动了10圈 {

circle = CCR0;

CCR0 += circle; //速度降为原来的一半

if(CCR0 > 32700) //如果速度到达底线,则从头开始 CCR0 = 164; circle = 0; } }

switch(step) {

case 0:

P5OUT = NBIT(5);

P4OUT = scandata[step]; break; case 1:

P5OUT = NBIT(4);

P4OUT = scandata[step]; break; case 2:

P5OUT = NBIT(3);

P4OUT = scandata[step]; break; case 3:

P5OUT = NBIT(2);

P4OUT = scandata[step]; break; case 4:

P5OUT = NBIT(1);

P4OUT = scandata[step]; break; case 5:

P5OUT = NBIT(0);

P4OUT = scandata[step]; break; case 6:

P5OUT = NBIT(0);

P4OUT = scandata[step]; break; case 7:

P5OUT = NBIT(0);

P4OUT = scandata[step]; break; case 8:

P5OUT = NBIT(0);

P4OUT = scandata[step]; break; case 9:

P5OUT = NBIT(1);

P4OUT = scandata[step]; break; case 10:

P5OUT = NBIT(2);

P4OUT = scandata[step]; break; case 11:

P5OUT = NBIT(3);

P4OUT = scandata[step]; break; case 12:

P5OUT = NBIT(4);

P4OUT = scandata[step]; break; case 13:

P5OUT = NBIT(5);

P4OUT = scandata[step]; break; case 14:

P5OUT = NBIT(5);

P4OUT = scandata[step]; break; case 15:

P5OUT = NBIT(5);

P4OUT = scandata[step]; break; } }

3、 蜂鸣器

(1)

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

程序功能:用固定频率的方波驱动蜂鸣器,共16种音调;在蜂鸣器 发出不同音调的同时,LED发光以二进制数字形式指示 当前音调的编号(1~16) ----------------------------------------------------------

测试说明:聆听蜂鸣器发声的音调变化。

**********************************************************/ #include #include \

uchar step = 0xff;

/************************主函数************************/ void main( void ) {

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的中断服务函数,在这里更改 蜂鸣器发声频率 参 数:无 返回值 :无

********************************************/ #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; // 循环播放 } }

(2)祝你平安

/********************************************* 程序功能:MCU控制蜂鸣器演奏歌曲《祝你平安》 ----------------------------------------------

测试说明:聆听蜂鸣器“唱出”的乐曲

*********************************************/ #include #include \#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晶体起振 }

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(); } }

/******************************************* 函数名称:Play_Song

功 能:播放《祝你平安》的乐曲 参 数:无 返回值 :无

********************************************/ void Play_Song(void) {

uchar Temp1,Temp2; uchar addr = 0;

counter = 0; //中断计数器清0 while(1) {

Temp1 = SONG[addr++];

if ( Temp1 == 0xFF ) //休止符 {

TACTL &=~MC_1; //停止计数 Delay_Nms(100); }

else if ( Temp1 == 0x00 ) //歌曲结束符 {

return; } else {

Temp2 = SONG[addr++];

TACTL |=MC_1; //开始计数 while(1) {

Buzzer_Port ^= Buzzer; Delay_Nms(Temp1); if ( Temp2 == counter ) {

counter = 0; break; } }

} } }

4、 键盘 4*1

(1)4k1

/*************************************************** 程序功能:用扫描方式读取四个独立式按键的键值,同时将 按键的键值在数码管上显示出来 ----------------------------------------------------

测试说明:按动K1~k4四个按键,观察数码管显示

***************************************************/ #include #include \

#define keyin (P1IN & 0x0f)

//数码管7位段码:0--f

uchar scandata[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

void delay(void);

/********************主函数********************/ void main( void ) {

uchar temp,keyval = 0;

WDTCTL = WDTPW + WDTHOLD; //关闭看门狗

BoardConfig(0x88); //打开数码管,关闭流水灯和电平转换

P1DIR = BIT7; //设置P1.0~P.3为输入状态,P.7为输出 P1OUT = 0;

P3DIR |= BIT4; //设置P3.4为输出状态 P3OUT |= BIT4; //P3.4输出1 P4DIR = 0xff; P5DIR = 0xff; P4OUT = 0x3f; P5OUT = 0xf7; while(1)

{

if(keyin != 0x0f) //如果有键被按下 {

delay(); //延时消抖

if(keyin != 0x0f) //再次检测按键状态 {

temp=keyin;

while(keyin != 0x0f); //等待按键被放开 switch(temp) //转换键值 {

case 0x0e:

keyval = 1;break; case 0x0d:

keyval = 2;break; case 0x0b:

keyval = 3;break; case 0x07:

keyval = 4;break; default:

keyval = 0;break; }

P4OUT = scandata[keyval]; //用一位数码管显示

P3OUT &= ~BIT4; //P3.4连接的LED闪烁一下 delay();delay(); P3OUT |= BIT4; } } } }

/******************************************* 函数名称:delay

功 能:用于消抖的延时 参 数:无 返回值 :无

********************************************/ void delay(void) {

uint tmp;

for(tmp = 12000;tmp > 0;tmp--); }

(2)4K2

/*************************************************** 程序功能:用中断方式读取四个独立式按键的键值,同时将

按键的键值在数码管上显示出来 ----------------------------------------------------

测试说明:按动K1~k4四个按键,观察数码管显示

***************************************************/ #include #include \

#define keyin (P1IN & 0x0f)

//数码管7位段码:0--f

uchar scandata[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

uchar KeyVal = 0; // 按键的键值

void delay(void);

/********************主函数********************/ void main( void ) {

WDTCTL = WDTPW + WDTHOLD; //关闭看门狗

BoardConfig(0x88); //打开数码管,关闭流水灯和电平转换

P1IES = 0x0f; // P1.0~P1.3选择下降沿中断 P1IE = 0x0f; // 打开中断使能

P1DIR = BIT7; //设置P1.0~P.3为输入状态,P.7为输出 P1OUT = 0; P4DIR = 0xff; P5DIR = 0xff; P4OUT = 0x3f; P5OUT = 0xf7;

_EINT(); //打开全局中断控制位 while(1) {

LPM1;

P4OUT = scandata[KeyVal]; } }

/******************************************* 函数名称:delay

功 能:用于消抖的延时 参 数:无 返回值 :无

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

void delay(void) {

uint tmp;

for(tmp = 12000;tmp > 0;tmp--); }

/******************************************* 函数名称:PORT1_ISR

功 能:P1端口的中断服务函数 参 数:无 返回值 :无

********************************************/ #pragma vector=PORT1_VECTOR __interrupt void PORT1_ISR(void) {

if(P1IFG & 0x0f) {

switch(P1IFG) {

case 0x01:

if(keyin == 0x0e) //如果是第一个按键被按下 {

delay();

if(keyin == 0x0e) {

while(keyin != 0x0f); //等待按键放开 KeyVal = 1; LPM1_EXIT; P1IFG = 0; return; } } case 0x02:

if(keyin == 0x0d) //如果是第二个按键被按下 {

delay();

if(keyin == 0x0d) {

while(keyin != 0x0f); //等待按键放开 KeyVal = 2; LPM1_EXIT; P1IFG = 0; return; }

} case 0x04:

if(keyin == 0x0b) //如果是第三个按键被按下 {

delay();

if(keyin == 0x0b) {

while(keyin != 0x0f); //等待按键放开 KeyVal = 3; LPM1_EXIT; P1IFG = 0; return; } } case 0x08:

if(keyin == 0x07) //如果是第四个按键被按下 {

delay();

if(keyin == 0x07) {

while(keyin != 0x0f); //等待按键放开 KeyVal = 4; LPM1_EXIT; P1IFG = 0; return; } } default:

while(keyin != 0x0f); //等待按键放开 //KeyVal = 0; //LPM1_EXIT; P1IFG = 0; return; } } }

(3)4K3

/****************************************************** 程序功能:用中断方式读取四个独立式按键的键值,同时用 D1~D4四个LED的点亮来指示k1~K4四个按键的按下 ----------------------------------------------------

测试说明:按动K1~k4四个按键,观察LED是否正确点亮

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

#include #include \

#define keyin (P1IN & 0x0f)

uchar KeyVal = 0; // 按键的键值

/********************主函数********************/ void main( void ) {

WDTCTL = WDTPW + WDTHOLD; //关闭看门狗

BoardConfig(0xb0); //打开流水灯,关闭数码管和电平转换

P1IES = 0x0f; // P1.0~P1.3选择下降沿中断 P1IE = 0x0f; // 打开中断使能

P1DIR = BIT7; //设置P1.0~P.3为输入状态,P.7为输出 P1OUT = 0; P2DIR = 0xff; P2OUT = 0xff;

_EINT(); //打开全局中断控制位 while(1) {

LPM1;

P2OUT = ~(1 << (KeyVal - 1)); } }

/******************************************* 函数名称:delay

功 能:用于消抖的延时 参 数:无 返回值 :无

********************************************/ void delay(void) {

uint tmp;

for(tmp = 12000;tmp > 0;tmp--); }

/******************************************* 函数名称:PORT1_ISR

功 能:P1端口的中断服务函数 参 数:无 返回值 :无

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

#pragma vector=PORT1_VECTOR __interrupt void PORT1_ISR(void) {

if(P1IFG & 0x0f) {

switch(P1IFG) {

case 0x01:

if(keyin == 0x0e) //如果是第一个按键被按下 case 0x02:

case 0x04:

{

delay();

if(keyin == 0x0e) {

while(keyin != 0x0f); //等待按键放开 KeyVal = 1; LPM1_EXIT; P1IFG = 0; return; } } if(keyin == 0x0d) //如果是第二个按键被按下 {

delay();

if(keyin == 0x0d) {

while(keyin != 0x0f); //等待按键放开 KeyVal = 2; LPM1_EXIT; P1IFG = 0; return; } } if(keyin == 0x0b) //如果是第三个按键被按下 {

delay();

if(keyin == 0x0b) {

while(keyin != 0x0f); //等待按键放开 KeyVal = 3; LPM1_EXIT; P1IFG = 0; return;

} } case 0x08:

if(keyin == 0x07) //如果是第四个按键被按下 {

delay();

if(keyin == 0x07) {

while(keyin != 0x0f); //等待按键放开 KeyVal = 4; LPM1_EXIT; P1IFG = 0; return; } } default:

while(keyin != 0x0f); //等待按键放开 P1IFG = 0; return; } } }

(4)4K4

/********************************************************* 程序功能:用按键控制蜂鸣器发音的音调。 K1按下后用2KHz方波驱动蜂鸣器 K2按下后用4KHz方波驱动蜂鸣器 K3按下后用6KHz方波驱动蜂鸣器 K4按下后停止发音

----------------------------------------------------------

测试说明:按动K1~k4四个按键,聆听蜂鸣器发声频率

**********************************************************/ #include #include \

#define keyin (P1IN & 0x0f)

uchar step = 0xff;

void main( void ) {

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选择高频晶振

TACTL |= TASSEL_2 + ID_3 + MC_1; //计数时钟选择SMLK=8MHz,1/8分频后为1MHz

P1IES = 0x0f; // P1.0~P1.3选择下降沿中断 P1IE = 0x0f; // 打开中断使能

P1DIR = BIT7; //设置P1.0~P.3为输入状态,P.7为输出 P1OUT = 0; P2DIR = 0xff; P2OUT = 0xff;

P6DIR |= BIT7; //蜂鸣器对应IO设置为输出 P6OUT |= BIT7;

_EINT(); LPM1; }

// Timer A0 interrupt service routine #pragma vector=TIMERA0_VECTOR __interrupt void Timer_A (void) {

P6OUT ^= BIT7; // Toggle P6.7 }

/******************************************* 函数名称:delay

功 能:用于消抖的延时 参 数:无 返回值 :无

********************************************/ void delay(void) {

uint tmp;

uchar i;

for(i = 7; i > 0; i--) {

for(tmp = 12000;tmp > 0;tmp--); } }

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

函数名称:PORT1_ISR

功 能:P1端口的中断服务函数 参 数:无 返回值 :无

********************************************/ #pragma vector=PORT1_VECTOR __interrupt void PORT1_ISR(void) {

if(P1IFG & 0x0f) {

switch(P1IFG) {

case 0x01:

if(keyin == 0x0e) //如果是第一个按键被按下 {

delay();

if(keyin == 0x0e) {

while(keyin != 0x0f); //等待按键放开 TACCR0 = 250; // 2KHz TACCTL0 |= CCIE; P2OUT = 0xfe; P1IFG = 0; return; } } case 0x02:

if(keyin == 0x0d) //如果是第二个按键被按下 {

delay();

if(keyin == 0x0d) {

while(keyin != 0x0f); //等待按键放开 TACCR0 = 125; // 4KHz

TACCTL0 |= CCIE; P2OUT = 0x0fd;

P1IFG = 0; return; } } case 0x04:

if(keyin == 0x0b) //如果是第三个按键被按下 {

delay();

if(keyin == 0x0b) case 0x08:

default:

} }

P1IFG = 0; }

{

while(keyin != 0x0f); //等待按键放开 TACCR0 = 83; // 6KHz

TACCTL0 |= CCIE; P2OUT = 0xfb; P1IFG = 0; return; } } if(keyin == 0x07) //如果是第四个按键被按下 {

delay();

if(keyin == 0x07) {

while(keyin != 0x0f); //等待按键放开 P6OUT |= BIT7;

TACCTL0 &= ~CCIE; //停止发声 P2OUT = 0xf7; P1IFG = 0; return; } } while(keyin != 0x0f); //等待按键放开 P1IFG = 0; return;

4*4

16K1

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

程序功能:扫描4X4键盘并将键值在数码管上显示 ------------------------------------------------

跳线设置:将跳线座J3上的短路帽拔下 ------------------------------------------------

测试说明:按动K1~K16按键,观察数码管显示

************************************************/ #include #include \#include \#include \

/********************主函数********************/ void main(void) {

BoardConfig(0x88); //打开数码管,关闭流水灯和电平转换 WDTCTL = WDT_ADLY_1_9; //设置内部看门狗工作在定时器模式,1.9ms中断一次

IE1 |= WDTIE; //使能看门狗中断

P4DIR = 0xff; //设置P4,P5的IO方向为输出 P5DIR = 0xff;

P4OUT = 0x00; //设置P4,P5的输出初值 P5OUT = 0xff;

_EINT(); //打开全局中断 Init_Keypad(); while(1) {

Key_Event();

if(key_Flag == 1) {

key_Flag = 0;

Dispbuf[0] = key_val / 10; Dispbuf[1] = key_val % 10; } } }

/******************************************* 函数名称:watchdog_timer

功 能:看门狗中断服务函数,在这里输出数码管的

段选和位选信号 参 数:无 返回值 :无

********************************************/ #pragma vector=WDT_VECTOR

__interrupt void watchdog_timer(void) {

P5OUT = 0xff;

P4OUT = scandata[Dispbuf[cnt]]; //输出段选信号 P5OUT &= ~(1 << (cnt+2)); //输出位选信号

cnt++; //位计数变量在0~1之间循环 if(cnt == 2) cnt = 0; }

16K2

/*********************************************** 程序功能:扫描4X4键盘并将键值在1602液晶上显示 ------------------------------------------------

跳线设置:将跳线座J3上的短路帽拔下 ------------------------------------------------

测试说明:按动K1~K16按键,观察液晶显示

************************************************/ #include #include \#include \#include \

//引用外部变量的声明

extern unsigned char key_val; extern unsigned char key_Flag;

/********************主函数********************/ void main(void) {

uchar Strings[]={\ uchar temp;

WDTCTL = WDTPW + WDTHOLD; //关闭看门狗

BoardConfig(0xb8); //关闭数码管、流水灯和电平转换

LcdReset(); //初始化LCD Init_Keypad(); //初始化键盘端口

DispNChar(2,0,10,Strings); //显示提示文字 while(1) {

Key_Event();

if(key_Flag == 1) {

key_Flag = 0;

//显示十位

temp = key_val / 10; if(temp)

Disp1Char(6,1,0x30+temp); //数字的ASCII码值等于其本身数值加上0x30

else

Disp1Char(6,1,0x20); //0x20是空格对应的ASCII码 //显示个位

temp = key_val % 10;

Disp1Char(7,1,0x30+temp); } } } 16k3

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

程序功能:扫描4X4键盘并将键值在数码管上显示 ------------------------------------------------

跳线设置:将跳线座J3上的短路帽拔下 ------------------------------------------------

测试说明:按动K1~K16按键,观察数码管显示,聆听 按键时蜂鸣器是否发声

************************************************/ #include #include \#include \#include \

/********************主函数********************/ void main(void) {

uint i;

BoardConfig(0x80); //打开数码管、流水灯,关闭电平转换

WDTCTL = WDT_ADLY_1_9; //设置内部看门狗工作在定时器模式,1.9ms中断一次

IE1 |= WDTIE; //使能看门狗中断

P2DIR = 0xff;

P4DIR = 0xff; //设置P4,P5的IO方向为输出 P5DIR = 0xff; P6DIR |= BIT7; P2OUT = 0xff;

P4OUT = 0x00; //设置P4,P5的输出初值 P5OUT = 0xff; P6OUT |= BIT7;

_EINT(); //打开全局中断 Init_Keypad(); while(1) {

Key_Event();

if(key_Flag == 1) {

key_Flag = 0;

Dispbuf[0] = key_val / 10; Dispbuf[1] = key_val % 10;

P2OUT = ~(key_val); //LED显示键值 P6OUT = 0; //蜂鸣器响一声 for(i = 2000; i > 0; i--); P6OUT |= BIT7; } } }

/******************************************* 函数名称:watchdog_timer

功 能:看门狗中断服务函数,在这里输出数码管的 段选和位选信号 参 数:无 返回值 :无

********************************************/ #pragma vector=WDT_VECTOR

__interrupt void watchdog_timer(void) {

P5OUT = 0xff;

P4OUT = scandata[Dispbuf[cnt]]; //输出段选信号 P5OUT &= ~(1 << (cnt+2)); //输出位选信号

cnt++; //位计数变量在0~1之间循环 if(cnt == 2) cnt = 0; }

5、 3.3—5v电平转换

(1)

/*********************************************************** 程序功能:通过74LVC4245在连接器P2的引脚上产生5v 电平的百分之五十占空比的方波。 ------------------------------------------------------------

跳线设置:将跳线座J4的3脚和2脚(靠左侧的两个)用短路帽连接 ------------------------------------------------------------

测试说明:用户可以通过示波器观察连接器P7的2--9脚输出的信号波 形和幅值。

************************************************************/ #include #include \

/********************主函数********************/ void main(void) {

WDTCTL = WDTPW + WDTHOLD; //关闭看门狗

BoardConfig(0x38); //关闭数码管、流水灯、打开电平转换

P3DIR |= BIT4; //设置P3.4为输出 P5DIR = 0xff; P5OUT = 0x00;

TBCCTL0 = CCIE; //允许CCR0比较中断 TBCCR0 = 50000;

TBCTL = TBSSEL_2 + MC_2; //计数时钟SMCLK,连续计数模式

_EINT(); //打开全局中断 LPM0; //进入LPM0模式 }

/******************************************* 函数名称:TimerB_ISR

功 能:定时器B的中断服务函数 参 数:无 返回值 :无

********************************************/ #pragma vector = TIMERB0_VECTOR __interrupt void TimerB_ISR(void) {

P3OUT ^= BIT4; //P3.4连接的LED闪烁 P5OUT ^= 0xff; //P5口输出50%占空比方波 TBCCR0 += 50000; //TBCCR0增加偏置量 }

(2)

/*************************************************************** 程序功能:在连接器P7的第9引脚输出PWM波形,其占空比依次为 25%,50%,75%;每个占空比的波形持续时间5S ----------------------------------------------------------------

跳线设置:将跳线座J4的2脚和3脚用短路帽连接(靠右侧的两个) ----------------------------------------------------------------

测试说明:用示波器观察P7的第9引脚的波形(P7的右侧起是第1引脚) ****************************************************************/ #include #include \

/**********************主函数****************/ void main(void) {

WDTCTL = WDTPW + WDTHOLD; // 关狗

BoardConfig(0x38); // 打开电平转换,关闭流水灯和蜂鸣器 P1DIR |= BIT7; // P1.7选择为输出

P1SEL |= BIT7; // P1.7作为TA的OUT2输出 CCR0 = 128; // PWM Period

CCTL2 = OUTMOD_6; // CCR2 toggle/set CCR2 = 32; // CCR2 PWM duty cycle TACTL = TASSEL_1 + MC_3; // ACLK, up-down mode

TBCCR0 = 4096*5-1; //定时5S

TBCTL = TBSSEL_1 + ID_3 + MC_1; // 时钟源ACLK/8 _BIS_SR(LPM3_bits); // Enter LPM3 }

/******************************************* 函数名称:Timer_B

功 能:定时器B的中断服务函数,在这里更改 PWM的占空比 参 数:无

返回值 :无

********************************************/ #pragma vector=TIMERB0_VECTOR __interrupt void Timer_B(void) {

CCR2 += 32;

if(CCR2 == 128) CCR2 = 32; }

(3)

/**************************************************************** 程序功能:将MCU片内的MCLK,SMCLK和ACLK三个信号转换成5V电平信号 -----------------------------------------------------------------

测试说明:用户可以用示波器测量连接器P7的第6、7、8三个引脚的 输出波形(P7的右侧起是第1引脚)

****************************************************************/ #include #include \

void main(void) {

BoardConfig(0x38); // 打开电平转换,关闭流水灯和数码管 WDTCTL = WDTPW +WDTHOLD; // 关狗 DCOCTL = DCO0 + DCO1 + DCO2; // Max DCO BCSCTL1 = RSEL0 + RSEL1 + RSEL2; // XT2on, max RSEL BCSCTL2 |= SELS; // SMCLK = XT2 P5DIR |= 0x70; // P5.6,5,4 outputs P5SEL |= 0x70; // P5.6,5,5 options

while(1); }

(4)

/*********************************************************** 程序功能:通过74LVC4245在连接器P2的引脚上产生5v ------------------------------------------------------------

跳线设置:将跳线座J4的3脚和2脚(靠左侧的两个)用短路帽连接 ------------------------------------------------------------

测试说明:用户可以通过万用表测试连接器P7的2--9脚输出的信号 ************************************************************/ #include #include \

/********************主函数********************/ void main(void) {

WDTCTL = WDTPW + WDTHOLD; //关闭看门狗

BoardConfig(0x38); //关闭数码管、流水灯、打开电平转换

P5DIR = 0xff; P5OUT = 0xff;

_EINT(); //打开全局中断 LPM0; //进入LPM0模式 }

6、 1602液晶显示

(1)

/*************************************************** 程序功能:动态显示文字“welcome!” ----------------------------------------------------

测试说明:观察液晶显示

****************************************************/ #include

#include \ #include \

uchar *s1 = \

void main( void ) {

uchar i;

WDTCTL = WDT_ADLY_250; //间隔定时器,定时16ms

BoardConfig(0xb8); //关闭数码管、流水灯和电平转换

LcdReset(); DispStr(4,0,s1);

LocateXY(0,9); //确定写入字符的显示位置 LcdWriteCommand(0x07, 1); //整体显示左移 for(i = 12; i > 0; i--) {

LcdWriteData(0x20); //延时250ms

IFG1 &= ~WDTIFG;

while(!(IFG1 & WDTIFG)); IFG1 &= ~WDTIFG; }

while(1) {

LcdWriteCommand(0x05, 1); //整体显示右移

for(i = 24; i > 0; i--) {

LcdWriteData(0x20); //延时250ms IFG1 &= ~WDTIFG;

while(!(IFG1 & WDTIFG)); IFG1 &= ~WDTIFG; }

LcdWriteCommand(0x07, 1); //整体显示左移

for(i = 24; i > 0; i--) {

LcdWriteData(0x20); //延时250ms IFG1 &= ~WDTIFG;

while(!(IFG1 & WDTIFG)); IFG1 &= ~WDTIFG; } } }

(2)

/*************************************************** 程序功能:静态显示各种字符

---------------------------------------------------- 测试说明:观察液晶显示

****************************************************/ #include

#include \ #include \

uchar shuzi[] = {\

uchar zimu1[] = {\

uchar zimu2[] = {%uchar *fuhao = \、;'<>?:%uchar *jieshu = \

/***********************主函数************************/ void main( void ) {

uchar i;

WDTCTL = WDT_ADLY_1000; BoardConfig(0xb8);

LcdReset();

DispNChar(3,0,10,shuzi); //延时2s

for(i = 0; i < 3; i++) {

IFG1 &= ~WDTIFG;

while(!(IFG1 & WDTIFG)); IFG1 &= ~WDTIFG; }

LcdWriteCommand(0x01, 1); DispNChar(0,0,26,zimu1); //延时2s

for(i = 0; i < 3; i++) {

IFG1 &= ~WDTIFG;

while(!(IFG1 & WDTIFG)); IFG1 &= ~WDTIFG; }

LcdWriteCommand(0x01, 1); DispNChar(0,0,26,zimu2); //延时2s

for(i = 0; i < 3; i++) {

IFG1 &= ~WDTIFG;

while(!(IFG1 & WDTIFG)); IFG1 &= ~WDTIFG; }

LcdWriteCommand(0x01, 1); DispStr(0,0,fuhao);

//间隔定时器,定时1000ms //关闭数码管、流水灯和电平转换//清除显示 //清除显示 //清除显示

//延时2s

for(i = 0; i < 3; i++) {

IFG1 &= ~WDTIFG;

while(!(IFG1 & WDTIFG)); IFG1 &= ~WDTIFG; }

LcdWriteCommand(0x01, 1); //清除显示 DispStr(0,0,jieshu); while(1); }

(3)

/***************************************************** 程序功能:在1602液晶上显示用MCU的TimerA模拟的数字 式实时时钟。

----------------------------------------------------- 测试说明:观察液晶显示

*****************************************************/ #include #include \#include \#include \

uchar tishi[]={\ //提示信息 extern uchar second,minute,hour,hour0; extern uchar pmin,phour,ps1;

#define SetTime(H,M,S) {second=S;minute=M;hour=H;hour0=H;}

/*************************主函数************************/ void main(void) {

WDTCTL = WDTPW + WDTHOLD; //关闭看门狗

BoardConfig(0xb8); //关闭74LVC4245,数码管和流水灯

CCR0 = 32768 - 1; //设置定时器A的中断时间为1S TACTL = TASSEL_1 + MC_1; //计数时钟ACLK, 增计数模式 CCTL0 |= CCIE; //使能CCR0比较中断 _EINT(); //打开全局中断

//请在此处设置正确时间

SetTime(8,26,50); //顺序:时,分,秒,格式:BCD码

LcdReset();

DispNChar(0,0,15,tishi); //显示提示文字 Disp1Char(6,1,':'); //显示字符 : Disp1Char(9,1,':');

while(1) {

LPM3; //进入LPM3低功耗模式 Display(); } }

/******************************************* 函数名称:TimerA_ISR

功 能:定时器A的中断服务函数 参 数:无 返回值 :无

********************************************/ #pragma vector=TIMERA0_VECTOR __interrupt void TimerA_ISR(void) {

Clock(); LPM3_EXIT; } 7、 RS232

(1)、

/***************************************************** 程序功能:MCU不停向PC机发送数据,在屏幕上显示0~127对应 的ASCII字符

------------------------------------------------------ 通信格式:N.8.1, 2400

------------------------------------------------------

测试说明:打开串口调试助手,正确设置通信格式,观察屏幕 ******************************************************/

#include #include \

void Delays(void);

void PutString(uchar *ptr);

/********************主函数**********************/ void main(void) {

uchar *tishi = \

\\n screen will display their corresponding\\ \\n ASCII code as follows:\ uchar value = 0;

WDTCTL = WDTPW + WDTHOLD; // 关狗

BoardConfig(0xb8); // 关流水灯、蜂鸣器和数码管 P3SEL |= 0x30; // P3.4,5选择为UART收发端口 ME1 |= UTXE0 + URXE0; // 使能USART0收发 UCTL0 |= CHAR; // 8-bit character UTCTL0 |= SSEL0; // UCLK = ACLK

UBR00 = 0x0D; // 32k/2400 - 13.65 UBR10 = 0x00; //

UMCTL0 = 0x6B; // Modulation

UCTL0 &= ~SWRST; // 初始化UART0状态机 IE1 |= URXIE0; // 使能接收中断 _EINT();

PutString(tishi); while(1) {

while (!(IFG1 & UTXIFG0)); TXBUF0 = value++;

value &= 0x7f; // 保证value的数值小于128 while (!(IFG1 & UTXIFG0)); TXBUF0 = '\\n'; Delays(); } }

/******************************************* 函数名称:PutSting

功 能:向PC机发送字符串 参 数:无 返回值 :无

********************************************/ void PutString(uchar *ptr) {

while(*ptr != '\\0')

{

while (!(IFG1 & UTXIFG0)); // TX缓存空闲? TXBUF0 = *ptr++; // 发送数据 }

while (!(IFG1 & UTXIFG0)); TXBUF0 = '\\n'; }

/******************************************* 函数名称:Delays 功 能:延时一会 参 数:无 返回值 :无

********************************************/ void Delays(void) {

uchar i=20; uint j;

while(i--) {

j=2000; while(j--); } }

(2)、

/**************************************************** 程序功能:MCU通过串口向PC机发送4X4键盘的键值 ----------------------------------------------------- 通信格式:N.8.1, 9600

------------------------------------------------------

测试说明:打开串口调试助手,正确设置通信格式,按动4X4 键盘观察屏幕显示的按键键值。

****************************************************/ #include #include \#include \

//引用外部变量的声明

extern unsigned char key_Pressed; extern unsigned char key_val; extern unsigned char key_Flag;

void PutString(uchar *ptr); void PutChar(uchar zifu);

/*******************主函数*******************/ void main(void) {

uchar *tishi = \ BoardConfig(0xb8);

WDTCTL = WDTPW + WDTHOLD; // Stop WDT

P3SEL |= 0x30; // P3.4,5 = USART0 TXD/RXD ME1 |= UTXE0; // Enable USART0 TXD/RXD UCTL0 |= CHAR; // 8-bit character UTCTL0 |= SSEL0; // UCLK = ACLK UBR00 = 0x03; // 32k/9600 - 3.41 UBR10 = 0x00; //

UMCTL0 = 0x4A; // Modulation

UCTL0 &= ~SWRST; // Initialize USART state machine

Init_Keypad(); //初始化键盘端口 while(1) {

Key_Event();

if(key_Flag == 1) {

key_Flag = 0; PutString(tishi); PutChar(key_val); } } }

/******************************************* 函数名称:PutSting

功 能:向PC机发送字符串

参 数:ptr--指向发送字符串的指针 返回值 :无

********************************************/ void PutString(uchar *ptr) {

while(*ptr != '\\0') {

while (!(IFG1 & UTXIFG0)); // TX缓存空闲? TXBUF0 = *ptr++; // 发送数据 }

while (!(IFG1 & UTXIFG0));

TXBUF0 = '\\n'; }

/******************************************* 函数名称:PutChar

功 能:向PC机发送一个字符对应的ASCII码 参 数:zifu--发送的字符 返回值 :无

********************************************/ void PutChar(uchar zifu) {

while (!(IFG1 & UTXIFG0));

if(zifu > 9) //发送键值1~16对应的ASCII码 {

TXBUF0 = 0x30 + zifu/10; while (!(IFG1 & UTXIFG0)); TXBUF0 = 0x30 + zifu; } else {

TXBUF0 = 0x30 + zifu; }

while (!(IFG1 & UTXIFG0));

TXBUF0 = '\\n'; //发送回车字符 }

(3)、

/****************************************************** 程序功能:PC通过串口调试精灵向MCU发送数据,MCU将其在1602 液晶上显示

-------------------------------------------------------

通信格式:N.8.1, 9600

------------------------------------------------------

测试说明:打开串口调试助手,正确设置通信格式,向从PC机上 向学习板发送数据,观察液晶上显示的字符。

******************************************************/ #include #include \#include \

void InitUART(void);

void PutString(uchar *ptr);

/***************主函数************/

void main( void ) {

uchar pX=0,pY=0;

uchar *tishi = \

WDTCTL = WDTPW + WDTHOLD; //关狗 BoardConfig(0xb8);

InitUART(); //初始化UART LcdReset(); //初始化LCD

PutString(tishi); while(1) {

if(IFG1 & URXIFG0) //如果收到字符 {

Disp1Char(pX++,pY,U0RXBUF); if(pX == 16) {

pX = 0; pY ^= 1; } } } }

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

函数名称:PutSting

功 能:向PC机发送字符串

参 数:ptr--指向发送字符串的指针 返回值 :无

********************************************/ void PutString(uchar *ptr) {

while(*ptr != '\\0') {

while (!(IFG1 & UTXIFG0)); // TX缓存空闲? TXBUF0 = *ptr++; // 发送数据 }

while (!(IFG1 & UTXIFG0)); TXBUF0 = '\\n'; }

/******************************************* 函数名称:InitUART

功 能:初始化UART端口 参 数:无 返回值 :无

********************************************/ void InitUART(void) {

P3SEL |= 0x30; // P3.4,5 = USART0 TXD/RXD

ME1 |= URXE0 + UTXE0; // Enable USART0 T/RXD UCTL0 |= CHAR; // 8-bit character UTCTL0 |= SSEL0; // UCLK = ACLK UBR00 = 0x03; // 32k/9600 - 3.41 UBR10 = 0x00; //

UMCTL0 = 0x4A; // Modulation

UCTL0 &= ~SWRST; // Initialize USART state machine }

(4)、

/****************************************************** 程序功能:接收来自PC机的字符,然后重新发送给PC机 ------------------------------------------------------- 通信格式:N.8.1, 9600

无校验,8个数据位,1个停止位,波特率9600 ------------------------------------------------------

测试说明:打开串口调试助手,正确设置通信格式,向学习板 发送一个字符,观察是否收到回发的字符,以及是否 正确

*******************************************************/ #include #include \

/********************主函数********************/ void main(void) {

WDTCTL = WDTPW + WDTHOLD; // 关闭看门狗

BoardConfig(0xb8); // 关闭数码管、流水灯和电平转换

P3SEL |= 0x30; // 选择P3.4和P3.5做UART通信端口 ME1 |= UTXE0 + URXE0; // 使能USART0的发送和接受 UCTL0 |= CHAR; // 选择8位字符 UTCTL0 |= SSEL0; // UCLK = ACLK UBR00 = 0x03; // 波特率9600 UBR10 = 0x00; //

UMCTL0 = 0x4A; // Modulation

UCTL0 &= ~SWRST; // 初始化UART状态机 IE1 |= URXIE0; // 使能USART0的接收中断

while(1) {

_EINT(); //打开全局中断 LPM1; //进入LPM1模式 while (!(IFG1 & UTXIFG0)); //等待以前的字符发送完毕 TXBUF0 = RXBUF0; //将收到的字符发送出去 } }

/******************************************* 函数名称:UART0_RXISR

功 能:UART0的接收中断服务函数,在这里唤醒 CPU,使它退出低功耗模式 参 数:无 返回值 :无

********************************************/ #pragma vector = UART0RX_VECTOR __interrupt void UART0_RXISR(void) {

LPM1_EXIT; //退出低功耗模式 }

(5)、

/********************************************************* 程序功能:用固定频率的方波驱动蜂鸣器,共16种音调;在蜂鸣器 发出不同音调的同时,一个数码管显示音调的编号。 PC机发送字符决定蜂鸣器发出何种鸣响音 ----------------------------------------------------------- 通信格式:N.8.1, 9600

-----------------------------------------------------------

测试说明:打开串口调试助手,正确设置通信格式,由PC机向串口 发送0~F十六个十六进制数字,观察蜂鸣器发声和数码管 的显示情况

**********************************************************/ #include #include \#include \

uchar step = 0xff;

/**************************主函数**************************/

void main( void ) {

uchar i;

WDTCTL = WDTPW + WDTHOLD; //关狗

BoardConfig(0x88); //开数码管,关流水灯和电平转换

/*------选择系统主时钟为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 _EINT();

P6DIR = BIT7; //蜂鸣器对应IO设置为输出 P6OUT = BIT7; P4DIR = 0xff; P5DIR = 0xff; P4OUT = 0x00; P5OUT = ~0x04;

InitUART(); //初始化UART端口

DisplayConfigMenu(); while(1) {

Send1Char('>'); Send1Char('\\n'); i=Get1Char();

HandleConfigMenu(i); } }

/******************************************* 函数名称:Timer_A

功 能:定时器A的中断服务函数,在这里驱动 蜂鸣器发声

参 数:无 返回值 :无

********************************************/ #pragma vector=TIMERA0_VECTOR __interrupt void Timer_A (void) {

P6OUT ^= BIT7; // Toggle P6.7 }

8、 RS485

9、 USB

参 数:无 返回值 :无

********************************************/ #pragma vector=TIMERA0_VECTOR __interrupt void Timer_A (void) {

P6OUT ^= BIT7; // Toggle P6.7 }

8、 RS485

9、 USB

本文来源:https://www.bwwdw.com/article/lvir.html

Top