用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 上传
点击文件名下载附件
[
本帖最后由 莫回头 于 2011-8-23 21:36 编辑 ]
此帖出自
小平头技术问答
一周热门 更多>