CS1237芯片是一枚国产24位A/D转换芯片,输出速率可选:10Hz、40Hz、640Hz、1.28kHz。内置时钟电路,不需外部晶振。带可编程PGA,PGA放大倍数可选:1、2、64、128。2 线 SPI通信接口,最快速率为 1.1MHz。供电电压:5V/3.3V。芯片应用场合:工业过程控制、电子秤、血压计、智能变换器、便携式设备等。

CS1237采用SOP8封装,Pin脚定义如下:

CS1237 SPI  串口通信

其基本时序如图所示:

CS1237读取数据时序图1:

CS1237读取数据时序图 2:

读取数据时序表:

功能配置:

SPI命令字:

CS1237有 2 个命令字,命令字的长度为 7bits,命令字描述如下:

CS1237命令字说明表:

CS1237 Config寄存器:

有了这些,就可以写CS1237的驱动库函数了。新建两个文件分别以cs1237.h,cs1237.c存入C51 Template文件夹下Library文件夹中。完成后的头文件如下:

/*cs1237.hDesigned by Bill LiuVersion 0.0 Modified last by Bill Liu on 12/10/2021
*/
#ifndef __CS1237_H__
#define __CS1237_H__#include "mtype.h"
#include "delay.h"
#include "myport.h"    //CS1237_SCLK and CS1237_DOUT were definedextern FSYSCLOCK FSCLK;
//************************************************************************************************************
typedef enum
{C1237_10HZ = 0,C1237_40HZ = 1,C1237_640HZ = 2,C1237_1280HZ = 3
}C1237_SPEED;//************************************************************************************************************
typedef enum
{C1237_PGA_1 = 0,C1237_PGA_2 = 1,C1237_PGA_64 = 2,C1237_PGA_128 = 3
}C1237_PGA;//************************************************************************************************************
typedef enum
{C1237_CHA = 0, //adc channelC1237_RST = 1, //cheap reservedC1237_TEM = 2, //temperature testC1237_INS = 3 //internal short
}C1237_CHN;/************************************************************************************************************
Function: C1237_InClk();
Return value: void
Discription: C1237 input a clk pusle for to read or write
Example:C1237_InClk();
*************************************************************************************************************/
void C1237_InClk();/************************************************************************************************************
Function: CS1237_ReadReg();
Return value: ui8
Discription: read CS1237 register
Example:CS1237_ReadReg();
*************************************************************************************************************/
ui8 CS1237_ReadReg();/************************************************************************************************************
Function: C1237_WriteReg(ui8 mData);
Return value: void
Discription: wreite data to C1237 register
Example:C1237_WriteReg(mData);
*************************************************************************************************************/
void C1237_WriteReg(ui8 mData);/************************************************************************************************************
Function: C1237_Init(BOOL refOutable,C1237_SPEED msel,C1237_PGA mselPga,C1237_CHN mselChn);
Return value: void
Discription: CS1237 init
Example:C1237_Init(0,C1237_10HZ,C1237_PGA_1,C1237_CHA);//ref voltage out disable,speed 10Hz,Pga 1, work at Adc mode
*************************************************************************************************************/
void C1237_Init(BOOL refOutable,C1237_SPEED msel,C1237_PGA mselPga,C1237_CHN mselChn);/************************************************************************************************************
Function: C1237_ReadResult();
Return value: ui32
Discription: read C1237 A/D result
Example:C1237_ReadResult();
*************************************************************************************************************/
ui32 C1237_ReadResult();#endif

完成后的源代码如下:

/*cs1237.cDesigned by Bill LiuVersion 0.1 Modified last by Bill Liu on 2/18/2022
*/#include "cs1237.h"//*************************************************************************************************************
void C1237_InClk()
{CS1237_SCLK= 1;Delayxus(2,FSCLK); CS1237_SCLK = 0;Delayxus(2,FSCLK);
}
//End of C1237_InClk()//*************************************************************************************************************
ui8 CS1237_ReadReg()
{ui8 i = 0;ui8 tem = 0;CS1237_SCLK = 0;CS1237_DOUT = 1;while( CS1237_DOUT);for(i = 0; i < 27; i++) //1-26th CLKC1237_InClk();;CS1237_DOUT = 1; //cs1237 direction input//C1237_InClk();   //27th CLKC1237_InClk();    //28th CLKC1237_InClk();   //29th CLKtem = 0x56;for(i = 0; i < 7; i++) //30~36th CLK{if(tem &0x40)CS1237_DOUT = 1;elseCS1237_DOUT = 0;C1237_InClk();;tem <<= 1;}CS1237_DOUT = 1; //cs1237 change to output directionC1237_InClk();; //37th CLKfor(i = 0; i < 8; i++) //37~45th CLK{tem <<= 1;C1237_InClk();if(CS1237_DOUT)tem++;}C1237_InClk();; //46th CLKreturn tem;
}
//End of CS1237_ReadReg()//*************************************************************************************************************
void C1237_WriteReg(ui8 mData)
{ui8 i = 0;ui8 tem = 0;CS1237_SCLK = 0;CS1237_DOUT = 1;while(CS1237_DOUT);for(i = 0; i < 27; i++) //1~26th CLKC1237_InClk();CS1237_DOUT = 1; //force high//C1237_InClk();//27th CLKC1237_InClk();//28th CLKC1237_InClk();//29th CLKtem = 0x65;for(i = 0; i < 7; i++)//30~36th CLK{if(tem & 0x40)CS1237_DOUT = 1;elseCS1237_DOUT = 0;C1237_InClk();tem <<= 1;}CS1237_DOUT = 0; //direction chage to intput directionC1237_InClk(); //37th CLKfor(i = 0; i < 8; i++) //38~45th CLK{if(mData&0x80)CS1237_DOUT = 1;elseCS1237_DOUT = 0;mData <<= 1;C1237_InClk(); }C1237_InClk();//46th CLK}
//End of C1237_WriteReg(ui8 mData)//*************************************************************************************************************
void C1237_Init(BOOL refOutable,C1237_SPEED msel,C1237_PGA mselPga,C1237_CHN mselChn)
{ui8 tem = 0;if(refOutable)ResetBit(&tem, 6);elseSetBit(&tem, 6);SetBits(&tem,5,4,msel);SetBits(&tem,3,2,mselPga);SetBits(&tem,1,0,mselChn);C1237_WriteReg(tem);
}
//End of C1237_Init(BOOL refOutable,C1237_SPEED msel,C1237_PGA mselPga,C1237_CHN mselChn) //*************************************************************************************************************
ui32 C1237_ReadResult()
{ui8 i;ui32 rdata = 0;CS1237_SCLK= 0;CS1237_DOUT = 1;while(CS1237_DOUT);          //waite ADC finishfor(i = 0; i < 24; i++){rdata <<= 1;C1237_InClk();if(CS1237_DOUT) //read datardata++;}C1237_InClk();C1237_InClk();C1237_InClk();return rdata;
}
//End of C1237_ReadResult()

受一些因素影响,可能个别ADC数据不是很准确,需要消除或减小其影响,我们可以采用多值平均法,阀值剔除法等数字滤波手法,有了以上库函数就可以轻松实现。读写验证如下:

上面串口接收区的值为寄存器读出值。

下面是AD转换结果。

51 单片机实战教程(13 外围芯片驱动程序之CS1237芯片驱动)相关推荐

  1. 51 单片机实战教程(14 外围芯片驱动程序之LTC1658芯片驱动)

    LTC1658是一款14bit轨到轨DAC芯片.可选用3V或5V供电,采用3线串口通信(兼容SPI与MICROWIRE),其应用场景为数字校准.工业控制.自动测试设备等.它采用SOP8封装,Pin脚定 ...

  2. 51单片机实战教程(一 数据类型别名定义)

    前面已经讲了C语言基础,从此以后将进行编程实战.C数据类型名较长,编程输入不太方便. 下面编写一个定义数据类型别名的程序,并定义实现后面例程常用到的位操作及字符串操作函数. 1. 打开前面教程中创建的 ...

  3. 51单片机实战教程(32 人机界面编程9)

    人机界面(Usart HMI)屏可以轻松设计漂亮友好的人机界面,也可以通过Usart串口与机器CPU通信.但仅有这些是不够的.还需要自定义 通信协议.通信协议包含波特率设置,数据格式,编码解码,数据打 ...

  4. 51单片机实战教程(34 线缆摇摆测试机设计)

    本文将讲解51单片机在线缆摇摆测试机中的应用,包含单片机程序及人机界面程序设计,将以本人以前做过的一个案子为例来做讲解. 公司外购一款线缆,进料检验时,需要做摇摆测试,以判定品质是否合格.公司当时没有 ...

  5. 51单片机实战教程(33 步进电机的驱动与控制)

    步进电机虽然同为电机的一种,但不能像直流电机或者交流电机那样按额定电压与电流给线圈通上直流或交流电机就可正常运转.它需要专用的驱动器或驱动电路供电,才可正常工作.每给驱动器一个脉冲信号,电机就转动一定 ...

  6. 51单片机实战教程(21 同步串行外围通信接口SPI)

    SPI是Sysnchronous Serial Peripheral Interface 的缩写.SPI是一种全双工.高速.同步的通信总线,有两种操作模式:主模式和从模式.所谓全双工是指SPI主器件在 ...

  7. 51单片机实战教程(28 人机界面编程五)

    2本文将介绍Usart HMI常用指令 1 page指令 用于页面切换,使用格式 : page obj obj指页面名称或id, 示例: 有下面两个页面, 要从page0 切换到main 代码如下: ...

  8. 51单片机实战教程(22 看门狗)

    在要求高可靠性的系统中,为防止系统在异常情况下或者受到异常干扰导致MCU/CPU程序跑飞,系统长时间异常工作, 通常的做法就是引入看门狗.如果MCU/CPU不在规定时间内按要求访问看门狗,看门狗就强迫 ...

  9. 51单片机实战教程(六 网线测试治具设计)

    我们日常接触的线材如USB.HDMI.VGA及网线等在生产过程中一般都需要做导通.线序测试.其中有Overmolding制程的产品还需做短路测试.其对应的连接器也需要做同样的测试.厂商的通常做法是购买 ...

最新文章

  1. java排序——桶排序
  2. linux两种方式改变文件权限,Linux更改文件权限的两种方式
  3. ASIO协程彻底转变你的思维
  4. java 判断数字变化增减_java String 强化操作 判断数字 字符串转阿拉伯数字,相似度等等...
  5. 如何在 Linux 中快速地通过 HTTP 提供文件访问服务
  6. bootstrap 输入错误提示_win7系统提示explorer.exe应用程序错误怎么办
  7. 【OpenCV 例程200篇】13. 图像的加法运算(cv2.add)
  8. qrc文件编译到可执行文件exe
  9. 双向循环链表的C++实现
  10. 帆软报表填报之内置数据自定义表、数据连接、服务器数据集配置
  11. [ERROR NumCPU]: the number of available CPUs 1 is less than the required 2
  12. excel表格打印每页都有表头_如何在Excel打印时每页都有表头?你知道么
  13. 分享一些小技巧吧,MATLAB中常见问题及解决方案
  14. 三种数据交换技术的比较
  15. c语言常用函数库 c++常用函数库
  16. L1-6 吉老师的回归 (15 分)
  17. 原生m1/m2 Sketch v90 for Mac最新中文版Sketch已更新,已解决闪退打不开问题
  18. 论文阅读中经常出现的“消融研究/实验”
  19. 【一天一门编程语言】怎样设计一门编程语言?
  20. 机器学习-支持向量机(python3代码实现)

热门文章

  1. 基于多源大数据的武汉市区域空间格局研究
  2. <script>标签通过src属性调用js文件
  3. java阶段七容器集合之Map------练习2
  4. Java类包的定义(package)
  5. 同一网段的概念以及计算
  6. 高等代数:4 矩阵的运算
  7. Go语言xorm框架
  8. Java技能树-RE-正则应用-目录
  9. 图灵教育4月重磅新书
  10. MYSQL补充SQL语句