![]() |
中国面包师贴吧-楼主(阅:2145/回:0)MSP430单片机串口控制5路PWM频率变化程序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; 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) ; // 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 (shuju==0x03) // { //tmp=20000; //tmp=tmp; // case 0x03: // m=40; // break; // } // if(TXBUF0=0X04) // if (shuju==0x04) //{ // 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 (shuju==0x03) // { //tmp=20000; //tmp=tmp; case 0x03: m=40; break; // } // if(TXBUF0=0X04) // if (shuju==0x04) //{ // 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; //退出低功耗模式 } |
| 发帖须知: 1,发帖请遵守《计算机信息网络国际联网安全保护管理办法》、《互联网信息服务管理办法》、 《互联网电子公告服务管理规定》、《维护互联网安全的决定》等法律法规。 2,请对您的言论负责,我们将保留您的上网记录和发帖信息。 3,在此发帖表示认同我们的条款,我们有权利对您的言论进行审核、删除或者采取其他在法律、地方法规等条款规定之内的管理操作。 |