MSP430串口收发数据程序
- 格式:pdf
- 大小:152.31 KB
- 文档页数:1
#include <msp430x14x。
h〉char UART1_TX_BUF[60];// 串口1 的发送缓冲区char UART1_RX_BUF[60];// 串口1 的接收缓冲区int nTX1_len;char nRX1_len;char nRX1_Len_temp;//临时文件char nTX1_Flag;int nSend_TX1;char UART1_RX_Temp[60];int i;void Init_UART1(void){U1CTL =0x00;//将寄存器的内容清零U1CTL &=~SWRST;//SWRDT复位,uart允许U1CTL += CHAR;//数据位为8bitU1TCTL |=SSEL0;//波特率发生器选择ACLKUBR0_1 = 0x03;UBR1_1 = 0x00;UMCTL_1 = 0x4A;//使用32khz晶振时,波特率为9600ME2 |= UTXE1 + URXE1; //使能UART1的TXD和RXDIE2 |= URXIE1;//使能UART1的RX中断IE2 |= UTXIE1;//使能UART1的TX中断P3SEL |= BIT6;//设置P3.6为UART1的TXDP3SEL |= BIT7;//设置P3.7为UART1的RXDP3DIR |= BIT6; //P3.6为输出管脚return;}void Init_Port(void){//将所有的管脚在初始化的时候设置为输入方式P3DIR = 0;//将所有的管脚设置为一般I/O口P3SEL = 0;return;}void Init_CLK(void){unsigned int i;BCSCTL1 = 0x00;//将寄存器的内容清零//XT2震荡器开启//LFTX1工作在低频模式//ACLK的分频因子为1//xts=0do{IFG1 &= ~OFIFG; // 清除OSCFault标志for (i = 0x20; i > 0; i—-);}while ((IFG1 &OFIFG)== OFIFG);// 如果OSCFault =1 //OFIFG振荡器错误BCSCTL2 = 0x00;//将寄存器的内容清零BCSCTL2 += SELM1;//MCLK的时钟源为TX2CLK,分频因子为1//10,000000BCSCTL2 += SELS;//SMCLK的时钟源为TX2CLK,分频因子为1//00001000}///////////////////////////////////////void main(void){WDTCTL = WDTPW + WDTHOLD;// 关闭看门狗_DINT();// 关闭中断// 初始化时钟Init_CLK();// 初始化端口Init_Port();// 初始化串口1Init_UART1();// 打开中断_EINT();while(1);}#pragma vector = UART1RX_VECTOR__interrupt void UART1_RXISR(void){UART1_RX_BUF[nRX1_Len_temp]=RXBUF1; //将数据读入寄存器。
单片机MSP430与PC机串口通讯设计一、引言串口通信是指通过串行通信接口进行数据传输的一种通信方式。
单片机MSP430和PC机的串口通信设计可以实现二者之间的数据传输和通信交互。
本文将从串口介绍、硬件设计和软件实现等方面详细介绍该设计。
二、串口介绍串口是一种串行通信接口,常用的有RS232和RS485等。
RS232是一种使用较为广泛的串口通信协议。
RS232接口有三根线,分别为发送线Tx、接收线Rx和地线GND。
该协议规定,发送端与接收端之间的电平差为±3至±15V,其中正电平表示逻辑0,负电平表示逻辑1三、硬件设计1.MSP430硬件设计MSP430是一种低功耗的专用于嵌入式应用的16位RISC微控制器。
它具有丰富的外设资源,包括多个通用输入输出引脚(GPIO)和两个USART (UART)接口。
其中一个USART接口用于将MSP430与PC机连接。
2.PC机硬件设计PC机通过串口连接到MSP430。
首先,需要将PC机的串口RS232转换为TTL电平,即RS232转TTL电平转换器。
其次,将转换后的TTL电平通过杜邦线连接至MSP430的USART接口的Tx和Rx引脚。
四、软件实现1.MSP430软件设计(1)串口初始化:设置数据位长度、停止位、奇偶校验等。
(2)发送数据:将要发送的数据存入发送缓冲区,并使能发送中断。
(3)接收数据:开启接收中断,并将接收到的数据存入接收缓冲区。
(4)中断处理:发送中断和接收中断时,分别从发送缓冲区和接收缓冲区读取数据并发送/接收。
2.PC机软件设计(1)打开串口:设置串口参数,如波特率、数据位长度等。
(2)发送数据:向串口发送数据,可以通过打开的串口进行写入。
(3)接收数据:使用轮询或中断方式读取串口接收到的数据。
五、总结与展望本文详细介绍了单片机MSP430与PC机串口通信设计,主要包括了串口介绍、硬件设计和软件实现。
通过串口通信,MSP430和PC机可以实现数据传输和通信交互,从而满足各种嵌入式应用的需求。
/********************************************************* 文件名称:* IIC.c* 文件说明:* 使用口线模拟IIC* 程序使用波特率为2400,程序运行时需要在pc机上使用一个串口* 接收发送程序,任意发送字符,接收的字符为十六进制时间数据* MSP-FET430P149 Demo - Basic Clock, MCLK Sourced from HF XTAL XT2* L.TCH* Feb 2007* Built with IAR Embedded Workbench Version: 3.10A*******************************************************//*********************************************************/#include <MSP430X14X.h>/********************************************************** 定义*********************************************************/#define RST BIT7#define SDA BIT6#define SCLK BIT5char pbuf[7];char clok[7]={0x16,0x15,0x14,0x13,0x12,0x04,0x07};char cbuf;char bbuf;char *pda;char *pck;char *prg;/************************************************说明************************************************/void Port_Init(void);void Init_CLK(void);void Init_UART0(void);void RST_Enable(void);void RST_Disable(void);void SCLK_HI(void);void SCLK_LO(void);void WriteByte(char nVal);char ReadByte(void);void WriteTo1302(char nAddr, char nVal);char ReadFrom1302(char nAddr);void BurstWriteTime(char *pWClock);void BurstReadTime(char *pRClock);void BurstWriteRam(char *pWReg);void BurstReadRam(char *pRReg);void SetTime(char *pClock);void GetTime(char pTime[]);/***********************************************/void Port_Init(void){P1DIR |= RST; //设置CE为输出管脚P1DIR |= RST; //设置SCLK为输出管脚P1DIR |= SCLK;P2DIR |= 0x02; // Set P2.1 to output directionreturn;}void Init_CLK(void){unsigned int i;BCSCTL1 = 0X00; //将寄存器的内容清零//XT2震荡器开启//LFTX1工作在低频模式//ACLK的分频因子为1do{IFG1 &= ~OFIFG; // 清除OSCFault标志for (i = 0xFF; i > 0; i--);}while ((IFG1 & OFIFG) == OFIFG); // 如果OSCFault =1BCSCTL1 &= ~(XT2OFF + XTS); //open XT2, LFTX2 select low frequency //BCSCTL1 |= RSEL0 + RSEL1 + RSEL2; //DCO Rsel=7(Freq=3200k/25摄氏度)//BCSCTL1 |= 0x07;BCSCTL2 += SELM1; //MCLK的时钟源为TX2CLK,分频因子为1BCSCTL2 += SELS; //SMCLK的时钟源为TX2CLK,分频因子为1return;}void Init_UART0(void){U0CTL = 0X00; //将寄存器的内容清零UCTL0|=SWRST;P3SEL |= 0x30; // P3.4,5 = USART0 TXD/RXDME1 |= UTXE0 + URXE0; // Enable USART0 TXD/RXD UCTL0 |= CHAR; // 8-bit characterUTCTL0 |= SSEL1; // UCLK = SMCLKUBR00 = 0xD3; // 3.58Mhz/2400 -1491UBR10 = 0x05; //UMCTL0 = 0x00; // no modulationUCTL0 &= ~SWRST; // Initialize USART state machine IE1 |= URXIE0; // Enable USART0 RX interruptIE1 &= ~UTXIE0; // Disable USART TX interrupt return;}void RST_Enable(void){P1OUT |= RST;return;}void RST_Disable(void){P1OUT &= ~(RST);return;}void SCLK_HI(void){P1OUT |= SCLK;return;}void SCLK_LO(void){P1OUT &= ~(SCLK);return;}/*-------------------------------* 功能: 写入1Byte数据* 调用:* 输入: nVal 写入的数据* 返回值: 无*------------------------------*/void WriteByte(char nVal){char i,j;char nTemp = nV al;char nSend;P1DIR |= SDA; //设置DATA为输出管脚_NOP();_NOP();_NOP();_NOP();for(i = 0; i < 8; i++) //发8位,从0位开始{nSend = (nTemp & 0x01);if(nSend == 1){P1OUT |= SDA;}else{P1OUT &= ~(SDA);}SCLK_HI();for(j = 10;j > 0;j--) ;SCLK_LO();for(j = 10;j > 0;j--) ;nTemp >>= 1; //从0位开始,发8位}return;}/*--------------------------------------* 功能: 读取1Byte数据* 调用:* 输入:* 返回值: nTemp*------------------------------------*/char ReadByte(void){char nTemp = 0;int i;int j;P1DIR &=~SDA; //设置DATA为输入管脚_NOP();_NOP();_NOP();_NOP();for(i = 0; i < 8; i++) //接受8位{SCLK_HI();for(j = 10;j > 0;j--);SCLK_LO();_NOP();_NOP();if(P1IN & SDA) //如果第i位是高电平置1{nTemp |= (0x01 << i);}for(j = 10;j > 0;j--);}return nTemp;}/*-----------------------------------------* 功能: 往DS1302写入1Byte数据* 调用:* 输入: nVal 写入的数据* 返回值: 无*------------------------------------------*/void WriteTo1302(char nAddr, char nVal){RST_Disable();SCLK_LO();RST_Enable();_NOP();_NOP();_NOP();_NOP();WriteByte(nAddr); //地址,命令WriteByte(nVal); //写1Byte数据SCLK_HI();RST_Disable();return;}/*-----------------------------------------* 功能: 从DS1302读取1Byte数据* 调用:* 输入:* 返回值: nDta*-----------------------------------------*/char ReadFrom1302(char nAddr){char nData;RST_Disable();SCLK_LO();RST_Enable();_NOP();_NOP();_NOP();_NOP();WriteByte(nAddr); //地址,命令nData = ReadByte(); //读1Byte数据SCLK_HI();RST_Disable();cbuf = nData; //return(nData);}/*-------------------------------------* 功能: 往DS1302写入时钟数据(多字节方式)* 调用:* 输入: pClock[]: 时钟数据地址格式为: 秒分时日月星期年控制* 8Byte (BCD码)* 返回值: 无*----------------------------------*/void BurstWriteTime(char *pClock){char i;WriteTo1302(0x8e,0x00); //控制命令,写操作.。
msp430串口接收函数篇一:基于msp430串口接收中断#includevoid main{WDTCTL = WDTPW + WDTHOLD;BCSCTL1 = CALBC1_1MHZ;DCOCTL = CALDCO_1MHZ;P1SEL |= BIT1 + BIT2;P1SEL2 |= BIT1 + BIT2;//需要对照着手册来看UCA0CTL1 |= UCSSEL_2;//选择串口的校验位 UCA0BR0 = 104;//9600 波特率的计算一般都存在误差 UCA0BR1 = 0;UCA0MCTL = UCBRS0;//校准波特率用所以要使用校准UCA0CTL1 &= ~UCSWRST;//让串口进行复位IE2 |= UCA0RXIE;//开启接收中断__bis_SR_register;}#pragma vector = USCIAB0RX_VECTOR__interrupt void USART_RECEIVE{UCA0TXBUF = UCA0RXBUF+1;while);//等待发送完毕可加可不加 }篇二:MSP430串口收发程序MSP430 标准库printf函数实现20XX-08-02 21:22关键是增加一个putchar函数。
代码如下:#include#includevoid NOP10{_NOP ;_NOP ;_NOP ;_NOP ;_NOP ;_NOP ;_NOP ;_NOP ;_NOP ;_NOP ;}int putchar//注意不要改参数的类型和返回值的类型,否则printf调用是就有问题了。
{if{TXBUF1 = '\r';while==0);}TXBUF1 = c;while==0);return c;}void InitalUart1{P4SEL |= 0x03; // P4.0,1 = USART1 TXD/RXDME2 |= UTXE1 + URXE1;// Enable USART1 TXD/RXDUCTL1 |= CHAR; // 8-bit characterUTCTL1 |= SSEL1; // UCLK = SMCLK UBR01 = 0x36; // 1MHz 19200UBR11 = 0x00; // 1MHz 19200UMCTL1 = 0x6B; // ModulationUCTL1 &= ~SWRST; // Initalize USART state machine IE2 |= URXIE1; // Enable USART1 RX interrupt//IFG2 |= UTXIFG1;}void main{unsigned char i;i=0x10;WDTCTL = WDTPW + WDTHOLD; // Stop WDTFLL_CTL0 |= XCAP18PF;// Configure load capsInitalUart1 ;_EINT ;// LPM0;while{// while ); // USART1 TX buffer ready?// TXBUF1 = 'H';//putchar;//putchar;printf;NOP10 ;}}#pragma vector=USART1RX_VECTOR__interrupt void usart1_rx{while ); // USART1 TX buffer ready?TXBUF1 = RXBUF1; // RXBUF1 to TXBUF0//LPM0_EXIT;msp430各模块函数整合20XX-08-13 14:27/***************************************************程序功能:控制8个LED闪烁,用于测试下载功能是否正常测试说明:观察LED闪烁***************************************************/#include#include "EEPROM.c"#include "LCD1602.c"#include "DS18B20.c"void LED_delay;void KEY_delay;void EEPROM_delay;void sys_init;void LED_Init;void LED_Set;unsigned char LED_Read_Status;void LED_Test;void KEY_Init;unsigned char key;void KEY_Test;void SEG_Init;void SEG_Show;void EEPROM_Init;void Write_EEPROM;void Read_EEPROM;void LCD1602_Init;void LCD1602_Show;void DS18B20_Init;void TimerA_Delay_CFG;float get_DS18B20_temperature;unsigned char SEG_Table[17]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0 xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//0-f 段选信号,共阳 uchar UART_Rev_String[20]="\0";uchar rev_string_count=0;uchar rev_string_xxplete=0; //为1代表串口接收了一行字符串// =================================================== ===============// 延时函数// =================================================== ===============//************************************************* // function :LED_delay// parameter:dly// description :用于LED花样显示延时//************************************************* void LED_delay{unsigned int i;whilefor;}//************************************************* // function :KEY_delay// parameter:// description :用于消抖的延时//************************************************* void KEY_delay{uint tmp;for;}//************************************************* // function :EEPROM_delay// parameter:ts// description :用于消抖的延时//************************************************* void EEPROM_delay{while;}// =================================================== =============== // 系统函数// =================================================== ===============//************************************************* // function :sys_init// parameter:// description :延时一段时间//************************************************* void sys_init{WDTCTL = WDTPW + WDTHOLD; //关闭看门狗BCSCTL2 &=0xc0; //XT2CLK+2分频}// =================================================== =============== // LED相关函数//=================================================== ===============//************************************************* // function :LED_Init// parameter:// description :LED初始化程序// 8个LED接在P2.0~P2.7上。
msp430的一些常用的C语言控制程序---RS232//需要调试助手辅助才能观察到收或接的数据#include//void OSC_Init(void); void USATR0_Init(void);//void main(){WDTCTL = WDTPW + WDTHOLD;OSC_Init();USATR0_Init();_BIS_SR(GIE);//用调试助手可以检测,也可以结合按键观察到数据的传输}//void OSC_Init(void){BSCTL1 &= ~XT2OFF;//XT2 振荡器开启do //清OSCFault 标志{ IFG1 &= ~OFIFG; for (i=0xFF;i>0;i--); } while((IFG1&OFIFG));BSCTL2 |= (SELM_1 + SELS);//MCLK = XT2CLK,SMCLK = XT2CLK}//void USATR0_Init(void){P3SEL |= (BIT4 + BIT5);//选择端口的第二功能ME1 |= (UTXE0 + URXE0);//工作模式1,UART0 使能UCTL0 |= CHAR ;//发送字长,八位UTCTL0 |= (SSEL0 + SSEL1);//选择时钟源,用于确定波特率发生器的时钟源,选择辅助时钟ACLK,子系统时钟SMCLKUBR00 = 0x9F;//波特率选择寄存器低位UBR10 = 0x01;//波特率选择寄存器高位UMCTL0 = 0xB5;//波特率调整寄存器UCTL0 &= ~SWRST;//USATR 状态机初始化复位IE1 |= URXIE0;//允许USATR 中断}#pragma vector=UART0RX_VECTOR__interrupt void uart0_rx(void){while(!(IFG1 & UTXIFG0));//等待,看看接收寄存器里面是不是有数据TXBUF0 = RXBUF0;//将接收过来的数据在发出去}tips:感谢大家的阅读,本文由我司收集整编。
MSP430单片机串口通信详解#include"msp430G2553.h"#include "in430.h"void UartPutchar(unsigned char c);unsigned char UartGetchar();unsigned char temp=0;unsigned char number[2]={0};void main( void ){WDTCTL = WDTPW + WDTHOLD; // Stop WDTBCSCTL1 = CALBC1_1MHZ; // Set DCODCOCTL = CALDCO_1MHZ;P1DIR|=BIT6;P1OUT&=~BIT6;P1SEL = BIT1 + BIT2; // P1.1为 RXD, P1.2为TXD P1SEL2 = BIT1 + BIT2; // P1.1为 RXD, P1.2为TXDUCA0CTL1 |= UCSSEL_2; // 选择时钟BRCLKUCA0BR0 = 106; // 1MHz 9600UCA0BR1 = 0; // 1MHz 9600UCA0MCTL = UCBRS2 + UCBRS0; // 波特率=BRCLK/(UBR+(M7+...0)/8)UCA0CTL1 &= ~UCSWRST;// 初始化顺序:SWRST=1设置串口,然后设置SWRST=0,最后设置相应中断IE2 |= UCA0RXIE; // 使能接收中断while(1){//UartPutchar(9);// display_int(temp,0);__delay_cycles(10000);}}/**********************************UART接收中断*************************/#pragma vector=USCIAB0RX_VECTOR__interrupt void USCI0RX_ISR(void){//while (!(IFG2&UCA0TXIFG)); // 等待发送完成 //UCA0TXBUF = UCA0RXBUF; // TX ->; RXed charactertemp=UCA0RXBUF;}/******************************UART发送字节函数*************************/void UartPutchar(unsigned char c){while(!(IFG2 & UCA0TXIFG)); //待发送为空UCA0TXBUF=c;IFG2 &=~UCA0RXIFG;}/*********************************UART接收字节数据******************/unsigned char UartGetchar(){unsigned char c;while(!(IFG2 & UCA0RXIFG)); //等待接收完成c=UCA0RXBUF;IFG2 &=~UCA0TXIFG;return c;}/******智能控制工作室*******/MSP430g2553串口通信MSP430的不同型号,其串行通讯工作模式是一样的。
NRF24L01 MSP430发送接收程序作者:codebaby 文章来源:codebaby 点击数: 1351 更新时间:2011-8-18最近弄了几天的无线模块,玩的是NRF2L01,因为这款无线模块价格便宜,网上也就卖10多块钱!刚开始用51写,“百度一下”发现网上的程序真是百篇一律,你抄我,我抄你。
对比了几个程序之后,发现他们的程序注释也是自相矛盾,看了的唯一收获就是,结合技术资料,对NRF24L01的工作模式和通信过程有了个总体的把握。
用51调了几次没成功,改而用430板子来写。
在网上查了一些相关的程序,终于成功了。
现在发现其实要写对NRF24L01的基本通信程序并不难,当然要玩转它又是另外一回事了。
我也刚刚才玩会单通道接收发送这个工作模式,其他的工作模式还没玩!还是附上相应的程序供大家学习交流,当然程序可能难免还有疏漏和错误,还望比拼指出!这是NRF24L01的头文件配置程序:#include <msp430x14x.h>//=======================NRF24L01_CE 端口========================================= #define RF24L01_CE_0 P3OUT &=~BIT1#define RF24L01_CE_1 P3OUT |= BIT1//=============================RF24L01_CSN 端口================================== #define RF24L01_CSN_0 P3OUT &=~BIT3#define RF24L01_CSN_1 P3OUT |= BIT3//=============================RF24L01_SCK 端口====================================== #define RF24L01_SCK_0 P3OUT &=~BIT2#define RF24L01_SCK_1 P3OUT |= BIT2//=============================RF24L01_MISO 端口=========================================#define RF24L01_MISO_0 P3OUT &=~BIT0#define RF24L01_MISO_1 P3OUT |= BIT0//============================= RF24L01_MOSI 端口================================ #define RF24L01_MOSI_0 P2OUT &=~BIT6#define RF24L01_MOSI_1 P2OUT |= BIT6//==========================IRQ 状态============================================ #define RF24L01_IRQ_0 P2OUT &=~BIT7#define RF24L01_IRQ_1 P2OUT |= BIT7//==========================NRF24L01地址,接收发送数据长度=============================== =============#define TX_ADR_WIDTH 5 // 5 uints TX address width#define RX_ADR_WIDTH 5 // 5 uints RX address width#define TX_PLOAD_WIDTH 32 // 32 TX payload //这里可以更改你想要发送和接收的数据长度如果是发指令我喜欢越短越好#define RX_PLOAD_WIDTH 32 // 32 uints TX payload//=========================NRF24L01寄存器指令===================================#define READ_REG 0x00 // 读寄存器指令#define WRITE_REG 0x20 // 写寄存器指令#define RD_RX_PLOAD 0x61 // 读取接收数据指令#define WR_TX_PLOAD 0xA0 // 写待发数据指令#define FLUSH_TX 0xE1 // 冲洗发送FIFO指令#define FLUSH_RX 0xE2 // 冲洗接收FIFO指令#define REUSE_TX_PL 0xE3 // 定义重复装载数据指令#define NOP1 0xFF // 保留//========================SPI(nRF24L01)寄存器地址===============================#define CONFIG 0x00 // 配置收发状态,CRC校验模式以及收发状态响应方式#define EN_AA 0x01 // 自动应答功能设置#define EN_RXADDR 0x02 // 可用信道设置#define SETUP_AW 0x03 // 收发地址宽度设置#define SETUP_RETR 0x04 // 自动重发功能设置#define RF_CH 0x05 // 工作频率设置#define RF_SETUP 0x06 // 发射速率、功耗功能设置#define STATUS 0x07 // 状态寄存器#define OBSERVE_TX 0x08 // 发送监测功能#define CD 0x09 // 地址检测#define RX_ADDR_P0 0x0A // 频道0接收数据地址#define RX_ADDR_P1 0x0B // 频道1接收数据地址#define RX_ADDR_P2 0x0C // 频道2接收数据地址#define RX_ADDR_P3 0x0D // 频道3接收数据地址#define RX_ADDR_P4 0x0E // 频道4接收数据地址#define RX_ADDR_P5 0x0F // 频道5接收数据地址#define TX_ADDR 0x10 // 发送地址寄存器#define RX_PW_P0 0x11 // 接收频道0接收数据长度#define RX_PW_P1 0x12 // 接收频道0接收数据长度#define RX_PW_P2 0x13 // 接收频道0接收数据长度#define RX_PW_P3 0x14 // 接收频道0接收数据长度#define RX_PW_P4 0x15 // 接收频道0接收数据长度#define RX_PW_P5 0x16 // 接收频道0接收数据长度#define FIFO_STATUS 0x17 // FIFO栈入栈出状态寄存器设置//=============================RF24l01状态=====================================char TX_ADDRESS[TX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01}; //本地地址//我刚开始学的时候对这个发送和接收地址不是很明白,为什么他要设置成这样,后来才知道这个地址是用户自己定的,也就是说不是每个芯片只有唯一的地址,只要发送和接收端的地址一致就行char RX_ADDRESS[RX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01}; //接收地址char sta;char TxBuf[32]={0x01,0x02,0x03,0x4,0x05,0x06,0x07,0x08,0x09,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x30,0x31,0x32,}; //这个程序要发送的数据void RF24L01_IO_set(void);void ms_delay(void);void InitSys();void Delay(int s);char SPI_RW(char data);char SPI_Read(char reg);char SPI_RW_Reg(char reg, char value);char SPI_Read_Buf(char reg, char *pBuf, char uchars);char SPI_Write_Buf(char reg, char *pBuf, char uchars);void SetRX_Mode(void);char nRF24L01_RxPacket(char* rx_buf);void nRF24L01_TxPacket(char * tx_buf);void init_NRF24L01(void);//===========================RF24L01端口设置========================================== void RF24L01_IO_set(void){P2DIR &= 0x7f; P2DIR |= 0x40; P2SEL&=0x3F; P2IE=P2IE&0x3f;P3DIR &= 0xFE; P3DIR |= 0x0E; P3SEL&=0xF0;}//******************************************************************************//系统初始化打开430XT2晶振//******************************************************************************void InitSys(){unsigned int iq0;_DINT();BCSCTL1 &=~XT2OFF;do{IFG1 &= ~OFIFG; // 清除振荡器失效标志for (iq0 = 0xFF; iq0 > 0; iq0--); // 延时,等待XT2起振}while ((IFG1 & OFIFG) != 0); // 判断XT2是否起振BCSCTL2 =SELM1+SELS; // MCLK,SMCLK时钟为XT2}//========================延时约5ms============================================= void ms_delay(void){unsigned int i=40000;while (i != 0){i--;}}//========================================长延时================================ void Delay(int s){unsigned int i,j;for(i=0; i<s; i++);for(j=0; j<s; j++);}//****************************************************************************************** //延时函数//****************************************************************************************** void inerDelay_us(char n){for(;n>0;n--);}//============================================================================== //函数:uint SPI_RW(uint uchar)//功能:NRF24L01的SPI写时序//******************************************************************************char SPI_RW(char data){char i,temp=0;for(i=0;i<8;i++) // output 8-bit{if((data & 0x80)==0x80){RF24L01_MOSI_1; // output 'uchar', MSB to MOSI}else{RF24L01_MOSI_0;}data = (data << 1); // shift next bit into MSB..temp<<=1;RF24L01_SCK_1; // Set SCK high..if((P3IN&0x01)==0x01)temp++; // capture current MISO bitRF24L01_SCK_0; // ..then set SCK low again}return(temp); // return read uchar}//*********************************************************************************************** *****//函数:uchar SPI_Read(uchar reg)//功能:NRF24L01的SPI时序//*********************************************************************************************** *****char SPI_Read(char reg){char reg_val;RF24L01_CSN_0; // CSN low, initialize SPI communication...SPI_RW(reg); // Select register to read from..reg_val = SPI_RW(0); // ..then read registervalueRF24L01_CSN_1; // CSN high, terminate SPI communicationreturn(reg_val); // return register value}//*********************************************************************************************** *****///功能:NRF24L01读写寄存器函数//*********************************************************************************************** *****/char SPI_RW_Reg(char reg, char value){char status1;RF24L01_CSN_0; // CSN low, init SPI transactionstatus1 = SPI_RW(reg); // select registerSPI_RW(value); // ..and write value to it..RF24L01_CSN_1; // CSN high againreturn(status1); // return nRF24L01 status uchar}//*********************************************************************************************** *****///函数:uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars)//功能: 用于读数据,reg:为寄存器地址,pBuf:为待读出数据地址,uchars:读出数据的个数//****************************************************************************************************/char SPI_Read_Buf(char reg, char *pBuf, char chars){char status2,uchar_ctr;RF24L01_CSN_0; // Set CSN low, init SPI tranactionstatus2 = SPI_RW(reg); // Select register to write to and read status ucharfor(uchar_ctr=0;uchar_ctr<chars;uchar_ctr++){pBuf[uchar_ctr] = SPI_RW(0);}RF24L01_CSN_1;return(status2); // return nRF24L01 status uchar}//*********************************************************************************************** **********//函数:uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)//功能: 用于写数据reg:为寄存器地址,pBuf:为待写入数据地址,uchars:写入数据的个数//*********************************************************************************************** **********/char SPI_Write_Buf(char reg, char *pBuf, char chars){char status1,uchar_ctr;RF24L01_CSN_0; //SPI使能status1 = SPI_RW(reg);for(uchar_ctr=0; uchar_ctr<chars; uchar_ctr++){SPI_RW(*pBuf++);}RF24L01_CSN_1; //关闭SPIreturn(status1);}//*********************************************************************************************** *****///函数:void SetRX_Mode(void)//功能:数据接收配置//*********************************************************************************************** *****/void SetRX_Mode(void){RF24L01_CE_0;SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f); // IRQ收发完成中断响应,16位CRC,主接收RF24L01_CE_1;inerDelay_us(130); //注意不能太小}//*********************************************************************************************** *******///函数:unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)//功能:数据读取后放如rx_buf接收缓冲区中//*********************************************************************************************** *******/char nRF24L01_RxPacket(char* rx_buf){char revale=0;sta=SPI_Read(STATUS); // 读取状态寄存其来判断数据接收状况if(sta&0x40) // 判断是否接收到数据{RF24L01_CE_0 ; //SPI使能SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH); // read receive payload from RX_FIFO buffer revale =1; //读取数据完成标志}SPI_RW_Reg(WRITE_REG+STATUS,sta); //接收到数据后RX_DR,TX_DS,MAX_PT都置高为1,通过写1来清楚中断标志return revale;}//*********************************************************************************************** ************//函数:void nRF24L01_TxPacket(char * tx_buf)//功能:发送tx_buf中数据//*********************************************************************************************** ***********/void nRF24L01_TxPacket(char * tx_buf){RF24L01_CE_0 ; //StandBy I模式SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 装载接收端地址SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH); // 装载数据// SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e); // IRQ收发完成中断响应,16位CRC,主发送RF24L01_CE_1; //置高CE,激发数据发送inerDelay_us(10);}//****************************************************************************************//NRF24L01初始化//***************************************************************************************/void init_NRF24L01(void){inerDelay_us(100);RF24L01_CE_0 ; // chip enableRF24L01_CSN_1; // Spi disableRF24L01_SCK_0; // Spi clock line init highSPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); // 写本地地址SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH); // 写接收端地址SPI_RW_Reg(WRITE_REG + EN_AA, 0x01); // 频道0自动ACK应答允许SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); // 允许接收地址只有频道0,如果需要多频道可以参考Pa ge21SPI_RW_Reg(WRITE_REG + RF_CH, 0); // 设置信道工作为2.4GHZ,收发必须一致SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //设置接收数据长度,本次设置为32字节SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); //设置发射速率为1MHZ,发射功率为最大值0dBSPI_RW_Reg(WRITE_REG + CONFIG, 0x0E); // IRQ收发完成中断响应,16位CRC ,主接收}}//=============================================================================下面是发送主程序:#include <msp430x14x.h>#include "NRF24L01.h"void main(){WDTCTL = WDTPW + WDTHOLD; //禁止看门狗RF24L01_IO_set();InitSys();init_NRF24L01() ;nRF24L01_TxPacket(TxBuf); // 将要发送的数据转移到发送缓冲区while(1){nRF24L01_TxPacket(TxBuf);SPI_RW_Reg(WRITE_REG+STATUS,0XFF); //清状态寄存器ms_delay();ms_delay();LED1_1;ms_delay();ms_delay();LED1_0;}}下面是接收主程序:将接收到的数据发送到PC 可以通过串口助手来查看接收到数据是否正确#include <msp430x14x.h>#include "NRF24L01.h"char RxBuf[32]={0};//===============================串口初始化=====================================void init_uart0(void){//====================串口工作模式设置========================================U0CTL=0x00; // U0CTL包含串口0通信协议、通信模式、校验位等设置,允许UART0U0CTL +=CHAR; //(CHAR=0x10)当CHAR=0时位7位数据,当CHAR=1时为8位数据//不需要校验,数据位为8位,无反馈,异步UART通信,UART被允许//====================串口发送操作设置========================================U0TCTL=0x00; //U0TCTL包含串口0发送功能操作U0TCTL +=SSEL0; //波特率发生器选择ACLK//#define SSEL1 (0x20) #define SSEL0 (0x10)//====================串口拨特率设置9600====================================//===================拨特率计算公式:拨特率=BRCLK/(UBR+(M7+M6+。
/*main.c******************************************************************************* 功能:串口通信日期:2013.9.11姓名:MRTnotice:无论接收发送只要标志位(TI RI)置位立马进入中断一般情况即使中断不允许的情况下buffer中任然接收到数据并存储******************************************************************************* ***/#include"msp430x14x.h"#include"whole.h"#include"main.h"struct power guss;unsigned char buffer_value;void main(){WDTCTL = WDTPW + WDTHOLD;init_usart();init_clk();_EINT();while(1){}}#pragma vector = USART0RX_VECTOR__interrupt void usart0_rx(void){buffer_value++;guss.buffer[0] = RXBUF0;if(buffer_value==1){guss.buffer[1] = RXBUF0;guss.value = guss.buffer[1];guss.value<<=4;}if(buffer_value==2){guss.buffer[2] = RXBUF0;buffer_value = 0;}}/*******************************end*****************************************/ /**basic.c*************************************************************************功能:串口通信基础函数配置日期:2013.9.11姓名:MRTnotice:无论接收发送只要标志位(TI RI)置位立马进入中断一般情况即使中断不允许的情况下buffer中任然接收到数据并存储****/#include"msp430x14x.h"#include"whole.h"#include"main.h"void init_usart(){UTCTL0 |= SSEL1;//串口时钟源选择的是SMCLKUBR00 = 0Xa0;UBR10 = 0X01;UMCTL0 = 0Xc0;//波特率19200UCTL0 &= ~SWRST;UCTL0 = CHAR;ME1 |=UTXE0 + URXE0;//串口接收中断打开IE1 |=URXIE0; //使能接收中断}void init_clk(){unsigned int iq0;BCSCTL1&=~XT2OFF; //打开XT2振荡器do{IFG1 &= ~OFIFG; // 清除振荡器失效标志for (iq0 = 0xFF; iq0 > 0; iq0--); // 延时,等待XT2起振}while ((IFG1 & OFIFG) != 0); // 判断XT2是否起振BCSCTL2 =SELM_2+SELS; //选择MCLK、SMCLK为XT2/}void init_io(){P4SEL |= BIT1;// P4.1接内部模块}void init_pwm(){TBCCR0 = 400;TBCCTL1 = OUTMOD_7; // CCR1 reset/setTBCCR1 = 50; // CCR1 PWM duty cycleTBCTL = TBSSEL_2 + MC_1; //}/*******************************end*****************************************/。
/*透过串口发送给电脑p1口的状态,格式:aXXXXXXXX.对应的是P1.01234567,9600波特率,*//*实现,透过串口发送给电脑p1口的状态,格式:aXXXXXXXX.对应的是P1.01234567,9600波特率,*/#include<msp430x14x.h>unsigned char start=0,addright=0,flag=0,Dflag=0,Fflag=0,Buffer[30];unsigned i=0, bufferi=0,stop=0,stop1=0,aa[5],ADbit[5],j;/////////////////////////////////////////////////////////////////////////////////////////void Init(void){BCSCTL1&=~0X80; //Xt2 is onBCSCTL2 |=0X88; //SMCLK=XT2P1DIR=0X00;UCTL0 &=~SWRST; //reset swrst and usart0 enableUCTL0 = CHAR; // 8-bit characterUTCTL0 = SSEL1; // U0CLK = SMCLK=TX2URCTL0 = 0x00;UBR00 = 0x41; // 8MHz 9600UBR10 = 0x03; // 8MHz 9600UMCTL0 = 0x54; // 8MHz 9600 modulation 2.67----3ME1 |= UTXE0 + URXE0; // Enable USART0 TXD/RXDIE1 |= URXIE0; // Enable USART0 RX interruptP3SEL |= 0x30; // enable P3.4,5 USART0 TXD/RXDP3DIR |= 0x10; // P3.4 output directionUCTL1 &=~SWRST; //reset swrst and usart1 enableUCTL1 = CHAR; // 8-bit characterUTCTL1 = SSEL1; // U1CLK = SMCLK=TX2URCTL1 = 0x00;UBR01 = 0x41; // 8MHz 9600,啥呀,一点都不精确,末尾的0可以是0~E的任何,它都发送对的UBR11 = 0x03; // 8MHz/9600=833.333UMCTL1 = 0x4A; // 0.333*8=2.666ME2 |= UTXE1 + URXE1; // Enable USART1 TXD/RXDIE2 &= ~URXIE1; // Enable USART1 RX interruptP3SEL |= 0xC0; // enable P3.6,7 USART1 TXD/RXDP3DIR |= 0x40; // P3.6 output directionP3DIR |=0X01; // P3.0 output direction to Usart1 for T P3OUT |=0X01;}/////////////////////////////////////////////////////////////////////////////////////////////void delay(unsigned long DELAY){unsigned long i;for(i=DELAY;i>0;i--);}void main(void){int i=0;int Data;int mask;unsigned ADDRESS;WDTCTL=WDTPW+WDTHOLD; //Stop WDTInit(); //UART1 inition_EINT();ADDRESS= 97; //awhile(1){Data=P1IN;TXBUF1=ADDRESS; //命令格式以a开头while ((UTCTL1&0x01)==0); //当发送的标志为0TXBUF1=58; //发送:号while ((UTCTL1&0x01)==0);mask=0x01;//mask=0x80;for(i=0;i<8;i++) ////循环依次检测P1的八位{if(Data&mask){TXBUF1='0'; //发送给电脑该位为0while ((UTCTL1&0x01)==0); //等待发送标志为零}else{TXBUF1='1'; //如果,没有短路,则发送给电脑1while ((UTCTL1&0x01)==0);}mask=mask<<1; //移动位检测8位}TXBUF1=13; //发送回车while ((UTCTL1&0x01)==0);}}。
MSP430和TC35程序#include <MSP430X14X.h>#include "uart.h"#include "TC35.h"//定义全局变量static char nComm;//定义串口操作变量char nRev_UART0; // 串口 0 的接收标志char nRev_UART1; // 串口 1 的接收标志char UART0_TX_BUF[200]; // 串口 0 的发送缓冲区char UART0_RX_BUF[200]; // 串口 0 的接收缓冲区char UART1_TX_BUF[50]; // 串口 1 的发送缓冲区char UART1_RX_BUF[50]; // 串口 1 的接收缓冲区char pBuf0[100];static int nTX1_Len;static char nRX1_Len;char nRX1_Len_temp;static int nTX0_Len;static int nRX0_Len;int nRX0_Len_temp;static char nTX0_Flag;static char nTX1_Flag;int nSend_TX0;int nSend_TX1;void main(void){int j;int n;int nTemp;int nLen1;int nLen2;char nRes_UART1;char nRes_UART0;char PhoneNumber[18];char UART1_RX_Temp[50];char UART0_RX_Temp[20];char pOut1[40];char pOut2[200];char nSend;int nPhone;WDTCTL = WDTPW + WDTHOLD; // 关闭看门狗 _DINT(); // 关闭中断nSend_TX1 = 0;nSend_TX0 = 0;nTX1_Flag = 0;nTX0_Flag = 0;nTX0_Len = 0;nTX1_Len = 0;nRX1_Len = 0;nRX0_Len = 0;nRev_UART1 = 0;nRev_UART0 = 0;nPhone = 0;nLen1 = 0;nLen2 = 0;nComm = 0;nSend = 0;/////////////////////////////////// 初始化Init_CLK();Init_UART0();Init_UART1();_EINT();//打开中断// TC35初始化tc35_init();Delay_ms(100);nTX0_Len = setCsca(UART0_TX_BUF);IFG1 |= UTXIFG0;// 设置中断标志,进入发送中断程序 Delay_ms(500);nTX0_Len = setCmgf(UART0_TX_BUF);IFG1 |= UTXIFG0;// 设置中断标志,进入发送中断程序 Delay_ms(500);//等待配置for(;;){if(nRev_UART1 == 1){nRev_UART1 = 0;for(i = 0;i < nRX1_Len;i++){UART1_RX_Temp[i] = UART1_RX_BUF[i];}//获得电话号码nPhone =SetPhone(UART1_RX_Temp,PhoneNumber,nRX1_Len);if(nPhone != 0){nTX1_Len = SetOK(UART1_TX_BUF);IFG2 |= UTXIFG1;// 设置中断标志,进入发送中断程序break;}else{nTX1_Len = SetError(UART1_TX_BUF);IFG2 |= UTXIFG1;// 设置中断标志,进入发送中断程序 }}}//循环处理for(;;){if(nComm == 1){nComm = 0;for(i = 0;i < 50;i++){pBuf[i] = i;}sendSms(PhoneNumber,nPhone,pBuf,50,&nLen1,&nLen2,pOut1,pOut 2);for(i = 0;i < nLen1;i++){UART0_TX_BUF[i] = pOut1[i];}nTX0_Len = nLen1;IFG1 |= UTXIFG0;// 设置中断标志,进入发送中断程序 //等待"> "for(;;){if(nRev_UART0 == 1){nRev_UART0 = 0;for(i = 0;i < nRX0_Len;i++){UART0_RX_Temp[i] = UART0_RX_BUF[i];}if(nRX0_Len >= 2){if((UART0_RX_Temp[0] == 62)&& (UART0_RX_Temp[1] == 32)){nSend = 1;break;}}else{nSend = 0;break;}}}for(i = 0;i < nLen2;i++){UART0_TX_BUF[i] = pOut2[i];}nTX0_Len = nLen2;IFG1 |= UTXIFG0;// 设置中断标志,进入发送中断程序Delay_ms(10000);}}}////////////////////////////////////////// 处理来自串口 0 的接收中断interrupt [UART0RX_VECTOR] void UART0_RX_ISR(void){UART0_RX_BUF[nRX0_Len_temp] = RXBUF0; //接收来自的数据nRX0_Len_temp += 1;if(UART0_RX_BUF[nRX0_Len_temp - 1] == 13){nRX0_Len = nRX0_Len_temp;nRev_UART0 = 1;nRX0_Len_temp = 0;}}////////////////////////////////////////// 处理来自串口 0 的发送中断interrupt [UART0TX_VECTOR] void UART0_TX_ISR(void){if(nTX0_Len != 0){nTX0_Flag = 0; // 表示缓冲区里的数据没有发送完TXBUF0 = UART0_TX_BUF[nSend_TX0];nSend_TX0 += 1;Delay_us(5);if(nSend_TX0 >= nTX0_Len){nSend_TX0 = 0;nTX0_Len = 0;nTX0_Flag = 1;}}}///////////////////////////////////////// 处理来自串口 1 的接收中断interrupt [UART1RX_VECTOR] void UART1_RX_ISR(void){UART1_RX_BUF[nRX1_Len_temp] = RXBUF1; //接收来自的数据nRX1_Len_temp += 1;if(UART1_RX_BUF[nRX1_Len_temp - 1] == 13){nRX1_Len = nRX1_Len_temp;nRev_UART1 = 1;nRX1_Len_temp = 0;}}///////////////////////////////////////// 处理来自串口 1 的发送中断interrupt [UART1TX_VECTOR] void UART1_TX_ISR(void){if(nTX1_Len != 0){nTX1_Flag = 0; // 表示缓冲区里的数据没有发送完TXBUF1 = UART1_TX_BUF[nSend_TX1];nSend_TX1 += 1;if(nSend_TX1 >= nTX1_Len){nSend_TX1 = 0;nTX1_Len = 0;nTX1_Flag = 1;}}}///////////////////////////////////////// 处理来自端口 1 的中断interrupt [PORT1_VECTOR] void COMM_ISR(void){if(P1IFG & BIT5){nComm = 1;P1IFG &= ~(BIT5); // 清除中断标志位Delay_us(100);}}#include "tc35.h"// 初始化int tc35_init(char pBuf[]) {pBuf[0] = 'A';pBuf[1] = 'T';pBuf[2] = 'E';pBuf[3] = '0';pBuf[4] = 13;return 5;}// 设置短信中心地址int setCsca(char pBuf[]) {pBuf[0] = 'A';pBuf[1] = 'T';pBuf[2] = '+';pBuf[3] = 'C';pBuf[4] = 'S';pBuf[5] = 'C';pBuf[6] = 'A';pBuf[7] = '=';pBuf[8] = '+';pBuf[9] = '8';pBuf[10] = '6';pBuf[11] = '1';pBuf[12] = '3';pBuf[13] = '8';pBuf[14] = '0';pBuf[15] = '0';pBuf[16] = '2';pBuf[17] = '3';pBuf[18] = '0';pBuf[19] = '5';pBuf[20] = '0';pBuf[21] = '0';pBuf[22] = ',';pBuf[23] = '1';pBuf[24] = '4';pBuf[25] = '9'; pBuf[26] = 13;return 27;}//设置短消息格式int setCmgf(char pBuf[]) {pBuf[0] = 'A';pBuf[1] = 'T';pBuf[2] = '+';pBuf[3] = 'C';pBuf[4] = 'M';pBuf[5] = 'G';pBuf[6] = 'F';pBuf[7] = '=';pBuf[8] = '0';pBuf[9] = 13;return 10;}//删除短消息int deleteSms(char pBuf[],short int index){pBuf[0] = 'A';pBuf[1] = 'T';pBuf[2] = '+';pBuf[3] = 'C';pBuf[4] = 'M';pBuf[5] = 'G';pBuf[6] = 'D';pBuf[7] = '=';pBuf[8] = (char)((index >> 8) & 0xff + 0x30); pBuf[9] = (char)(index & 0xff + 0x30);pBuf[10] = 13;return 11;}//接收短消息void revSms(char pBuf[],char pOut[]){pBuf[0] = 'A';pBuf[1] = 'T';pBuf[2] = '+';pBuf[3] = 'C';pBuf[4] = 'M';pBuf[5] = 'G';pBuf[6] = 'R';pBuf[7] = '=';pBuf[8] = (char)((index >> 8) & 0xff + 0x30);pBuf[9] = (char)(index & 0xff + 0x30);pBuf[10] = 13;return 11;}//发送短消息void sendSms(char pPhone[],int phonelen,char pData[],int nLen,int *nTXLen1,int *nTXLen2,char pOut1[],char pOut2){char strHead[18] = {'0','8','9','1','6','8','3','1','0','8','2','0','0','3','0','5','F','0'};char chrInfo[6] = {'1','1','0','0','0','B'};int nLen_temp;int nContent_Len;int nTempLen;int nOff;int nOffset;char chrTemp[100];char chrTmp[100];char pBuf[200];char phoneTemp[20];char nTemp[100];char Len[1];int i;int n;nOff = 0;nOffset = 0;for(i = 0;i < phonelen;i++){chrTmp[i] = pPhone[i];}chrTmp[phonelen] = 'F';phonelen += 1;// 将电话号码按照规范的顺序作成n = 0;for(i = 0;i < phonelen / 2;i++){phoneTemp[n++] = chrTmp[2 * i + 1];phoneTemp[n++] = chrTmp[2 * i];}copy(chrTemp,0,chrInfo,0,6);nOff = 6;chrTemp[nOff] = '8';nOff += 1;chrTemp[nOff] = '1';nOff += 1;//设置电话号码copy(chrTemp,nOff,phoneTemp,0,phonelen);nOff += phonelen;chrTemp[nOff] = '0';nOff += 1;chrTemp[nOff] = '0';nOff += 1;nContent_Len = nLen;// 设置编码类型chrTemp[nOff] = '0';nOff += 1;chrTemp[nOff] = '0';nOff += 1;Len[0] = nLen;for(i = 0;i < 10;i++){chrTmp[i] = 0;}ByteToChar(Len,chrTmp,1);chrTemp[nOff] = 'A';nOff += 1;chrTemp[nOff] = 'A';nOff += 1;copy(chrTemp,nOff,chrTmp,0,2);nOff += 2;nLen_temp = nOff;nLen_temp += nContent_Len;//获得长度的字符数组nTempLen = IntToChar(nLen_temp,chrTmp); //封装长度信息nTemp[0] = 'A';nTemp[1] = 'T';nTemp[2] = '+';nTemp[3] = 'C';nTemp[4] = 'M';nTemp[5] = 'G';nTemp[6] = 'S';nTemp[7] = '=';nOffset = 8;//长度for(i = 0;i < nTempLen;i++){nTemp[nOffset] = chrTmp[i];nOffset += 1;}nTemp[nOffset] = 13;for(i = 0; i < nOffset;i++){pOut1[i] = nTemp[i];}*nTXLen1 = nOffset;//封装内容数据copy(pOut2,0,strHead,0,18);nOffset = 18;copy(pOut2,nOffset,0,chrTemp,nOff);nOffset += nOff;Encode(pData,pBuf,nLen);ByteToChar(pBuf,chrTmp,nLen);copy(pOut2,nOffset,chrTmp,0,(2 * nLen)); nOffset += (2 * nLen);pOut2[nOffset] = 26;*nTXLen2 = nOffset;}//将源数组的内容拷贝到目的数组void copy(char pDest[],int nOrg,char pOrg[],int nStart,int nLen){int i;for(i = 0;i < nLen;i++){pDest[nOrg + i] = pOrg[i + nStart];}}// 将字节处理成字符串void ByteToChar(char nInPut[],char Out[],int nLen){int i;char chrTemp;for(i = 0;i < nLen;i++){// 高字节chrTemp = (char)((nInPut[i] >> 4) & 0x0f);if(chrTemp >= 0 && chrTemp <= 9) chrTemp += 48;else chrTemp += 55;Out[i] = chrTemp;// 低字节chrTemp = (char)(nInPut[i] & 0x0f);if(chrTemp >= 0 && chrTemp <= 9) chrTemp += 48;else chrTemp += 55;Out[i] = chrTemp;}return;}// 数的范围为250以内int IntToChar(int n,char Out[]){int i;char chrTemp1;char chrTemp2;char chrTemp3;int nLen;chrTemp1 = n / 100;chrTemp2 = (n - chrTemp1 * 100) / 10;chrTemp3 = n - chrTemp1 * 100 - chrTemp2 * 10; if(chrTemp1 != 0){nLen = 3;Out[0] = chrTemp1 + 0x30;Out[1] = chrTemp2 + 0x30;Out[2] = chrTemp3 + 0x30;}else{if(chrTemp2 != 0){nLen = 2;Out[0] = chrTemp2 + 0x30;Out[1] = chrTemp3 + 0x30;}else{nLen = 1;Out[0] = chrTemp3 + 0x30;}}return nLen;}// 编码函数void Encode(char in[],char out[],int nLen){int nOrigin = 0;int nCode = 0;while(true){if(nOrigin >= nLen) break;out[nCode] = in[nOrigin];if((nOrigin + 1) >= nLen) break;out[nCode] |= (byte)((in[nOrigin + 1] & 0x01) << 7); out[nCode + 1] = (byte)((in[nOrigin + 1] >> 1) & 0xff);if((nOrigin + 2) >= nLen) break;out[nCode + 1] |= (byte)((in[nOrigin + 2] & 0x03) << 6);out[nCode + 2] = (byte)((in[nOrigin + 2] >> 2) & 0xff);if((nOrigin + 3) >= nLen) break;out[nCode + 2] |= (byte)((in[nOrigin + 3] & 0x07) << 5);out[nCode + 3] = (byte)((in[nOrigin + 3] >> 3) & 0xff);if((nOrigin + 4) >= nLen) break;out[nCode + 3] |= (byte)((in[nOrigin + 4] & 0x0f) << 4);out[nCode + 4] = (byte)((in[nOrigin + 4] >> 4) & 0xff);if((nOrigin + 5) >= nLen) break;out[nCode + 4] |= (byte)((in[nOrigin + 5] & 0x1f) << 3);out[nCode + 5] = (byte)((in[nOrigin + 5] >> 5) & 0xff);if((nOrigin + 6) >= nLen) break;out[nCode + 5] |= (byte)((in[nOrigin + 6] & 0x3f) << 2);out[nCode + 6] = (byte)((in[nOrigin + 6] >> 6) & 0xff);if((nOrigin + 7) >= nLen) break;out[nCode + 6] |= (byte)((in[nOrigin + 7] & 0x7f) << 1);nCode += 7;nOrigin += 8;}}int AnalyseSms(char in[],int nLen,char chrPhone[],char chrMessage[]){char Phone[20];int phone_len;char chrTemp[200];char chrMessage[140];int nLen_temp;int nTempLen;int nOffset;int nOff;char chrTmp;int n;int nContent_Len;byte content[140];//去掉+CMGR:信息nLen_temp = nLen - 6;nOffset = 6;copy(chrTemp,0,in,nOffset,nLen_temp);if(nLen_temp < 20) return -1;chrTmp = chrTemp[0];if(chrTmp == '1')//新消息{chrTmp = strTemp[3];if(chrTemp == '1')// 长度为三个字符{nTempLen = (strTemp[3] - 48) * 100 + (strTemp[4] - 48) * 10+ (strTemp[4] - 48);if(nLen_temp >= 26){nLen_temp -= 26;nOffset += 26;copy(chrTemp,0,in,nOffset,nLen_temp);}else return -1;}// 长度为两个字符else{nTempLen = (strTemp[3] - 48) * 10 + (strTemp[4] - 48);if(nLen_temp >= 25){nLen_temp -= 25;nOffset += 25;copy(chrTemp,0,in,nOffset,nLen_temp);}else return -1;}//取得电话号码int nPhone_Len = 0;if(nLen_temp >= 18){copy(Phone,0,chrTemp,0,18);phone_len = (int)(Phone[1] - 48);copy(chrPhone,0,Phone,4,14);}else return -1;//获得电话号码的正确顺序copy(Phone,0,chrPhone,0,14);n = 0;for(i = 0;i < 7;i++){chrPhone[n++] = Phone[2 * i + 1];chrPhone[n++] = Phone[2 * i];}if(nLen_temp >= 20){nLen_temp -= 20;nOffset += 20;copy(chrTemp,0,in,nOffset,nLen_temp);}else return -1;if(nLen_temp >= 16){nLen_temp -= 16;nOffset += 16;copy(chrTemp,0,in,nOffset,nLen_temp);}else return -1;// 取出内容的长度nContent_Len = 0;if(nLen_temp >= 2){if((strTemp[1] >= 48) && (strTemp[1] <= 57)) nContent_Len = (strTemp[0] - 48) * 16 + (strTemp[1] - 48);else if(strTemp[1] >= 65 && strTemp[1] <= 70)nContent_Len = (strTemp[0] - 48) * 16 + (strTemp[1] - 55);else if(strTemp[1] >= 97 && strTemp[1] <= 102) nContent_Len = (strTemp[0] - 48) * 16 +(strTemp[1] - 87);}else return -1;if(strTemp.length() >= 2){nLen_temp -= 2;nOffset += 2;copy(chrTemp,0,in,nOffset,nLen_temp);}else return -1;CharToByte(strTemp,content,nLen_temp);nLen_temp /= 2;n = Decode(content,chrMessage,nLen_temp);}return n;}int FindERROR(char in[],int nLen){int nOffset,i;nOffset = -1;if(nLen < 5) return nOffset;for(i = 0;i < nLen;i++){if((in[i] == 'R') && (in[i - 1] == 'O') && (in[i - 2] == 'R')&& (in[i - 3] == 'R') && (in[i - 4] == 'E')){nOffset = i - 4;break;}}return nOffset;}int FindCMGR(char in[],int nLen){int nOffset,i;nOffset = -1;if(nLen < 5) return nOffset;for(i = 0;i < nLen;i++){if((in[i] == 'R') && (in[i - 1] == 'G') && (in[i - 2] == 'M')&& (in[i - 3] == 'C') && (in[i - 4] == '+')){nOffset = i - 4;break;}}return nOffset;}int FindOK(char in[],int nLen){int nOffset,i;nOffset = -1;if(nLen < 2) return nOffset;for(i = 0;i < nLen;i++){if((in[i] == 'K') && (in[i - 1] == 'K')){nOffset = i - 1;break;}}return nOffset;}void CharToByte(char in[],char out[],int nLen) {char chrHi,chrLow;for(int i = 0;i < nLen / 2;i++){chrHi = in[2 * i];if(chrHi >= 48 && chrHi <= 57)chrHi = (char)(chrHi - 48);else if(chrHi >= 65 && chrHi <= 70)chrHi = (char)(chrHi - 55);else if(chrHi >= 97 && chrHi <= 102) chrHi = (char)(chrHi - 87);chrLow = in[2 * i + 1];if(chrLow >= 48 && chrLow <= 57)chrLow = (char)(chrLow - 48);else if(chrLow >= 65 && chrLow <= 70) chrLow = (char)(chrLow - 55);else if(chrLow >= 97 && chrLow <= 102) chrLow = (char)(chrLow - 87);out[i] = (byte)(chrHi * 16 + chrLow); }return;}int Decode(char in[],char out[],int nLen){int nLenTemp = byteStream.length;int nOrigin = 0;int nCode = 0;nLenTemp = nLen * 8 / 7;while(true){if(nOrigin >= nLen) break;out[nCode] = (char)(in[nOrigin] & 0x7f);if((nOrigin + 1) >= nLen) break;out[nCode + 1] = (char)((in[nOrigin + 1] & 0x3f) << 1);out[nCode + 1] += (char)((in[nOrigin] & 0x80) >> 7);if((nOrigin + 2) >= nLen) break;out[nCode + 2] = (char)((in[nOrigin + 2] & 0x1f) << 2);out[nCode + 2] += (char)((in[nOrigin + 1] & 0xc0) >> 6);if((nOrigin + 3) >= nLen) break;out[nCode + 3] = (char)((in[nOrigin + 3] & 0x0f) << 3);out[nCode + 3] += (char)((in[nOrigin + 2] & 0xe0) >> 5);if((nOrigin + 4) >= nLen) break;out[nCode + 4] = (char)((in[nOrigin + 4] & 0x07) << 4);out[nCode + 4] += (char)((in[nOrigin + 3] & 0xf0) >> 4);if((nOrigin + 5) >= nLen) break;out[nCode + 5] = (char)((in[nOrigin + 5] & 0x03) << 5);out[nCode + 5] += (char)((in[nOrigin + 4] & 0xf8) >> 3);if((nOrigin + 6) >= nLen) break;out[nCode + 6] = (char)((in[nOrigin + 6] & 0x01) << 6);out[nCode + 6] += (char)((in[nOrigin + 5] & 0xfc) >> 2);out[nCode + 7] = (char)((in[nOrigin + 6] & 0xfe) >> 1);nCode += 8;nOrigin += 7;}return nLenTemp;}int tc35_init(char pBuf[]);int setCsca(char pBuf[]);int setCmgf(char pBuf[]);int deleteSms(char pBuf[]);void revSms(char pBuf[],char pOut[]);void sendSms(char pPhone[],int phonelen,char pData[],int nLen,int *nTXLen1,int *nTXLen2,char pOut1[],char pOut2);int IntToChar(int n,char Out[]);void ByteToChar(char nInPut[],char Out[],int nLen);void copy(char pDest[],int nOrg,char pOrg[],int nStart,int nLen);void Encode(char in[],char out[],int nLen);int AnalyseSms(char in[],int nLen,char chrPhone[],char chrMessage[]);int FindERROR(char in[],int nLen);int FindCMGR(char in[],int nLen);int FindOK(char in[],int nLen);void CharToByte(char in[],char out[],int nLen);int Decode(char in[],char out[],int nLen);#include <MSP430X14X.h>#include "UART.h"void Init_CLK(void){unsigned int i;BCSCTL1 = 0X00; //将寄存器的内容清零//XT2震荡器开启//LFTX1工作在低频模式//ACLK的分频因子为1do{IFG1 &= ~OFIFG; // 清除OSCFault标志for (i = 0x20; i > 0; i--);}while ((IFG1 & OFIFG) == OFIFG); // 如果OSCFault =1BCSCTL1 &= ~(XT2OFF + XTS);//open XT2, LFTX2 select low frequencyBCSCTL1 |= RSEL0 + RSEL1 + RSEL2; //DCORsel=7(Freq=3200k/25摄氏度)BCSCTL1 |= 0x07;BCSCTL2 += SELM1; //MCLK的时钟源为TX2CLK,分频因子为1BCSCTL2 += SELS; //SMCLK的时钟源为TX2CLK,分频因子为1}void Init_UART0(void){U0CTL = 0X00; //将寄存器的内容清零U0CTL += CHAR; //数据位为8bitU0TCTL = 0X00; //将寄存器的内容清零U0TCTL += SSEL1; //波特率发生器选择SMCLKUBR0_0 = 0Xa1; //波特率为19200UBR1_0 = 0X01;UMCTL_0 = 0X49; //调整寄存器ME1 |= UTXE0 + URXE0; //使能UART0的TXD和RXDIE1 |= URXIE0; //使能UART0的RX中断IE1 |= UTXIE0; //使能UART0的TX中断P3SEL |= BIT4; //设置P3.4为UART0的TXDP3SEL |= BIT5; //设置P3.5为UART0的RXDP3DIR |= BIT4; //P3.4为输出管脚return;}void Init_UART1(void){U1CTL = 0X00; //将寄存器的内容清零U1CTL += CHAR; //数据位为8bitU1TCTL = 0X00; //将寄存器的内容清零U1TCTL += SSEL1; //波特率发生器选择SMCLKUBR0_1 = 0X45; //波特率为115200UBR1_1 = 0X00;UMCTL_1 = 0X00;ME2 |= UTXE1 + URXE1; //使能UART1的TXD和RXD IE2 |= URXIE1; //使能UART1的RX中断IE2 |= UTXIE1; //使能UART1的TX中断P3SEL |= BIT6; //设置P3.6为UART1的TXDP3SEL |= BIT7; //设置P3.7为UART1的RXDP3DIR |= BIT6; //P3.6为输出管脚return;}void Delay_ms(unsigned long nValue)//毫秒为单位,8MHz为主时钟{unsigned long nCount;int i;unsigned long j;nCount = 2667;for(i = nValue;i > 0;i--){for(j = nCount;j > 0;j--);}return;}void Delay_us(unsigned long nValue)//微秒为单位,8MHz为主时钟{int nCount;int i;int j;nCount = 3;for(i = nValue;i > 0;i--){for(j = nCount;j > 0;j--);}return;}int SetOK(char UART1_TX_BUF[]){UART1_TX_BUF[0] = 'O';UART1_TX_BUF[1] = 'K';UART1_TX_BUF[2] = 13;return 3;}int SetError(char UART1_TX_BUF[]){UART1_TX_BUF[0] = 'E';UART1_TX_BUF[1] = 'R';UART1_TX_BUF[2] = 'O';UART1_TX_BUF[3] = 'R';UART1_TX_BUF[4] = 'R';UART1_TX_BUF[5] = 13;return 6;}int SetPhone(char recv[],char phone[],int nLen) {int i;char chrHi,chrLo;chrHi = recv[0];//长度chrLo = recv[1];if(recv[1] == ','){for(i = 0;i < chrHi;i++){phone[i] = recv[i + 2];}}else return 0;return chrHi;}void Init_CLK(void);void Init_UART0(void)void Init_UART1(void);int SetOK(char UART1_TX_BUF[]);int SetError(char UART1_TX_BUF[]);int SetPhone(char recv[],char phone[],int nLen);。
//ADC.H#ifndef __ADC_H#define __ADC_H#include <msp430x14x.h>#define uchar unsigned char#define uint unsigned intextern void Trans_val(uchar x,uchar y,uint Hex_Val);extern void ADC_Init();#endif//ADC.C#include <msp430x14x.h>#include "USART0.h"#include"ADC.h"#include "lcd12864.h"#define Num_of_Results 128static uint results0[Num_of_Results]; //保存ADC转换结果的数组static uint results1[Num_of_Results]; //保存ADC转换结果的数组static uint results2[Num_of_Results]; //保存ADC转换结果的数组static uint results3[Num_of_Results]; //保存ADC转换结果的数组//ADC初始化void ADC_Init(){P6SEL = 0x0F; // Enable A/D channel inputsADC12CTL0 = ADC12ON+MSC+SHT0_2; // Turn on ADC12, set sampling time ADC12CTL1 = SHP+CONSEQ_1; // Use sampling timer, single sequence ADC12MCTL0 = INCH_0; // ref+=A Vcc, channel = A0ADC12MCTL1 = INCH_1; // ref+=A Vcc, channel = A1ADC12MCTL2 = INCH_2; // ref+=A Vcc, channel = A2ADC12MCTL3 = INCH_3+EOS; // ref+=A Vcc, channel = A3, end seq. ADC12IE = 0x08; // Enable ADC12IFG.3ADC12CTL0 |= ENC; // Enable conversions}/*******************************************函数名称:Trans_val功能:将16进制ADC转换数据变换成三位10进制真实的模拟电压数据,并在液晶上显示参数:Hex_V al--16进制数据n--变换时的分母等于2的n次方返回值:无********************************************/void Trans_val(uchar x,uchar y,uint Hex_Val){unsigned long caltmp;uint Curr_Volt;caltmp = Hex_Val;caltmp = (caltmp << 5) + Hex_Val; //caltmp = Hex_V al * 33 caltmp = (caltmp << 3) + (caltmp << 1); //caltmp = caltmp * 10Curr_Volt = caltmp >> 12; //Curr_V olt = caltmp / 2^n Display_Value(x,y,Curr_V olt);}/*******************************************函数名称:ADC12ISR功能:ADC中断服务函数,在这里用多次平均的计算P6.0口的模拟电压数值参数:无返回值:无********************************************/#pragma vector=ADC_VECTOR__interrupt void ADC12ISR (void){static uint index = 0;results0[index++] = ADC12MEM0; // Move resultsresults1[index++] = ADC12MEM1; // Move resultsresults2[index++] = ADC12MEM2; // Move resultsresults3[index++] = ADC12MEM3; // Move resultsif(index == Num_of_Results){uchar i;unsigned long sum0=0,sum1=0,sum2=0,sum3=0;index = 0;for(i = 0; i < Num_of_Results; i++){sum0 += results0[i];sum1 += results1[i];sum2 += results2[i];sum3 += results3[i];}sum0 >>= 5; //除以32sum1 >>= 5; //除以32sum2 >>= 5; //除以32sum3 >>= 5; //除以32Display_Num(3,1,sum0);Display_Num(3,2,sum1);Display_Num(3,3,sum2);Display_Num(3,4,sum3);Trans_val(5,1,sum0);Trans_val(5,2,sum1);Trans_val(5,3,sum2);Trans_val(5,4,sum3);}_BIC_SR_IRQ(LPM0_bits); // Clear LPM0, SET BREAKPOINT HERE}//USART.C#include "USART0.h"//以下是串口0的初始化设置void Usart0_Init(){P3SEL |= 0x30; // P3.4,5选择为UART收发端口ME1 |= UTXE0 + URXE0; // 使能USART0收发UCTL0 |= CHAR; // 8-bit characterUTCTL0 |= SSEL0; // UCLK = ACLKUBR00 = 0x0D; // 32k/2400 - 13.65UBR10 = 0x00; //UMCTL0 = 0x6B; // ModulationUCTL0 &= ~SWRST; // 初始化UART0状态机IE1 |= URXIE0; // 使能接收中断}//此函数用来发送一个char型void SentData(uchar num){while (!(IFG1 & UTXIFG0));TXBUF0 = num;}//此函数用来把1~4位十进制数据转化为ASCII编码的形式发送给上位机void Sent_Num(uint num){uchar ge,shi,bai,qian;qian = num/1000;bai = num/100 %10;shi = num/10%10;ge = num%10;SentData(qian+0x30);SentData(bai+0x30);SentData(shi+0x30);SentData(ge+0x30);// SentData('\n');}/*******************************************函数名称: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--);}}//串口中断响应函数#pragma vector=UART0RX_VECTOR__interrupt void usart0_rx (void){if(49==RXBUF0){_BIC_SR_IRQ(LPM0_bits); // Clear LPM0, SET BREAKPOINT HERE}if(50==RXBUF0){ADC12IE = 0x00; // 关闭ADC}}//USART.H#ifndef __USART0_H#define __USART0_H#include <msp430x14x.h>#define uchar unsigned char#define uint unsigned intextern void Usart0_Init();extern void SentData(uchar num);extern void PutString(uchar *ptr);extern void Delays(void);extern void Sent_Num(uint num);#endif//LCD12864.H#ifndef _LCD12864_H#define _LCD12864_H#include <msp430x14x.h>#define CPU_F ((double)8000000)#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))#define uchar unsigned char#define uint unsigned int#define ulong unsigned long/*12864应用指令*/#define CLEAR_SCREEN 0x01 //清屏指令:清屏且AC值为00H#define AC_INIT 0x02 //将AC设置为00H。
/***********************************************程序功能:通过RS485端口一次一次地收发数据------------------------------------------------测试说明:用示波器观察RS485端口A、B信号线上的波形或者用RS485接收器接收发回的字符,在串口助手上显示。
************************************************/#include <msp430x14x.h>#define DRE_out P3DIR |= BIT3 //连接485芯片的DE,RE端口的IO设置为输出状态#define DE P3OUT |= BIT3 //设置485芯片处于发送状态#define RE P3OUT &= ~BIT3 //设置485芯片处于接收状态typedef unsigned char uchar;unsigned char string[8] ;uchar RX_flag;void Set_UART1(void);void PutString0(uchar *ptr);void Send1Char(uchar sendchar);void PutString(uchar *ptr);/****************主函数****************/void main(void){unsigned int i;WDTCTL = WDTPW + WDTHOLD; //关闭看门狗P6DIR |= BIT2;P6OUT |= BIT2; //关闭电平转换DRE_out;RE;Set_UART1();_EINT();while (1){while( IFG2 & URXIFG1 ); //等待收到test命令字符if(RX_flag==1) //LET MCU A DO.{RX_flag=0;if(string[1]=='a'){DE;for(i=0;i<3200;i++);PutString0("a11.5522.33e ");Send1Char('\n');for(i=0;i<3200;i++);RE;//LPM3;}}}}/*******************************************函数名称:Set_UART1功能:设置MCU的UART1对应的寄存器参数:无返回值:无********************************************/void Set_UART1(void){P3SEL |= 0xC0; //将P3.6,P3.7选做UART1的通信端口ME2 |= UTXE1 + URXE1; //使能USART1的TXD和RXDUCTL1 |= CHAR; //选择8-bit字符UTCTL1 |= SSEL0; //驱动时钟选择ACLKUBR01 = 0x03; //波特率9600UBR11 = 0x00;UMCTL1 = 0x4a; //调整UCTL1 &= ~SWRST; //初始化UART状态机IE2 |= URXIE1 ; // 中断允许寄存器设置,接收中断允许}//串口接收中断,退出LPM3模式.#pragma vector=USART1RX_VECTOR__interrupt void usart1_rx (void){static uchar rxcount = 0;// LPM3_EXIT;if(RXBUF1 == 'e'){RX_flag =1;rxcount = 0;}else{string[rxcount++] = RXBUF1;}}/*******************************************函数名称:Send1Char功能:向PC机发送一个字符参数:sendchar--要发送的字符返回值:无********************************************/void Send1Char(uchar sendchar){while (!(IFG2 & UTXIFG1)); //等待发送寄存器为空TXBUF1 = sendchar;}/*******************************************函数名称:PutSting功能:向PC机发送字符串并换行指令参数:ptr--指向发送字符串的指针返回值:无********************************************/void PutString(uchar *ptr){while(*ptr != '\0'){Send1Char(*ptr++); // 发送数据}while (!(IFG2 & UTXIFG1));TXBUF1 = '\n'; //发送换行指令}/*******************************************函数名称:PutSting0功能:向PC机发送字符串,无换行参数:ptr--指向发送字符串的指针返回值:无********************************************/void PutString0(uchar *ptr){while(*ptr != '\0'){Send1Char(*ptr++); // 发送数据}}。
单片机MSP430与PC机串口通讯设计摘要在多机通信的分布式控制系统中,通过PC机的串口与多台单片机的通信是最方便的。
在这样的分布式控制系统中,单片机与微机之间的多路通信是整个系统的关键。
基于MSP430系列单片机自身优越的性能以与其超低功耗的特点,利用MSP430F149的USART可以实现这种分布式多机通信功能。
在解决了与PC串口或其他带有串口的终端相连所需要的串口电平和逻辑关系的转变之后,选用MSP430F149的异步模式UART,用C语言完成下位机(PC机)接收和发送数据程序,借助VC++6.0开发平台并利用PComm软件包完成上位机(单片机)的通信程序。
文章介绍了美国TI公司新一代16位Flash型MSP430F149系列单片机的结构、特性和功能。
详细介绍了如何利用VC十+6.0进行串口通讯程序的编制,重点介绍了如何利用实现异步通讯的方法。
关键词:MSP430系列单片机,多路通信,控制系统,异步模式,PcommDesign of the Serial Communicationbetween MSP430F149 and PCABSTRACTIn the controlled system of distributing type in which many computers are communicating, by way of the PC string contact with many single chip machines to correspond is the most convenient.In this controlled system of distributing type, the various communication between single chip machines and microcomputer is the whole key. According to the low achievement consume and perfect function of MSP430,The USART that used in system of MSP430F149 can carry out this kind of function of singular to group.It is required to solve the voltage conversionand the change of logic relation, when the MSP430 connects with the PC string or other terminals which take with strings.And then, we can choose the asynchronous module (UART) of MSP430F149 to complete the MSP430F149’s main processor in language of C and write out the PC’s processor asking for help from The VC++6.0 and The Pcomm.This paper introduces the structure, principle and feature of new generation of 16 bit&Flash-type microcontrollerwhich belongs to the Texas Instruments MSP430F149 series. At the same time, it alsointroduces how to carry out the method of theserial communication between PC and MSP430F149. The paper presents how to use VC++6.0 design serial port communicationprogram,especially calling Pcomm functions to control serial port to transfer data.KEY WORDS:MSP430F149single-chip computer, serialcommunication, control system,UART,PComm目录摘要1ABSTRACT2目录3前言4第一章串口通讯的系统组成与原理5§1.1 系统组成与通讯原理5§ 1.1.1 系统构成5§ 1.1.2 通信原理与协议6第二章硬件电路设计11§2.1 接口电平电路设计11§2.1.1 RS-232接口电路设计11§2.2 单片机电路设计14§2.2.1 单片机电路设计图14第三章软件设计16§3.1 功能描述16§3.1.1 上位机和下位机实现的功能16一、功能描述:16§3.2 程序设计16§3.2.1 下位机程序设计16§3.2.2 上位机(PC机)程序设计26结论31参考文献33前言在工业控制领域,由多单片机构成的系统很多,如大规模测控系统、大型车辆控制系统、机器人控制系统等。