430控制24位AD模块

2019-03-24 12:35发布

用msp430f149控制一款24位的AD模块,结果在12864上显示一直是满值的一半,不知道程序怎么写 了。我把原来的51参考代码改为430的,不行啊。AD程序在51上是好的,液晶正常显示,只有在430上出现了这样的问题,我知道可能是程序的问题,但不知道出在什么地方,各位高手帮忙解答一下,谢谢!!! 程序代码: #include<msp430x14x.h>
 #include  "cry12864.h"   typedef unsigned char uchar;
  typedef unsigned int  uint;
 
  #define  ADDout  (P6IN&0x01)
  #define  ADSck1   P6OUT|=BIT1  
  #define  ADSck0   P6OUT&=~BIT1  // ADC24pins
 
  //***************functions define**************************//
     unsigned long ReadCount(void);
  void DelayNus(uint n);
     void chuli();
     void ClkInit();
 //*************main function****************************//
    
  void main()
  {
   
    unsigned int i;
    WDTCTL=WDTPW+WDTHOLD; //关掉看门狗
     /*------选择系统主时钟为8MHz-------*/
      ClkInit();
    //计数时钟选择SMLK=8MHz,1/8分频后为1MHz
     TACTL |= TASSEL_2 + ID_3;
    //打开全局中断
    //_EINT();
   
      Ini_Lcd();                  //初始化液晶
    //  P2DIR|=0xff;
     // P2OUT|=0xff;
   
      P6DIR|=0xfe; //P6.0输入,其余输出
     
     while(1)
   { 
         Write_Cmd(0x80);
      
         chuli();
         //temp=ReadCount();
        //temp>>=16;
        //P2OUT&=temp;
       for (i=0;i<20000;i++); //for语句,i为循环变量,i每次循环加1,当i<20000时,
        //循环延时
    }
  }
 
 /****************************************************************************
* 名    称:ClkInit
* 功    能:时钟系统初始化  MCLK为8MHz,分频后位1M,SMCLK为1MHz
* 入口参数:无
* 出口参数:无
****************************************************************************/
void ClkInit()
{
    char i;
    BCSCTL1 &= ~XT2OFF;             //打开XT2振荡器
    IFG1&=~OFIFG;                   //清除振荡错误标志
    while((IFG1&OFIFG)!=0)
    {
        for(i=0;i<0xff;i++);
        IFG1&=~OFIFG;               //清除振荡错误标志
    }
    BCSCTL2 |= SELM_2+SELS+DIVS_3;  //MCLK为8MHz,SMCLK为1MHz }  //*************24ADC function*******************************//
     unsigned long ReadCount()
    {  
           unsigned long Count; 
           unsigned char i,temp;
          
           Count=0;
           temp=ADDout;
           if(temp)  //ADDout为1
           ADSck0;            // DOut=1,Sck=0时表明A/D 转换器还未准备好输出数据
                       //即AD转换未结束
           
           while(temp); //等待Dout为0,判断AD转换是否结束,未结束继续等待,否则
                          //读取结果
       
                  
            for(i=0;i<24;i++)
      {  
                
              ADSck1;    //sck上升沿 (发送脉冲)
                 Count=Count<<1;   //  sck下降沿来临时变量左移一位,右侧补零
                
              ADSck0;
               
              if(~temp) //Dout为0,变量加1,继续AD转换
     Count++;
              
             } 
                //DelayNus(10000);
                ADSck1;
                Count=Count^0x800000;   // 第25个脉冲下降沿时转化数据   128增益
                //DelayNus(50);
                ADSck0;
                //DelayNus(10);
               return (Count);
              
    }
 
void chuli()
 {
   unsigned long temp,x1,x2,x3,x4,x5,x6,x7,x8;
   temp=ReadCount();
  
   x1=temp/10000000;
   x2=temp/1000000%10;
   x3=temp/100000%100%10;
   x4=temp/10000%1000%100%10;
   x5=temp/1000%10000%1000%100%10;
   x6=temp/100%100000%10000%1000%100%10;
   x7=temp/10%1000000%100000%10000%1000%100%10;
   x8=temp%10;    Write_Data(x1+0x30);
 Write_Data(x2+0x30);
 Write_Data(x3+0x30);
 Write_Data(x4+0x30);
 Write_Data(x5+0x30);
 Write_Data(x6+0x30);
 Write_Data(x7+0x30);
 Write_Data(x8+0x30);
 //delay_ms(1000);
 }  
/*******************************************
函数名称:DelayNus
功    能:实现N个微秒的延时
参    数:n--延时长度
返回值  :无
说明    :定时器A的计数时钟是1MHz,CPU主频8MHz
          所以通过定时器延时能够得到极为精确的
          us级延时
********************************************/
void DelayNus(uint n)
    CCR0 = n;
    TACTL |= MC_1;           //增计数到CCR0
    while(!(TACTL & BIT0));   //等待
    TACTL &= ~MC_1;          //停止计数
    TACTL &= ~BIT0;          //清除中断标志
}   专用型高精度24位AD转换器芯W.pdf (514.77 KB, 下载次数: 121) 2011-8-23 15:27 上传 点击文件名下载附件 AD HX711原理图W.pdf (55.88 KB, 下载次数: 59) 2011-8-23 15:27 上传 点击文件名下载附件 HX711PCB.JPG       [ 本帖最后由 莫回头 于 2011-8-23 21:36 编辑 ] 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
6条回答
bluewaterma
2019-03-25 05:06
mama

一周热门 更多>

相关问题

    相关文章