|
本程序是《MSP430系列单片机系统工程设计与实践》书里面的源码,(包含工程文件 (例2.9.x)))完整例程下载:http://www.51hei.com/bbs/dpj-46245-1.html
‘
关于本程序的详细解说大家可以下载电子书点击上图即可
UART发帧程序:
- #include <msp430x42x.h>
- unsigned char TX_BUFF[8]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08};/*待发送数组*/
- /*****************************************************************
- * 名 称:UART0_ PutFrame ()
- * 功 能:从串口发送1帧数据
- * 入口参数:Ptr:待发送数组的首地址(数组名)
- * Lenth:数据帧长度
- * 出口参数:无
- * 说 明: 发送过程中,会阻塞CPU运行
- *****************************************************************/
- void UART0_PutFrame(unsigned char * Ptr, unsigned int Lenth)
- {
- int i;
- U0TCTL |= TXWAKE; // 产生一个线路空闲时间
- TXBUF0=0; // 写入任意字节
- while ((IFG1 & UTXIFG0)==0); // 等待该字节发完(实际上并未发出)
- for(i=0;i<Lenth;i++)
- {
- TXBUF0=Ptr[i];
- while ((IFG1 & UTXIFG0)==0); // 等待该字节发完
- IFG1 &=~ UTXIFG0; // 清除发送标志位
- }
- while ((U0TCTL & TXEPT)==0); // 等待最后一字节数据发出(移位寄存器空)
- }
- void main( void )
- {
- WDTCTL = WDTPW + WDTHOLD; // 停止看门狗
- FLL_CTL0 |= XCAP18PF; // 配置晶振负载电容
- U0CTL = CHAR; // 异步通讯模式,8位数据,无校验,1位停止位。
- ME1 |= UTXE0 + URXE0; // 开启串口0收发模块
- U0TCTL |= SSEL0; // 选择ACLK作为串口波特率时钟源。
- U0BR1 = 0; //
- U0BR0 = 13; // 分频系数整数部分=13
- U0MCTL = 0x6B; // 分频系数小数部分调制=5/8。(2400bps)
- P2SEL |= BIT4 + BIT5; // P2.4,5 开启第二功能,作为串口收发引脚(不同单片机有差别)
- while(1)
- {
- UART0_PutFrame(TX_BUFF,8);//发送一个数据帧
- _NOP(); //在这一句设断点查看调试用
- }
- }
复制代码
UART高效发帧:
- #include <msp430x42x.h>
- #define TXBUF_SIZE 32 /*一帧最多能发送的数据字节数*/
- unsigned char TX_BUFF[TXBUF_SIZE]; /*发送缓冲区*/
- unsigned char TX_NUM; /*发送字节总数变量*/
- unsigned char TX_CNT; /*发送字节计数变量*/
- /*****************************************************************
- * 名 称:UART0_ PutFrame ()
- * 功 能:从串口发送1帧数据
- * 入口参数:Ptr:待发送数组的首地址(数组名)
- * Lenth:数据帧长度
- * 出口参数:返回1表示发送成功,
- 返回0表示发送失败。
- * 说 明: 发送过程中,不阻塞CPU运行
- *****************************************************************/
- char UART0_PutFrame(unsigned char * Ptr, unsigned int Lenth)
- {
- int i;
- if(IE1 & UTXIE0) return(0); //如果上一帧没发送完,返回0
- if(Lenth>TXBUF_SIZE) return(0); //长度超过最大缓冲区,返回0
- for(i=0;i<Lenth;i++)
- {
- TX_BUFF[i]=Ptr[i]; // 待发送数据装入发送缓冲区
- }
- TX_CNT=0; // 发送字节计数清零
- TX_NUM=Lenth; // 发送字节总数
- IFG1|=UTXIFG0; // 人为制造第一次发生中断
- IE1 |= UTXIE0; // 允许UART0的发送中断
- return (1); // 返回发送成功
- }
- #pragma vector=UART0TX_VECTOR
- __interrupt void UART_TX (void) //串口发送中断
- {
- U0TXBUF=TX_BUFF[TX_CNT]; //将本次应该发送的数据送入TXBUF
- TX_CNT++; //下一次依次发送后续字节
- if(TX_CNT >=TX_NUM) //发送字节计数值到达发送总数
- {
- IE1 &=~ UTXIE0; // 禁止UART0的发送中断,停止发送
- }
- }
- void main( void )
- {
- unsigned char TxTestBuff[8]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08};
- WDTCTL = WDTPW + WDTHOLD; // 停止看门狗
- FLL_CTL0 |= XCAP18PF; // 配置晶振负载电容
- U0CTL = CHAR; // 异步通讯模式,8位数据,无校验,1位停止位。
- ME1 |= UTXE0 + URXE0; // 开启串口0收发模块
- U0TCTL |= SSEL0; // 选择ACLK作为串口波特率时钟源。
- U0BR1 = 0; //
- U0BR0 = 13; // 分频系数整数部分=13
- U0MCTL = 0x6B; // 分频系数小数部分调制=5/8。(2400bps)
- P2SEL |= BIT4 + BIT5; // P2.4,5 开启第二功能,作为串口收发引脚(不同单片机有差别)
- _EINT(); // 总中断允许
- while(1)
- {
- UART0_PutFrame(TxTestBuff,8); //发送一个数据帧
- __delay_cycles(1000000); //约一秒发送一次
- }
- }
复制代码
UART收帧(例2.9.6)
- #include <msp430x42x.h>
- #define FrameLenth 8 /*数据帧长度=8*/
- #define LocalAddr 0x01 /*本机地址=0x01*/
- unsigned char RX_BUFF[FrameLenth]; /*接收数据帧存放数组*/
- /*****************************************************************
- * 名 称:UART0_ GetFrame ()
- * 功 能:从串口接收1帧数据
- * 入口参数:Addr:首字节地址匹配,只接受地址匹配的数据帧
- * Lenth:数据帧长度
- * 出口参数:无(接收数据存于全局变量数组内)
- * 说 明: 如果串口没有数据,会一直等待。等待过程中,会阻塞CPU运行
- *****************************************************************/
- void UART0_GetFrame(unsigned char Addr, unsigned int Lenth)
- {
- unsigned int RcvCnt;
- while(1)
- {
- U0RCTL |= URXWIE; // 仅响应帧头首字节
- while ((IFG1 & URXIFG0)==0); // 等待接收一字节
- IFG1 &=~ URXIFG0; // 清除接收标志位
- CHK_ADDR:
- if(U0RXBUF==LocalAddr) // 如果与首地址匹配
- {
- U0RCTL &=~ URXWIE; // 之后响应全部数据,接收数据帧其他字节
- RX_BUFF[0]=U0RXBUF; // 接收第一字节
- RcvCnt=1; // 接收字节计数
- break; // 跳出帧头识别循环,继续接收其他字节
- }
- }
- while(RcvCnt<Lenth) // 直到接收完8字节
- {
- while ((IFG1 & URXIFG0)==0); // 等待接收一字节
- IFG1 &=~ URXIFG0; // 清除接收标志位
- if(U0RCTL & RXWAKE) // 如果又收到的是帧首,说明数据帧中断
- {
- goto CHK_ADDR; // 重新开始接收
- }
- RX_BUFF[RcvCnt]=U0RXBUF; // 放入接收数组的对应位置
- RcvCnt++; // 下一字节放入数组的后一单元
- }
- }
- void main( void )
- {
- WDTCTL = WDTPW + WDTHOLD; // 停止看门狗
- FLL_CTL0 |= XCAP18PF; // 配置晶振负载电容
- U0CTL = CHAR; // 异步通讯模式,8位数据,无校验,1位停止位。
- ME1 |= UTXE0 + URXE0; // 开启串口0收发模块
- U0TCTL |= SSEL0; // 选择ACLK作为串口波特率时钟源。
- U0BR1 = 0; //
- U0BR0 = 13; // 分频系数整数部分=13
- U0MCTL = 0x6B; // 分频系数小数部分调制=5/8。(2400bps)
- P2SEL |= BIT4 + BIT5; // P2.4,5 开启第二功能,作为串口收发引脚(不同单片机有差别)
- while(1)
- {
- UART0_GetFrame(LocalAddr,FrameLenth);//接收一个数据帧
- _NOP(); //在这一句设断点查看RX_BUFF[]数组的数据
- }
- }
复制代码
|
|