MSP430F249 驱动直流电机控制程序:按键控制正反转和速度调节
#include <msp430f249.h> #define key1 0x01 #define key2 0x02 #define key3 0x03 #define key4 0x04 void key_process_1(void); void key_process_2(void); void key_process_3(void); void key_process_4(void); void key_check(void); unsigned char key_value; \t\t//定时全局变量,键值 unsigned int a=10000; \t\t\t\t//初值50%的占空比 void main(void) { \t\tWDTCTL=WDTPW+WDTHOLD; \t\t//停止看门狗 \t\tBCSCTL2|=SELS;
\t\tP1SEL|=BIT2; \t\tP1DIR=0xff; \t\t\t\t\t\t//P1口为输出
\t\tCCR0=20000; \t\t\t\t\t\t//PWM周期为2.5ms \t\tCCTL1=OUTMOD_7; \t\t\t//CCR1复位/置位 \t\tCCR1=a; \t\t\t\t\t\t//CCR1占空比5% \t\tTACTL=TASSEL_2+MC_1+TACLR; \t\t//定时器A选择SMCLK,增计数模式
\t\tP2IE=0x27; \t\t\t\t\t//P2.0~2.3中断使能 \t\tP2IES=0x27; \t\t\t\t// P2.0~2.3下降沿触发中断方式 \t\tP2IFG=0x0; \t\t\t\t\t// P2.0~2.3中断标志位清零 \t\t_EINT(); \t\t\t\t\t//中断允许 \t\twhile(1) \t\t{ \t\t\tif(P2IN&BIT4) \t\t\t{ \t\t\t\tP1OUT&=~(BIT4+BIT7); \t\t//正转 \t\t\t\tP1OUT|=BIT0+BIT5; \t\t\t} \t\t\telse \t\t\t{ \t\t\t\tP1OUT&=~(BIT0+BIT5); \t\t//反转 \t\t\t\tP1OUT|=BIT4+BIT7; \t\t\t} \t\t\tCCR1=a; \t\t\tkey_check(); \t\t\tswitch(key_value) \t\t\t//对键值进行处理, \t\t\t{ \t\t\tcase key1:key_process_1(); \t\t//调用键值为1的处理程序 \t\t\t\tbreak; \t\t\tcase key2:key_process_2(); \t\t//调用键值为2的处理程序 \t\t\t\tbreak; \t\t\tcase key3:key_process_3(); \t\t//调用键值为3的处理程序 \t\t\t\tbreak; \t\t\tcase key4:key_process_4(); \t\t//调用键值为4的处理程序 \t\t\t\tbreak; \t\t\tdefault:break; \t\t\t} \t\t\tkey_value=0x00; \t\t\t\t// \t键值处理 \t\t\tP2IE=0x27; \t\t\t\t//P2.0~2.3中断使能 \t\t\tP2IFG=0x0; \t\t\t\t//清除P2.0~2.3端口中断标志位
\t\t} } #pragma vector=PORT2_VECTOR __interrupt void Port_2(void) \t\t\t//中断服务程序 { switch(P2IFG) \t{ \t\tcase 0x01:key_value=0x01; \t\t\tbreak; \t\tcase 0x02:key_value=0x02; \t\t\tbreak; \t\tcase 0x04:key_value=0x03; \t\t\tbreak; \t\tcase 0x20:key_value=0x04; \t\t\tbreak; \t\tdefault:P2IFG=0x0; \t\t\t//P2.0~P2.2I/O端口中断标志位清零 \t\t\tbreak; \t} \tP2IFG=0x0; \t\t\t\t\t//P2.0~P2.2I/O端口中断标志位清零 } void key_check(void) { P2IE |= 0x27; //使能P2.0、P2.1、P2.2和P2.7的中断 P2IES |= 0x27; //设置P2.0、P2.1、P2.2和P2.7的中断触发边沿为下降沿触发 P2IFG &= ~0x27; //清除P2.0、P2.1、P2.2和P2.7的中断标志位 __bis_SR_register(GIE); //使能总中断 }
#pragma vector=PORT2_VECTOR __interrupt void Port_2(void) { \t//unsigned char temp; \tunsigned int i;
\tif(0x27!=(P2IN&0x27)) \t\t//是否有键按下? \t{
\t\tfor(i=0;i<200;i++); \t\twhile(0x27!= (P2IN&0x27)); \t\t//一直等待按键松开
\t} \tP2IFG &= ~0x27; //清除P2.0、P2.1、P2.2和P2.7的中断标志位 } void key_process_1(void) \t\t\t\t\t//启动 { \tP1SEL|=0x04; \t\t\t\t\t\t//P1.2第二功能TA1输出PWM \tTACTL=TASSEL_2+MC_1; \t\t//定时器A时钟源为SMCLK,增计数模式 } void key_process_2(void) \t\t\t\t\t//停止 { \tP1SEL|=0x0; \t\t\t\t\t\t// \tTACTL= MC_0; \t\t// \tP1OUT&=~BIT2; } void key_process_3(void) \t\t\t\t\t// \t加速 { \ta+=1000; \tif(a>=20000) a=20000; } void key_process_4(void) \t\t\t\t\t// \t减速 { \ta-=1000; \tif(a<=0) a=0; } 在这段程序中,直流电机停止时正反转指示灯是否会熄灭内容:在这段程序中,直流电机停止时正反转指示灯不会熄灭。
原文地址: https://www.cveoy.top/t/topic/pxdQ 著作权归作者所有。请勿转载和采集!