MSP430入门学习程序
更新时间:2024-04-01 22:39:01 阅读量: 综合文库 文档下载
- msp430怎么学推荐度:
- 相关推荐
1、 点亮LED
(1)、闪烁灯
/*************************************************** 程序功能:控制8个LED闪烁,用于测试下载功能是否正常 --------------------------------------------------- 测试说明:观察LED闪烁
***************************************************/ #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
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
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
//数码管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
//数码管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
#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
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
#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
#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
#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
#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
#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
/********************主函数********************/ 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
//引用外部变量的声明
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
/********************主函数********************/ 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
/********************主函数********************/ 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
/**********************主函数****************/ 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
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
/********************主函数********************/ 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
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
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
//引用外部变量的声明
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
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
/********************主函数********************/ 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
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
正在阅读:
MSP430入门学习程序04-01
浙江省金华市十校2018-2019学年高二上学期期末联考数学试题Word版含答案08-11
海南省公务员考试模拟试题及答案:资料分析部分(第二套)03-08
ARM - Cortex-M3内核结构10-29
全国2013年10月自学考试公共关系学试题及参考答案07-29
机务基础执照笔试部分M3模块考题03-09
鲁迅《雪》读后感205-30
matlab实验报告10-01
大气污染控制工程重点06-15
- 冀教版版五年级科学下册复习资料
- 微生物学复习提纲
- 2013—2014学年小学第二学期教研组工作总结
- 国有土地转让委托服务合同协议范本模板
- 我的固废说明书
- 企业管理诊断报告格式
- 东鼎雅苑施工组织设计
- 谈谈如何做好基层党支部书记工作
- 浮梁县环保局市级文明单位创建工作汇报
- 管理学基础知识
- 大学物理实验报告23 - PN结温度传感器特性1
- 计算机网络实践
- 酒桌上这四种情况下要坐牢,千万别不当回事……
- 国家康居示范工程建设技术要点
- 中国贴布行业市场调查研究报告(目录) - 图文
- 新课标下如何在高中物理教学中培养学生的创新能力初探
- 营养师冬季养生食谱每日一练(7月4日)
- 关注江西2017年第3期药品质量公告
- 建设海绵城市专题习题汇总
- 10万吨年环保净水剂建设项目报告书(2).pdf - 图文
- 入门
- 程序
- MSP430
- 学习