找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2035|回复: 1
打印 上一主题 下一主题
收起左侧

MSP430单片机异步通信程序(发送),含注释

[复制链接]
跳转到指定楼层
楼主
ID:808634 发表于 2021-7-24 14:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. /*************************
  2. 发送数据帧的程序
  3. 利用发送中断,发送过程不阻塞CPU继续执行后续代码
  4. Author:七禾页8
  5. site:创客基地

  6. 缺点:必须整帧地发送数据。
  7. 需要将一次发送的数据都先整理完毕才能启动发送,
  8. 且必须等待上一帧发完才能启动下一帧的发送,
  9. 不能在程序中随时地按字节发送数据
  10. **************************/

  11. #include "msp430x14x.h"

  12. #define uint unsigned int
  13. #define uchar unsigned char
  14. #define ulong unsigned long
  15. #define TXBUF_SIZE 32   //一帧最多能发送的数据字节数
  16. unsigned char TX_BUFF[TXBUF_SIZE];      //发送缓冲区
  17. unsigned char TX_NUM;     //发送字节总数变量
  18. unsigned char TX_CNT;     //发送字节计数变量



  19. /*******************************
  20. *名称:UART0_PutFrame()
  21. *功能:从串口发送1帧数据
  22. *入口参数:Ptr:待发送数组的首地址(数组名)
  23.            Lenth:数据帧长度
  24. *出口参数:返回1表示成功
  25.            返回0表示失败
  26. *说明:发送过程中,不阻塞CPU运行
  27. ********************************/
  28. char UART0_PutFrame(unsigned char*Ptr,unsigned int Lenth)
  29. {
  30.   int i;
  31.   if(IE1 & UTXIE0)
  32.     return (0);   //如果上一帧没发送完,返回0
  33.   if(Lenth>TXBUF_SIZE)
  34.     return(0);    //长度超过最大缓冲区,返回0
  35.   for(i=0;i<Lenth;i++)
  36.   {
  37.     TX_BUFF[i]=Ptr[i];    //待发送数据装填进入发送缓冲区
  38.   }
  39.   TX_CNT = 0;   //发送字节数清0
  40.   TX_NUM = Lenth;   //发送字节总数
  41.   IFG1 |= UTXIFG0;    //人为制造第一次发生中断
  42.   IE1 |= UTXIE0;  //允许UART0的发送中断
  43.   return(1);      //返回发送成功
  44. }

  45. /*************************
  46. 发送中断
  47. **************************/
  48. #pragma vector = UART0TX_VECTOR
  49. __interrupt void UART0_TX(void)   //串口发送中断
  50. {
  51.   U0TXBUF = TX_BUFF[TX_CNT];      //将本次应该发送的数据送入TXBUF
  52.   TX_CNT++;     //下一次 依次发送后续字节
  53.   if(TX_CNT >= TX_NUM)      //发送字节计数到达发送总数
  54.   {
  55.     IE1 &= ~UTXIE0;    //禁止UART0的发送中断,停止发送
  56.   }
  57. }

  58. /********************
  59. 时钟初始化
  60. ***********************/
  61. void BCS_Init()
  62. {
  63.   uchar j;
  64.   WDTCTL = WDTPW + WDTHOLD;   //关闭看门狗
  65.   //使用外部高频晶体振荡器
  66.   BCSCTL1&=~XT2OFF;       //使用外部XT2晶振8M
  67.   do{
  68.       IFG1&=~OFIFG;   
  69.       for(j=0XFF;j>0;j--);
  70.     }while((IFG1&OFIFG));    //等待晶振震荡平稳
  71.   BCSCTL2|=SELM_2;        //MCLK选择XT2
  72. }


  73. /********************
  74. IO初始化
  75. ***********************/
  76. void IO_Init()
  77. {
  78.   P3DIR|=BIT4;      //P3.4  UTXD0设置为输出
  79.   P3DIR&=~BIT5;     //P3.5  URXD0设置为输入
  80.   P3SEL|=BIT4+BIT5;     //开启第二功能 (通信功能)
  81. }


  82. /********************
  83. 通信初始化
  84. ***********************/
  85. void communication_Init()
  86. {
  87.         ME1 |= UTXE0 + URXE0;  // 使能USART0收发
  88.         UCTL0 |= CHAR + SWRST;     // 8-bit 数据,一位停止位 SWRST=1 设置串行口
  89.         UTCTL0 |= SSEL0;           // 选择时钟,UCLK = ACLK,32768
  90.         UBR00 = 0x03;    // 32k/9600选择ACLK
  91.         UBR10 = 0x00;   //
  92.         UMCTL0 = 0x4a;            // Modulation
  93.         UCTL0 &= ~SWRST;    // 初始化UART0状态机,一般要设置好串口之后才复位
  94.         P2DIR |= BIT0;
  95. /*************在初始化代码中增加下面两句*************/
  96.         IE1 |= URXIE0 + UTXIE0;           // URXIE0允许接收中断 + UTXIE0允许发送中断
  97.         _EINT();     //总中断允许
  98. }



  99. void main( void )
  100. {
  101.     uchar TxTestBuff[8]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08};
  102.     BCS_Init();     //时钟初始化
  103.     IO_Init();      //IO初始化
  104.     communication_Init();   //通信初始化
  105.     while(1)
  106.     {
  107.       UART0_PutFrame(TxTestBuff,8);     //发送一个长度约为8B的数据帧
  108.       __delay_cycles(10000000);           //约一秒发送一次
  109.     }
  110. }


复制代码


评分

参与人数 1黑币 +30 收起 理由
admin + 30 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:33438 发表于 2021-10-7 22:51 | 只看该作者
谢谢分享 正在学习中 好东西
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表