MSP430单片机串口控制5路PWM频率变化程序
下面介绍一段MSP430单片机通过232串口发送0x00,0x01,0x02,0x03,0x04控制IO端口P1,P2,P4,P5,P6输出6路PWM波形变化的程序,单片机发送0x05,IO端口P1,P2,P4,P5,P6输出PWM为0。单片机的电路如下图
程序如下:链接:/s/1-vcBVWfkaSu8C81LeTFqmw ;
提取码:18fo
/IHXUku45
/***********************************************
程序功能:实现流水灯以三种流动方式和四种流动速度
的不同组合而进行点亮"流动"
通过232串口发送0x00,0x01,0x02,0x03,0x04调节P1,P2,P4,P5,P6的6个管脚输出PWM波形的频率由小变大
通过232串口发送0x05调节P1,P2,P4,P5,P6的6个管脚输出PWM波形为零
程序功能:MCU通过串口向PC机发送4X4键盘的键值
通信格式:N.8.1, 9600
拨码开关设置:将LED位拨至ON,其余拨至OFF
测试说明:观察流水灯流动顺序和速度的变化
************************************************/
#include <msp430x14x.h>
//#include “flash.h”
typedef unsigned int uint;
typedef unsigned char uchar;
//void write_flash_char();
void writeflashchar(unsigned int addr,char *array,int count) ;
void writeflashint(unsigned int addr,int *array,int count) ;
void Delay400ms();
void delay();
void Delay5ms();
uint i = 0,j = 0,dir = 0;
uint flag = 0,speed = 0; //flag–灯光流动方式,speed–灯光流动速度
uint tmp;
uint m;
// uint tmp1=12000;
// uint tmp2=1200;
// uint tmp3=12000;
// uint tmp4=1200;
// uint tmp5=12000;
uchar shuju;
int shuju1;
/主函数/
void main(void)
{
/*下面六行程序关闭所有的IO口*/P1DIR = 0XFF;P1OUT = 0XFF;P2DIR = 0XFF;P2OUT = 0XFF;P3DIR = 0XFF;P3OUT = 0XFF;P4DIR = 0XFF;P4OUT = 0XFF;P5DIR = 0XFF;P5OUT = 0XFF;P6DIR = 0XFF;P6OUT = 0X00;WDTCTL = WDTPW + WDTHOLD; //关闭看门狗P6DIR |= BIT2;P6OUT |= BIT2; //关闭电平转换P5OUT &= ~BIT7;CCTL0 = CCIE; //使能CCR0中断CCR0 = 50000;TACTL = TASSEL_2 + ID_3 + MC_1; //定时器A的时钟源选择SMCLK,增计数模式P2DIR = 0xff; //设置P2口方向为输出P2OUT = 0xff;
P1DIR = 0xff; //设置P2口方向为输出
P1OUT = 0xff;
P4DIR = 0xff; //设置P2口方向为输出
P4OUT = 0xff;
P5DIR = 0xff; //设置P2口方向为输出
P5OUT = 0xff;
P6DIR = 0xff; //设置P2口方向为输出
P6OUT = 0xff;
// tmp=12000;
// LPM0; //CPU进入LPM0模式/
P3SEL |= 0x30; // 选择P3.4和P3.5做UART通信端口ME1 |= UTXE0 + URXE0; // 使能USART0的发送和接受UCTL0 |= CHAR; // 选择8位字符UTCTL0 |= SSEL0;// UCLK = ACLKUBR00 = 0x03; // 波特率9600UBR10 = 0x00; //UMCTL0 = 0x4A; // ModulationUCTL0 &= ~SWRST;// 初始化UART状态机IE1 |= URXIE0; // 使能USART0的接收中断_EINT(); //使能全局中断// LPM1; while(1){//_EINT(); //打开全局中断//进入LPM1模式// while (!(IFG1 & UTXIFG0)); //等待以前的字符发送完毕// TXBUF0 = RXBUF0; //将收到的字符发送出去 // write_flash_char(0xef,*shuju,4);//write_flash_int(0xbf,shuju1,2);// void writeflashchar(0xff,0x01,2) ;
// char *Flash_ptr; //Flash pointer;
//int i;
// FCTL1=FWKEY+ERASE; //set erase bit
// FCTL3=FWKEY; //Clear Lock bit
// *Flash_ptr=0; //Dummy write to erase Flash segment
// FCTL1=FWKEY +WRT; //Set WRT bit for write operation
// Flash_ptr=0x1001; //initialize flash pointer
// for (i=0;i<count;i++)
// {
// *Flash_ptr++=array[i]; //write value to flash
// }
// FCTL1=FWKEY; //Clear WRT bit
// FCTL3=FWKEY+LOCK;// Set LOCK bit
//switch(shuju)/// switch(RXBUF0)//{//case 0x00:// if (TXBUF0=0x00)// if (shuju==0x00)// {//tmp=12000;//m=5;// break;// m++;//tmp--;// }//if (TXBUF0=0x01)// if (shuju==0x01)//{//tmp=1200;// case 0x01://m=10;//break;// tmp++;// }//if(TXBUF0=0X02)// if (shuju==0x02)
// {
// tmp=5000;
//tmp=tmp;
//case 0x02:
//m=25;
//break;
// }
// if(TXBUF0=0X03)
// if (shuju0x03) // { //tmp=20000; //tmp=tmp; // case 0x03: // m=40; // break; // } // if(TXBUF0=0X04) // if (shuju
//{
// tmp=100;
//tmp=tmp;
// case 0x04:
// m=50;
// break;
// }
// if (shuju==0x05)
// {
//tmp=50000;
//tmp=tmp;
// case 0x05:
// m=100;
// break;
// default:
// m=0;
// break;
//}
//}
}
}
/*******************************************
函数名称:Timer_A
功 能:定时器A的中断服务函数,在这里通过标志
控制流水灯的流动方向和流动速度
参 数:无
返回值 :无
********************************************/
#pragma vector = TIMERA0_VECTOR
__interrupt void Timer_A (void)
{
//if(flag == 0)
// {
//P2OUT = ~(0x80>>(i++)); //灯的点亮顺序D8 -> D1
// P2OUT =~(0x80>>4);
// while (!(IFG1 & UTXIFG0)); //等待以前的字符发送完毕
// TXBUF0 = RXBUF0; //将收到的字符发送出去
//P2OUT &= ~0x01;
P2OUT &= ~0x3F;
// P2OUT =~(0x3F);
// delay(tmp);
Delay400ms( m);
//delay(12000);
// P2OUT =~(0x00>>1);
P2OUT =~(0x00);
//delay(12000);
// delay(tmp);
Delay400ms( m);
P1OUT =~(0x3F);
// delay(12000);
//delay(tmp);
Delay400ms( m);
P1OUT =~(0x00);
//delay(12000);
// delay(tmp);
Delay400ms( m);
//delay(12000);
P4OUT =~(0x3F);
// delay(12000);
Delay400ms( m);
//delay(tmp);
P4OUT =~(0x00);
// delay(12000);
//delay(tmp);
Delay400ms( m);
P5OUT =~(0x3F);
//delay(12000);
// delay(tmp);
Delay400ms( m);
P5OUT =~(0x00);
// delay(12000);
//delay(tmp);
Delay400ms( m);
P6OUT =~(0x3F);
//delay(12000);
//delay(tmp);
Delay400ms( m);
P6OUT =~(0x00);
// delay(12000);
Delay400ms( m);
// delay(tmp);
//}
// 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;
//}
}
/*******************************************
函数名称:Delay5ms
功 能:延时约5ms
参 数:无
返回值 :无
*/ void Delay5ms(void) { uint i=40000; while (i != 0) { i–; } } /
函数名称:Delay400ms
功 能:延时约400ms
参 数:无
返回值 :无
********************************************/
void Delay400ms(uint m)
{
//uchar i=50;
uint j;
while(m--){//j=7269;j=1000;while(j--);}
}
/*******************************************
函数名称:delay
功 能:延时约15ms,完成消抖功能
参 数:无
返回值 :无
********************************************/
void delay(uint tmp)
{
// uint tmp;
// for(tmp = 12000;tmp > 0;tmp–);
for(tmp =tmp;tmp > 0;tmp–);
}
/*******************************************
函数名称:UART0_RXISR
功 能:UART0的接收中断服务函数,在这里唤醒
CPU,使它退出低功耗模式
参 数:无
返回值 :无
********************************************/
#pragma vector = UART0RX_VECTOR
__interrupt void UART0_RXISR(void)
{
while (!(IFG1 & UTXIFG0)); //等待以前的字符发送完毕
TXBUF0 = RXBUF0; //将收到的字符发送出去
shuju=RXBUF0;
switch(RXBUF0)
{
case 0x00:
// if (TXBUF0=0x00)
// if (shuju==0x00)
// {
//tmp=12000;
m=5;
break;
// m++;
//tmp–;
// }//if (TXBUF0=0x01)// if (shuju==0x01)//{//tmp=1200;case 0x01:m=10;break;// tmp++;// }//if(TXBUF0=0X02)// if (shuju==0x02)
// {
// tmp=5000;
//tmp=tmp;
case 0x02:
m=25;
break;
// }
// if(TXBUF0=0X03)
// if (shuju0x03) // { //tmp=20000; //tmp=tmp; case 0x03: m=40; break; // } // if(TXBUF0=0X04) // if (shuju
//{
// tmp=100;
//tmp=tmp;
case 0x04:
m=50;
break;
// }
// if (shuju==0x05)
// {
//tmp=50000;
//tmp=tmp;
case 0x05:
m=100;
break;
default:
m=0;
break;
}
// tmp=TXBUF0;
// LPM1_EXIT; //退出低功耗模式
}
图片
如果觉得《MSP430单片机串口控制5路PWM频率变化程序》对你有帮助,请点赞、收藏,并留下你的观点哦!