打印

分享单片机读取TXT文档程序

[复制链接]
5019|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
shenmu2012|  楼主 | 2012-9-26 13:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这是我最近做的关于用单片机读取从串口调试小助手发送的TXT文件的程序,希望可以帮到大家的 啊。。这其中有什么问题的大家可以随时提的啊,谢谢!

#include <msp430f5310.h>
#define  uint unsigned int
unsigned char adc_flag =0,temp =0,rx_flag =0,RX_buffer1 =0xff,RX_buffer2=0xff;  //,deal_flag =0
unsigned int number =0,adc_number[2000];
unsigned int adc_temp=0xffff,a1=0xffff,a2=0xffff,a=0xffff,a0=0xffff,a00=0,RX_temp =0xffff;
void int_clk()  
{
  WDTCTL = WDTPW+WDTHOLD;                   //关闭看门狗
  PMAPPWD = 0x02D52;                        // Enable Write-access to modify port mapping registers
  P4MAP7 = PM_MCLK;
  PMAPPWD = 0;                                    // Disable Write-Access to modify port mapping registers
   UCSCTL3 |= SELREF_2;                      // Set DCO FLL reference = REFO
  UCSCTL4 |= SELA_2;                        // Set ACLK = REFO
  // Increase Vcore setting to level1 to support fsystem=12MHz
  // NOTE: Change core voltage one level at a time..
  //SetVcoreUp (0x01);
  // Initialize DCO to 12MHz  
  __bis_SR_register(SCG0);                  // Disable the FLL control loop
  UCSCTL0 = 0x0000;                         // Set lowest possible DCOx, MODx
  UCSCTL1 = DCORSEL_5;                      // Select DCO range 24MHz operation
  UCSCTL2 = FLLD_1 + 374;                   // Set DCO Multiplier for 12MHz
                                            // (N + 1) * FLLRef = Fdco
                                            // (374 + 1) * 32768 = 12MHz
                                            // Set FLL Div = fDCOCLK/2
  __bic_SR_register(SCG0);                  // Enable the FLL control loop
  // Worst-case settling time for the DCO when the DCO range bits have been
  // changed is n x 32 x 32 x f_MCLK / f_FLL_reference. See UCS chapter in 5xx
  // UG for optimization.
  // 32 x 32 x 12 MHz / 32,768 Hz = 375000 = MCLK cycles for DCO to settle
  __delay_cycles(375000);

  // Loop until XT1,XT2 & DCO fault flag is cleared
  do
  {
    UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + DCOFFG);
                                            // Clear XT2,XT1,DCO fault flags
    SFRIFG1 &= ~OFIFG;                      // Clear fault flags
  }while (SFRIFG1&OFIFG);                   // Test oscillator fault flag
                 
}
void UartConfig()
{  
  P4SEL = 0x30;                            // P4.0,4,5 USCI_A0 option select
  P4DIR |=BIT4;
  UCA1CTL1 |= UCSWRST;                      // **Put state machine in reset**
  UCA1CTL1 |= UCSSEL_2;                     // SMCLK
  UCA1BR0 = 78;                              // 12MHz 19200 (see User's Guide)
  UCA1BR1 = 0;                              // 12MHz 19200
  UCA1MCTL = UCBRS_0 + UCBRF_2 + UCOS16;   // Modln UCBRSx=0, UCBRFx=0,
                                            // over sampling
  UCA1CTL1 &= ~UCSWRST;                     // **Initialize USCI state machine**
  UCA1IE |= UCRXIE;                         // Enable USCI_A0 RX interrupt  
}
void main(void)
{
  int_clk();
  UartConfig();
__bis_SR_register(GIE);
   while(1)
   {
     if(adc_flag ==0x01)
     {
       adc_flag =0;
     adc_number[number++]=a00;
     // UCA1TXBUF = temp;      
     }
if(adc_flag ==0x02)
     {
       adc_flag =0;
       for(uint j=0;j<number;j++)
       {
         a00 =adc_number[j];
         temp = a00>>8;
         while (!(UCA1IFG&UCTXIFG));   
         UCA1TXBUF = temp;
         while (!(UCA1IFG&UCTXIFG));
         temp =a00;
         UCA1TXBUF = temp;  
       }
     }
     __no_operation();                         // For debugger
   }
  
}

#pragma vector=USCI_A1_VECTOR
__interrupt void USCI_A1_ISR(void)
{
  switch(__even_in_range(UCA1IV,4))
  {
  case 0:break;                             // Vector 0 - no interrupt
  case 2:                                   // Vector 2 - RXIFG
    while (!(UCA1IFG&UCTXIFG));             // USCI_A0 TX buffer ready?
    temp =UCA1RXBUF;
    if(temp >=65)
    {
      temp =temp -55;
      if(RX_buffer1 ==0xff)
       RX_buffer1 =temp;
      else if(RX_buffer2 ==0xff)
        RX_buffer2 =temp;
    }      
    else if(temp >=48)
    {
      temp =temp -48;
      if(RX_buffer1 ==0xff)
       RX_buffer1 =temp;
      else if(RX_buffer2 ==0xff)
        RX_buffer2 =temp;
    }  
    if(temp ==32)      
    {
      temp =RX_buffer1<<4;
      temp +=RX_buffer2;
      //deal_flag =0;
      RX_buffer1 =0xff;
      RX_buffer2 =0xff;
      if(rx_flag ==0)
      {
        adc_temp = temp;
        adc_temp =adc_temp <<8;
        rx_flag =0x01;
      }
      else if(rx_flag ==0x01)
      {
         rx_flag =0;
         adc_temp += temp;
         if(adc_temp ==0xaaaa)
         {
          adc_flag =0x02;
         }
         else
         {
           if(a1 ==0xffff)                        //
            a1=adc_temp;
           else if(a2 ==0xffff)
            a2 =adc_temp;  
           if((a1 ==0xffff)||(a2 ==0xffff))
            {;}
           else
            adc_flag =0x01;
         }
      }
    }
   
    //if(rx_flag ==0x01)
    //{
    //  rx_flag =0;
    //  adc_number[number++] =temp;
    //}
    break;
  case 4:break;                             // Vector 4 - TXIFG
  default: break;
  }
}
评分
参与人数 2威望 +2 收起 理由
tee. + 1
tianm + 1

相关帖子

沙发
wjzx111056| | 2012-9-26 19:56 | 只看该作者
很不错的!谢谢!感谢楼主的分享!好好学习一下!

使用特权

评论回复
板凳
tianm| | 2012-9-27 09:43 | 只看该作者
谢谢分享!

使用特权

评论回复
地板
MAMAM| | 2012-9-27 15:42 | 只看该作者
辛苦辛苦 嘿嘿

使用特权

评论回复
5
ellen325| | 2012-9-27 16:57 | 只看该作者
眼花缭乱啊

使用特权

评论回复
6
gool| | 2012-9-27 17:12 | 只看该作者
楼主辛苦

使用特权

评论回复
7
ellen325| | 2012-9-28 17:44 | 只看该作者
谢谢分享

使用特权

评论回复
8
hawksabre| | 2012-9-28 18:58 | 只看该作者
楼主好歹把注释加进来   看着代码很吃力   建议写代码规范一点   该有的注释一定要加   将程序模块化   这样看起来不吃力

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

76

主题

4324

帖子

9

粉丝