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。单片机的电路如下图
程序如下:链接:https://pan.baidu.com/s/1-vcBVWfkaSu8C81LeTFqmw ;
提取码:18fo
https://share.weiyun.com/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;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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 = ACLK
UBR00 = 0x03; // 波特率9600
UBR10 = 0x00; //
UMCTL0 = 0x4A; // Modulation
UCTL0 &= ~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) ;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// 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; //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)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// {
// 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 (shuju0x04)
//{
// 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--);
}
1
2
3
4
5
6
}
/*******************************************
函数名称: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)
1
2
3
4
5
6
7
8
9
10
11
12
// {
// 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 (shuju0x04)
//{
// 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;
1
// LPM1_EXIT; //退出低功耗模式
}
图片
————————————————
版权声明:本文为CSDN博主「科技论坛」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zhangluan2019/article/details/109466186