2462|0

2781

帖子

417

TA的资源

五彩晶圆(中级)

楼主
 

MSP430F149单片机与PC超级终端利用Xmodem协议传输文件的程序 [复制链接]

  1. /**********************************************************
  2. 日期:2007-06-04
  3. 编写:李猛
  4. 功能:430单片机先接收文件然后再发送给PC
  5. **********************************************************/
  6. #include <msp430x14x.h>

  7. /***************************DEFINE***************************/
  8. #define uchar unsigned char

  9. //Xmodem的术语
  10. #define SOH 0x01
  11. #define EOT 0x04
  12. #define ACK 0x06
  13. #define NAK 0x15
  14. #define CAN 0x18
  15. #define C1 0x43               //避免与msp430x14x.h文件产生冲突,故将C定义为C1

  16. uchar recFile[10][133]; //接收文件存储区,大小1330B
  17. uchar recBuf[133];            //数据包接收缓冲区

  18. uchar i=0;
  19. uchar j=0;                    //recFile的行和列
  20. uchar k=0;                    //recBuf的下标

  21. uchar countTB=0;              //TimerB中断计数,实现1s的定时
  22. uchar sendC=0;                //发送C的标志,保证每1s只发送一次C

  23. uchar fullBuf=0;              //此次数据包接收完成标志
  24. uchar Seq;                    //包序号-1,即放置本数据包时对应的recFile的行标

  25. uchar sendFlag=0;             //430开始作为发送方的标志
  26. uchar recPC;                  //430作为发送方时收到的PC的命令
  27. //uchar Seq1;
  28. //uchar cmpl;                 //430发送数据包时的包序号及包序号的补码
  29. uchar p=0;                    //430发送数据包的次数,对应recFile的行标
  30. uchar sendBuf[133];           //430发送时的发送数据包缓冲区,长133B

  31. void Init_CLK();              //函数声明
  32. void Init_Port();
  33. void Init_UART0();
  34. void Init_TimerB();

  35. /***************************主函数***************************/
  36. void main(void)
  37. {  
  38.        WDTCTL = WDTPW + WDTHOLD;        //关闭看门狗
  39.   
  40.        _DINT();                         //关全局中断
  41.   
  42.        Init_CLK();
  43.        Init_Port();
  44.        Init_UART0();               
  45.        Init_TimerB();                   //一系列的初始化
  46.   
  47.        _EINT();                         //开全局中断
  48.   
  49.        while (recBuf[0] != SOH)         //PC没有开始发送数据的时候,每隔1s发送一个C
  50.        {
  51.          if (countTB == 0)
  52.          {
  53.            if (sendC == 0)
  54.            {
  55.              while ((IFG1 & UTXIFG0)==0);
  56.              TXBUF0 = C1;
  57.              sendC = 1;
  58.            }
  59.          }
  60.          else
  61.          {
  62.            sendC = 0;
  63.          }
  64.        }
  65.        TBCTL &= ~(MC1+MC0);             //PC开始发送数据时,停止TimerB
  66.    
  67.        while(sendFlag == 0)             //430处于接收状态
  68.        {
  69.          if (recBuf[0] == EOT)
  70.          {
  71.            while ((IFG1 & UTXIFG0)==0);
  72.            TXBUF0 = ACK;
  73.       
  74.            sendFlag = 1;
  75.          }
  76.          else if (fullBuf == 1)
  77.          {
  78.            Seq = recBuf[1]-1;
  79.            k = 0;
  80.            fullBuf = 0;
  81.       
  82.            i = Seq;
  83.            j = 0;
  84.            /*
  85.            while (j<128)
  86.            {
  87.              recFile[i][j] = recBuf[j+3];
  88.              j++;
  89.            }
  90.            */
  91.            while (j<133)
  92.            {
  93.              recFile[i][j] = recBuf[j];
  94.              j++;
  95.            }
  96.            while ((IFG1 & UTXIFG0)==0);
  97.            TXBUF0 = ACK;
  98.          }
  99.        }
  100.   
  101.        while (recPC != C1);             //430处于等待发送状态,等待PC发送的"C"
  102.        p = 0;
  103.        while (p<=Seq)                   //430依次发送数据包
  104.        {
  105.          j = 0;
  106.          while (j<133)
  107.          {
  108.            while ((IFG1 & UTXIFG0)==0);
  109.            TXBUF0 = recFile[p][j];
  110.            j++;
  111.          }
  112.          while (recPC != ACK);
  113.          recPC = 0;
  114.          p++;
  115.        }
  116.        while ((IFG1 & UTXIFG0)==0);
  117.        TXBUF0 = EOT;
  118.   
  119.        while (recPC != ACK);
  120.        while (1);
  121. }

  122. /***************************时钟初始化函数***************************/
  123. void Init_CLK(void)
  124. {
  125.        BCSCTL1=0x00;
  126.        BCSCTL1 += XT2OFF;       //关闭XT2,因为板子上没有
  127.        BCSCTL1 += XTS;          //低速振荡器是高频模式
  128.   
  129.        BCSCTL2=0x00;
  130.        BCSCTL2 += SELM0;
  131.        BCSCTL2 += SELM1;        //MCLK的时钟源为低速晶体振荡器
  132.                            //此外,ACLK的时钟源为LFTX1,SMCLK的时钟源为DC0CLK
  133.                            //分频因子均为1
  134. }

  135. /***************************端口初始化函数***************************/
  136. void Init_Port(void)
  137. {
  138.        P3DIR=0;
  139.        P3SEL=0;                 //P3所有管脚均初始化为输入方向和一般I/O口
  140.   
  141.        return;
  142. }

  143. /***************************串口初始化函数***************************/
  144. void Init_UART0(void)
  145. {
  146.        U0CTL=SWRST;             //串行模块设置时的必须
  147.        U0CTL += CHAR;           //8位数据位,1位停止位,无校验位
  148.   
  149.        U0TCTL=0x00;
  150.        U0TCTL += SSEL0;         //波特率时钟源选择为ACLK
  151.   
  152.        U0BR1=0x01;
  153.        U0BR0=0xA0;
  154.        U0MCTL=0xBA;             //设置波特率为9600
  155.   
  156.        U0CTL &= ~SWRST;
  157.   
  158.        ME1 |= UTXE0+URXE0; //使能USART0模块
  159.        IE1 |= URXIE0;           //使能USART0的接收中断
  160.   
  161.        P3SEL |= BIT4+BIT5; //P3.4和P3.5为串口功能
  162.        P3DIR |= BIT4;           //P3.4为输出
  163.   
  164.        return;
  165. }

  166. /***************************TimerB初始化函数***************************/
  167. void Init_TimerB(void)
  168. {
  169.        TBCTL = TBSSEL0 + ID1 + ID0 + TBCLR; //时钟源选择ACLK,1/8分频,清除TimerB
  170.        TBCCTL0 = CCIE;                           //TBCCRO中断允许
  171.        TBCCR0 = 50000;                           //定时时间0.1s
  172.        TBCTL |= MC0;                             //增计数模式,定时器打开
  173. }

  174. /***************************接收中断函数***************************/
  175. #pragma vector=USART0RX_VECTOR
  176. __interrupt void Usart0Rx()
  177. {
  178.        if (sendFlag == 1)
  179.        {
  180.          recPC = RXBUF0;
  181.        }
  182.        else
  183.        {
  184.          recBuf[k] = RXBUF0;
  185.          k++;
  186.          if (k == 133)
  187.          {
  188.            fullBuf = 1;
  189.          }
  190.        }
  191.   
  192.        return;
  193. }

  194. /***************************TimerB中断函数***************************/
  195. #pragma vector=TIMERB0_VECTOR
  196. __interrupt void TIMERB0(void)
  197. {
  198.        countTB++;
  199.        if (countTB == 10)
  200.        {
  201.          countTB = 0;
  202.        }
  203.   
  204.        return;
  205. }
复制代码


 
点赞 关注
个人签名

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表