原创 24位高精度A/D转换器LTC2400读写应用

2010-9-17 16:27 2430 7 8 分类: 消费电子

24bit高精度A/D转换器通信代码,MCU采用PIC16F877,读到的AD值传送到超级终端显示:


/************************************************************************************/
/*     程式名:LTC2400讀寫代碼                                                      */
/*                                                                                  */
/*     晶振:  20M                                           CPU型號: PIC16F877A   */
/*                                                                                  */
/*     作者:  Randy                                         日期:    2010-08-27   */
/*                                                                                  */
/************************************************************************************/
#include <pic.h>
#include <stdio.h>
__CONFIG(0X3732);
#define   ADC_SDO   RC4
#define   ADC_SCK   RC3
#define   ADC_CS    RC5
const unsigned char hz[]="輸入電壓是:";
const unsigned char de[]="V";
//unsigned int tmp[4]={0};
static bank1 unsigned long data,dianya;
static bank1 unsigned long voltage;
double x[5];
int t=0,zz;
static bank1 char m[9];
static bank1  unsigned long yushu[9];
//------------------------延時--------------------------------//
void delay_1ms(unsigned int x)
{
  unsigned a,b;
  for(a=5*x;a>0;a--)
   for(b=110;b>0;b--);
}
/*從SPI總線上讀入32bit*/
unsigned long read_ADC(void)
{
   char k;
   unsigned long n=0;
   ADC_CS = 1;
   ADC_SCK= 0;
   ADC_CS = 0;
   for(k=0; k<32; k++)
   {
     n << = 1;
     ADC_SCK = 1;
     n |= ADC_SDO;
  ADC_SCK = 0;
    }
 ADC_CS = 1;


if((n & 0x20000000) ==0)   //判讀輸入是否為負
t=1;
else     
t=0;
       n&=0x01fffffff; // maskout sign bit
       n>>=4;   // get 24-bit conversion result
     return n;
}


/* 5-point average */
double filter_ADC(void)
{
double L=0;
int i;
for(i=0;i<5;i++)    //5次平均
{
x=read_ADC();
if(t==1)            //輸入為負處理
{
   L+=0;
}


else if(t==0)
L+ = x;
delay_1ms(170);   //200ms延時等待轉換結束
}
    return L/5;   //5次平均
}



//-----------MCU初始化-----------//
void initial ()
{
    TRISC=0X10;
    SPBRG=0X81; //20MHz設置串列傳輸速率為9600BPS
    TXSTA=0X24; //使能串口發送,選擇高速串列傳輸速率
    RCSTA=0X90; //使能串口工作2,連續接收
}



void send()
{
//int baiwan,shiwan,wan,qian,bai,shi,ge;
int z;
unsigned long tmp;
int i;
m[0]=voltage/16777216+0X30;  //整數部分
   for(i=1;i<9;i++)   //取8位小數
      {
       yushu[0]=voltage%16777216;
       m=yushu[i-1]/1677721.6+0X30;
       yushu=10*yushu[i-1]%16777216;
      }


for(z=0;z<11;z+=2)    //發送漢字
{
 delay_1ms(3);
while(TXIF)
{
TXREG=hz[z];
TXREG=hz[z+1];
}
}


 delay_1ms(3);
        TXREG=m[0];     //輸出整數部分
 delay_1ms(3);
        TXREG=0X2E;    //輸出小數點
 delay_1ms(3);
        TXREG=m[1];
        TXREG=m[2];
 delay_1ms(3);
        TXREG=m[3];
        TXREG=m[4];
 delay_1ms(3);
        TXREG=m[5];
        TXREG=m[6];
 delay_1ms(3);
        TXREG=m[7];
        TXREG=m[8];
 delay_1ms(3);
while(TXIF)
TXREG=de[0];
TXREG=de[1];          //輸出"V"
 delay_1ms(3);    //下次輸出需要延時
TXREG=0X0D;
TXREG=0X0A;           //輸出換行
     }
 


main()
{
initial ();
while(1)
     {
     data = (unsigned long)filter_ADC();
     voltage =data*5;
//dianya=(long)voltage;
send();
     }
}


 

PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户1760798 2015-8-21 10:39

为什么主函数要data*5
相关推荐阅读
用户1314788 2012-02-03 15:20
评论:@jjldc(九九)的电子博客 博客中提到的“转一篇比较详细介绍FatFs文件系统移植的文章”
11...
用户1314788 2011-05-04 10:11
STM32 IAP
引导加载程序是存储在内部引导ROM存储器(系统内存),其主要任务是通过下载应用程序到内部FLASH通过USART1的通信接口. 从系统内存启动bootloader然后通过USART1接口外设下载应...
用户1314788 2011-04-11 09:31
基于AVR单片机队列的UART通信模块
对于堆栈来说,插入、删除操作是固定在一端进行的,这一端称为“栈顶”,另一端称为“栈底”。 堆栈指针(Stack  Pointer)用于指示栈顶位置(地址),在有些单片机中,堆栈指针可以通过程序去设置。...
用户1314788 2011-04-08 11:03
assert_param STM32的固件库 使用须知
在STM32的固件库和提供的例程中,到处都可以见到assert_param()的使用。如果打开任何一个例程中的stm32f10x_conf.h文件,就可以看到实际上assert_param是一个宏定义...
用户1314788 2011-03-30 16:50
单片机的非OS的事件驱动思考1
很多单片机项目恐怕都是没有操作系统的前后台结构,就是main函数里用while无限循环各种任务,中断处理紧急任务。这种结构最简单,上手很容易,可是当项目比较大时,这种结构就不那么适合了,编写代码前你...
用户1314788 2011-03-24 14:41
C
要从逻辑上删除一段C代码,更好的办法是用#if指令。 #if  0   statements#endif int *a;*a = 12;  //我们声明了这个指针变量,但从未对它进行过初始化,所以我们...
EE直播间
更多
我要评论
1
7
关闭 站长推荐上一条 /3 下一条