单片机内部硬件SPI通信.rar

  • mygodpeter
    了解作者
  • C51
    开发工具
  • 51.5KB
    文件大小
  • rar
    文件格式
  • 0
    收藏次数
  • 2 积分
    下载积分
  • 1
    下载次数
  • 2022-01-07 16:58
    上传日期
51内核单片机硬件spi读写ADS1256源代码,高精度采样例子。
单片机内部硬件SPI通信.rar
  • STC15单片机内部硬件SPI通信
  • ads1256.__i
    46B
  • ads1256.uvgui.zym
    68.7KB
  • main.c
    1.4KB
  • ads1256.LST
    12KB
  • ads1256.uvgui_zym.bak
    72.9KB
  • spi.h
    2.4KB
  • ads1256.lnp
    59B
  • ads1256
    28.2KB
  • ads1256.OBJ
    16.9KB
  • ads1256.hex
    5.3KB
  • ads1256.M51
    15.8KB
  • ads1256.c
    7.1KB
  • UART.h
    1KB
  • ads1256.plg
    375B
  • main.LST
    3KB
  • ads1256.uvproj
    13.6KB
  • ads1256.h
    2.9KB
  • ads1256.uvopt
    4.9KB
  • ads1256_uvproj.bak
    12.9KB
  • main.OBJ
    14.3KB
  • ads1256_uvopt.bak
    57.1KB
内容介绍
#include"stc15.h" #include "ads1256.h" void sendStr(unsigned char *s); void sendChar(unsigned char ch); unsigned char SPI_SendByte(unsigned char SPI_SendData); //-----------------------------------------------------------------// // 功 能:延时 // 入口参数: 延时时间 delay * us // 出口参数: / // 全局变量: / // 备 注: //-----------------------------------------------------------------// void Delay(unsigned int dal) { unsigned int i; for(i = 0;i < dal;i ++); } //-----------------------------------------------------------------// // 功 能: 模拟SPI通信 // 入口参数: / 发送的SPI数据 // 出口参数: / 接收的SPI数据 // 全局变量: / // 备 注: 发送接收函数 //-----------------------------------------------------------------// /* unsigned char SPI_SendByte(unsigned char m) { //SPI速度最高2MHz,用于命令发送等操作 unsigned char i,r=0; for(i=0;i<8;i++) { ADS_SCLK = 1; //clk上升沿读取dout数据 r=r<<1; if(m & 0x80) { ADS_DIN = 1; } else { ADS_DIN = 0; } m = m<<1; ADS_SCLK = 0; //clk下降沿把din上的数据传到ad if(ADS_DOUT == 1) { r++; } } return r; } */ //-----------------------------------------------------------------// // 功 能:ADS1256 写数据 // 入口参数: / // 出口参数: / // 全局变量: / // 备 注: 向ADS1256中地址为regaddr的寄存器写入一个字节databyte //-----------------------------------------------------------------// void ADS1256WREG(unsigned char regaddr,unsigned char databyte) { ADS_CS = 0; while(ADS_DRDY);//当ADS1256_DRDY为低时才能写寄存器 //向寄存器写入数据地址 SPI_SendByte(ADS1256_CMD_WREG | (regaddr & 0xF)); //写入数据的个数n-1 SPI_SendByte(0); //向regaddr地址指向的寄存器写入数据databyte SPI_SendByte(databyte); ADS_CS = 1; } //-----------------------------------------------------------------// // 功 能: // 入口参数: / // 出口参数: / // 全局变量: / // 备 注: //-----------------------------------------------------------------// unsigned long ADS1256ReadData(void) { unsigned char i=0; unsigned long sum=0; unsigned long r=0; ADS_CS = 0; while(ADS_DRDY); //当ADS1256_DRDY为低时才能写寄存器 SPI_SendByte(ADS1256_CMD_SYNC); SPI_SendByte(ADS1256_CMD_WAKEUP); SPI_SendByte(ADS1256_CMD_RDATA); ADS_SCLK = 0; for(i=0;i<3;i++) { sum = sum << 8; r = SPI_SendByte(0); sum |= r; } ADS_CS = 1; return sum; } //-----------------------------------------------------------------// // 功 能:ADS1256 读寄存器数据 // 入口参数: / // 出口参数: / // 全局变量: / // 备 注: 从ADS1256中地址为regaddr的寄存器读出一个字节databyte //-----------------------------------------------------------------// //unsigned char ADS1256RREG(unsigned char regaddr) //{ // //从ADS1256中地址为regaddr的寄存器读出一个字节 // unsigned char r=0; // //写入地址 // ADS1256SPI(ADS1256_CMD_RREG+(regaddr & 0xF)); // //写入读取数据的个数n-1 // ADS1256SPI(0); // //读出regaddr地址指向的寄存器的数据 // r=ADS1256SPI(0); // // return r;//返回数据 //} //-----------------------------------------------------------------// // 功 能:ADS1256初始化子程序 // 入口参数: / // 出口参数: / // 全局变量: / // 备 注: / //-----------------------------------------------------------------// void ADS1256_Init(void) { ADS_CS = 0; // 发送复位命令 // ADS_RESET = 0; // Delay(DELAY_10ms); ADS_REST = 1; ADS1256WREG(ADS1256_STATUS,0x06); // 高位在前、校准、使用缓冲 ADS1256WREG(ADS1256_MUX,0x08); // 初始化端口A0为‘+’,AINCOM位‘-’ ADS1256WREG(ADS1256_ADCON,0x00); // 放大倍数1 ADS1256WREG(ADS1256_DRATE,ADS1256_DRATE_5SPS); // 数据5sps ADS1256WREG(ADS1256_IO,0x00); // IO状态输入 ADS_CS = 1; } //-----------------------------------------------------------------// // 功 能:读取ADS1256单路数据 // 入口参数: / // 出口参数: / // 全局变量: / // 备 注: / //-----------------------------------------------------------------// void ADS_sum(unsigned char road) { unsigned long results=0; unsigned long Result_sum=0; unsigned long fVoltage; unsigned char buf[12],i,rod; ADS1256WREG(ADS1256_MUX,road); //设置通道 // SPI_SendByte(ADS1256_CMD_SELFCAL); //偏移和增益自动校准 // SPI_SendByte(ADS1256_CMD_SYSOCAL); //系统失调校准 // SPI_SendByte(ADS1256_CMD_SYSGCAL); //系统增益校准 if(road/16 == 0) //根据手册P21 本次读取的数据是上一次转换的值 rod = (7 + 0x30); //进行通道-1计算 else rod = ((road/16 + 0x30) -1); sendStr("第"); sendChar(rod); sendStr("路:"); results = ADS1256ReadData();//读取AD值,返回24位数据。 /*********发送AD转换后的十六进制码到串口,使用时打开*************/ /* sendChar((unsigned long)(results >> 16) & 0x0000ff); //发送最高位 sendChar((unsigned long)(results >> 8) & 0x0000ff); //发送中间位 sendChar((unsigned long)results & 0x0000ff); //发送低位 */ /*********发送AD转换后实际电压值到串口,因为计算精度问题,电压值有小的偏差*************/ Result_sum = results; if(Result_sum<0x800000) //测得电压值为正的情况 { fVoltage=Result_sum*596; //596=2*2.5/2^23*1000000000 2.5为基准电压 1000000000为为了计算的准确性转换为整形计算 buf[0]=(unsigned char)(fVoltage/1000000000); buf[0]=buf[0]+0x30; buf[1]='.'; buf[2]=(unsigned char)((fVoltage%1000000000)/100000000); buf[2]=buf[2]+0x30; buf[3]=(unsigned char)((fVoltage%100000000)/10000000); buf[3]=buf[3]+0x30; buf[4]=(unsigned char)(fVoltage%10000000/1000000); buf[4]=buf[4]+0x30; buf[5]=(unsigned char)(fVoltage%1000000/100000); buf[5]=buf[5]+0x30; buf[6]=(unsigned char)(fVoltage%100000/10000); buf[6]=buf[6]+0x30; buf[7]=(unsigned char)(fVoltage%10000/1000); buf[7]=buf[7]+0x30; buf[8]=(unsigned char)(fVoltage%1000/100); buf[8]=buf[8]+0x30; buf[9]=(unsigned char)(fVoltage%100/10); buf[9]=buf[9]+0x30; buf[10]='V'; //V buf[11]=0x20; } else //测得电压值为负的情况 { //buf[0]='-'; //取‘-’号 Result_sum=0xfffff-Result_sum; //取反运算 fVoltage=Result_sum*596; //596=2*2.5/2^23*1000000000 2.5为基准电压 1000000000为为了计算的准确性转换为整形计算 buf[0]=(unsigned char)(fVoltage/1000000000); buf[0]=buf[0]+0x30; buf[1]='.'; buf[2]=(unsigned char)((fVoltage%1000000000)/100000000); buf[2]=buf[2]+0x30; buf[3]=(unsigned char)((fVoltage%100000000)/10000000); buf[3]=buf[3]+0x30; buf[4]=(unsigned char)(fVoltage%10000000/1000000); buf[4]=buf[4]+0x30; buf[5]=(unsigned char)(fVoltage%1000000/100000); buf[5]=buf[5]+0x30; buf[6]=(unsigned char)(fVoltage%100000/10000); buf[6]=buf[6]+0x30; buf[7]=(unsigned char)(fVoltage%10000/1000); buf[7]=buf[7]+0x30; buf[8]=(unsigned char)(fVoltage%1000/100); buf[8]=buf[8]+0x30; buf[9]=(unsigned char)(fVoltage%100/10); buf[9]=buf[9]+0x30; buf[10]='V'; //V buf[11]='-'; } i=0; while(i<12) { sendChar(buf[i]); i++; } }
评论
    相关推荐
    • ADS1256相关资料.zip
      基于MSP430单片机的ADS1256测试程序
    • ADS1256.zip
      ads1256采样程序,基于spi协议配置寄存器,实现ads的正常采样功能。
    • ADS1256模块资料-V0.3.zip
      ADS1256 模块资料 软件 硬件 原理图
    • stm32f103 ADS1256.zip
      ads256驱动,实现ad采样及转换功能
    • ADS1256.zip
      基于STM32F103系列CUBEMX生成HAL库驱动ADS1255_ads1256的驱动程序。 很规范,附带CUBEMX配置文件+55/56中英文数据手册。
    • ADS1256.rar
      基STM32F1系列的ADS1256高精度ADC采集。程序写好的,不需要修改参数。
    • ADS1256.zip
      此模块已经亲自测量过,代码可行,本人基于stm32f429IGT6采用ads1256作为模拟量采集,精度达到24位,属于高精度范围,希望此次上传代码为了让对ads1256有疑惑的同仁们能够豁然开朗,营造美好学习氛围,同时希望大家...
    • ADS1256.rar
      ADS1256 24位,30KSPS速率,用于工业控制十分得力。分享与大家ok。未经本人与许,不能用于商业谋利
    • ads1256.rar
      此为ADS1256的全部代码,包括一个主函数,一个ADS1256的函数和头文件,一个12864的函数,以及编程序之前一定一定一定一定一定要看的datasheet
    • ADS1256.zip
      本源码 是使用VHDL语言编写的ADS1256驱动程序,ADS1256是24位AD芯片,精度很高,采用SPI通信方式。经过测试,完全可用。 测试时,需要 ADS1256 芯片 FPGA开发板,主频40MHz。