找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 21789|回复: 38
收起左侧

24bit ADC CS1237完整驱动源码,实测可用无bug,只需修改IO口定义

  [复制链接]
ID:118552 发表于 2018-8-24 11:34 | 显示全部楼层 |阅读模式
24bit ADC芯片 CS1237完整驱动,实测可用无bug,只需修改IO口定义、移植IO口拉高拉低函数、定时器函数即可使用,简单方便快捷。
0.png

单片机源程序如下:
  1. /*****************************************
  2. *        CS1237 designed by Robert Lee           *
  3. *                                        *
  4. *****************************************/
  5. #include "bsp.h"
  6. #include "common.h"

  7. //#ifdef USER_CS1237  
  8. #define ADC_Bit  24 //ADC有效位数,带符号位 最高24位
  9. #define SCK_1  SetGpio(10, 0)
  10. #define SCK_0  ClearGpio(10, 0)
  11. #define DAT_1  SetGpio(10, 1)
  12. #define DAT_0  ClearGpio(10, 1)
  13. #define        NOP_5()                __asm {nop};__asm {nop};__asm {nop}
  14. #define        NOP30()                NOP_5();NOP_5();NOP_5();NOP_5();NOP_5();NOP_5();
  15. #define        NOP40()                NOP_5();NOP_5();NOP_5();NOP_5();NOP_5();NOP_5();NOP_5();NOP_5();
  16. #define One_CLK  SCK_1;NOP40();SCK_0;NOP40();
  17. #define CS_CON  0X00   //芯片地配置 内部REF 输出10HZ PGA=1 通道A 0X00  
  18. #define Lv_Bo 0.01  //滤波系数 小于1

  19. //sbit DOUT = P3^7;//数据对应IO口
  20. //sbit SCLK = P3^5;//时钟对应IO口
  21. static long AD_Res_Last=0;//上一轮的ADC数值保存

  22. //延时500US 5.5296MHZ
  23. void delay_500us(volatile unsigned char a)
  24. {        
  25.         volatile unsigned char i,j,b;
  26.         for(b=0;b<a;b++)
  27.         {
  28.                 i = 3;
  29.                 j = 137;
  30.                 do
  31.                 {
  32.                         while (--j);
  33.                 } while (--i);
  34.         }
  35. }
  36. //CS1237进入低功耗模式
  37. void CS1237_Power_Down(void)
  38. {
  39.         //SCLK = 1;
  40.         SCK_1;
  41.         delay_500us(100);
  42.         //SCLK = 1;
  43.         SCK_1;
  44.         //SCLK = 1;
  45.         SCK_1;
  46.         delay_500us(100);
  47. }
  48. //配置CS1237芯片
  49. void Con_CS1237(void)
  50. {
  51.         unsigned char i;
  52.         unsigned char dat;
  53.         unsigned short count_i=0;//溢出计时器

  54.         SetPinMux(10, 0, 0);//SCK
  55.         SetPinMux(10, 1, 0);//SDA

  56.         SetPinDir(10,0,1);
  57.         SetPinDir(10,1,0);
  58.         
  59.         dat = CS_CON;// 0100 1000
  60.         SCK_0;//时钟拉低
  61.         while(ReadGpio(10,1) ==1)//芯片准备好数据输出  时钟已经为0,数据也需要等CS1237全部拉低为0才算都准备好
  62.         {
  63.                 delay_500us(10);
  64.                 count_i++;
  65.                 if(count_i > 15000)
  66.                 {
  67.                         SCK_1;
  68.                         DAT_1;
  69.                         printf("here error\r\n");
  70.                         return;//超时,则直接退出程序
  71.                 }
  72.         }
  73.         for(i=0;i<29;i++)// 1 - 29
  74.         {
  75.                 One_CLK;
  76.         }
  77.         SCK_1;NOP30();DAT_1;SCK_0;NOP30();//30
  78.         SCK_1;NOP30();DAT_1;SCK_0;NOP30();//31
  79.         SCK_1;NOP30();DAT_0;SCK_0;NOP30();//32
  80.         SCK_1;NOP30();DAT_0;SCK_0;NOP30();//33
  81.         SCK_1;NOP30();DAT_1;SCK_0;NOP30();//34
  82.         SCK_1;NOP30();DAT_0;SCK_0;NOP30();//35
  83.         SCK_1;NOP30();DAT_1;SCK_0;NOP30();//36
  84.         One_CLK;//37     写入了0x65
  85.         for(i=0;i<8;i++)// 38 - 45个脉冲了,写8位数据
  86.         {
  87.                 SCK_1;NOP40();
  88.                 if(dat&0x80)
  89.                         DAT_1;
  90.                 else
  91.                         DAT_0;
  92.                 dat <<= 1;
  93.                 SCK_0;NOP40();
  94.         }
  95.         One_CLK;//46个脉冲拉高数据引脚
  96. }
  97. //读取芯片的配置数据
  98. unsigned char Read_CON(void)
  99. {
  100.         unsigned char i;
  101.         unsigned char dat=0;//读取到的数据
  102.         unsigned short count_i=0;//溢出计时器
  103.         unsigned char k=0,j=0;//中间变量
  104.         SCK_0;//时钟拉低
  105.         while(ReadGpio(10,1) ==1)//芯片准备好数据输出  时钟已经为0,数据也需要等CS1237全部拉低为0才算都准备好
  106.         {
  107.                 delay_500us(10);
  108.                 count_i++;
  109.                 if(count_i > 15000)
  110.                 {
  111.                         SCK_1;
  112.                         DAT_1;
  113.                         printf("here outtime error\r\n");
  114.                         return 1;//超时,则直接退出程序
  115.                 }
  116.         }
  117.         for(i=0;i<29;i++)// 1 - 29
  118.         {
  119.                 One_CLK;
  120.         }
  121.         SCK_1;NOP30();DAT_1;SCK_0;NOP30();//30
  122.         SCK_1;NOP30();DAT_0;SCK_0;NOP30();//31
  123.         SCK_1;NOP30();DAT_1;SCK_0;NOP30();//32
  124.         SCK_1;NOP30();DAT_0;SCK_0;NOP30();//33
  125.         SCK_1;NOP30();DAT_1;SCK_0;NOP30();//34
  126.         SCK_1;NOP30();DAT_1;SCK_0;NOP30();//35
  127.         SCK_1;NOP30();DAT_0;SCK_0;NOP30();//36
  128.         DAT_1;
  129.         One_CLK;//37     写入了0x56
  130.         dat=0;
  131.         for(i=0;i<8;i++)// 38 - 45个脉冲了,读取数据
  132.         {
  133.                 One_CLK;
  134.                 dat <<= 1;
  135.                 if(ReadGpio(10,1) ==1)
  136.                         dat++;
  137.         }
  138.         One_CLK;//46个脉冲拉高数据引脚
  139.         return dat;
  140. }
  141. //读取ADC数据,返回的是一个有符号数据
  142. long Read_CS1237(void)
  143. {
  144.         unsigned char i;
  145.         long dat=0;//读取到的数据
  146.         unsigned char count_i=0;//溢出计时器
  147. //        DOUT = 1;//端口锁存1,51必备
  148.         SCK_0;//时钟拉低
  149.         while(ReadGpio(10,1) ==1)//芯片准备好数据输出  时钟已经为0,数据也需要等CS1237拉低为0才算都准备好
  150.         {
  151.                 delay_500us(10);
  152.                 count_i++;
  153.                 if(count_i > 300)
  154.                 {
  155.                         SCK_1;
  156.                         DAT_1;
  157.                         printf("Read_CS1237 outtime error\r\n");
  158.                         return 0;//超时,则直接退出程序
  159.                 }
  160.         }
  161. //        DOUT = 1;//端口锁存1,51必备
  162.         dat=0;
  163.         for(i=0;i<24;i++)//获取24位有效转换
  164.         {
  165.                 SCK_1;
  166.                 NOP40();
  167.                 dat <<= 1;
  168.                 if(ReadGpio(10,1) ==1)
  169.                         dat ++;
  170.                 SCK_0;
  171.                 NOP40();        
  172.         }
  173.         for(i=0;i<3;i++)//一共输入27个脉冲
  174.         {
  175.                 One_CLK;
  176.         }
  177.         //DAT_1;
  178.         //先根据宏定义里面的有效位,丢弃一些数据
  179.         i = 24 - ADC_Bit;//i表示将要丢弃的位数
  180.         dat >>= i;//丢弃多余的位数
  181.         return dat;
  182. }
  183. //初始化ADC相关参数
  184. void Init_CS1237(void)
  185. {
  186.         Con_CS1237();//配置CS1237
  187.         if(Read_CON() != CS_CON)//如果读取的ADC配置出错,则重启
  188.         {
  189.                 printf("Init_CS1237 error\r\n");
  190.         }
  191.                 //IAP_CONTR = 0x20;
  192.         //AD_Res_Last = Read_CS1237();
  193.         //AD_Res_Last = Read_CS1237();
  194.         //AD_Res_Last = Read_CS1237();
  195.         //printf("AD_Res_Last 0x%x\r\n",AD_Res_Last);
  196. }
  197. //数字一阶滤波器 滤波系数A,小于1。上一次数值B,本次数值C out = b*A + C*(1-A)
  198. //下面这个程序负责读取出最终ADC数据
  199. long Read_12Bit_AD(void)
  200. {
  201.         float out,c;
  202.         
  203.         out = AD_Res_Last;
  204.         c = Read_CS1237();
  205.         if(out !=0 && (out<c*0.8 || out>c*1.2))
  206.           c = out;
  207.         if(c!=0) // 读到正确数据
  208.         {
  209.                 out = out*Lv_Bo + c*(1-Lv_Bo);
  210.                 AD_Res_Last = out;//把这次的计算结果放到全局变量里面保护
  211.         }
  212.         //printf("AD_Res_Last 0x%x\r\n",AD_Res_Last);
  213.         return AD_Res_Last;
  214. }
  215. //#endif
复制代码

所有资料51hei提供下载:
cs1237驱动.rar (2.25 KB, 下载次数: 717)

评分

参与人数 2黑币 +55 收起 理由
yylandmoon + 5 很给力!
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:221051 发表于 2019-2-22 15:53 | 显示全部楼层
谢谢楼主的分享!
回复

使用道具 举报

ID:128880 发表于 2019-4-10 10:38 | 显示全部楼层
谢谢楼主分享资料
回复

使用道具 举报

ID:489703 发表于 2019-5-6 10:32 | 显示全部楼层
参考一下
回复

使用道具 举报

ID:346927 发表于 2019-5-17 21:04 | 显示全部楼层
谢谢分享资料
回复

使用道具 举报

ID:280497 发表于 2019-6-11 23:07 | 显示全部楼层

谢谢楼主分享资料
回复

使用道具 举报

ID:396444 发表于 2019-6-13 00:28 来自手机 | 显示全部楼层
谢谢楼主分享资料!
回复

使用道具 举报

ID:604621 发表于 2019-8-28 10:27 | 显示全部楼层
太好了 就是不知道怎么样
回复

使用道具 举报

ID:218346 发表于 2019-9-25 10:07 | 显示全部楼层
bsp.h是什么文件?可以提供一下吗?
回复

使用道具 举报

ID:218346 发表于 2019-9-25 10:15 | 显示全部楼层
SetPinMux  SetPinDir  都是什么操作?
回复

使用道具 举报

ID:46475 发表于 2019-9-28 13:53 | 显示全部楼层
感谢分享。。。。
回复

使用道具 举报

ID:46475 发表于 2019-9-28 14:02 | 显示全部楼层
bsp.h 什么函数???
回复

使用道具 举报

ID:218346 发表于 2019-9-30 09:10 | 显示全部楼层
这个还是没用
回复

使用道具 举报

ID:345352 发表于 2019-10-15 17:01 来自手机 | 显示全部楼层
牛逼学习了
回复

使用道具 举报

ID:640046 发表于 2019-11-11 21:44 | 显示全部楼层
十分感谢!!!!
回复

使用道具 举报

ID:79874 发表于 2019-11-17 18:28 来自手机 | 显示全部楼层
大哥不行我的stc89c52r
回复

使用道具 举报

ID:432101 发表于 2019-12-10 22:03 | 显示全部楼层
谢谢分享,正找着
回复

使用道具 举报

ID:342140 发表于 2020-2-28 20:45 | 显示全部楼层
正需要,谢谢
回复

使用道具 举报

ID:64867 发表于 2020-3-10 14:03 | 显示全部楼层
正好需要,谢谢分享,祝好运。
回复

使用道具 举报

ID:243644 发表于 2020-4-13 14:13 | 显示全部楼层
谢谢楼主分享
回复

使用道具 举报

ID:284462 发表于 2020-4-13 17:43 | 显示全部楼层
mark一下
回复

使用道具 举报

ID:744662 发表于 2020-5-5 17:18 | 显示全部楼层
有测试过的朋友吗?能用不?
回复

使用道具 举报

ID:744662 发表于 2020-5-5 17:18 | 显示全部楼层
有测试过的朋友吗?能用不?
回复

使用道具 举报

ID:744662 发表于 2020-5-5 17:41 | 显示全部楼层
有测试过的朋友吗?可以用不?
回复

使用道具 举报

ID:57925 发表于 2020-10-26 11:29 | 显示全部楼层
谢谢分享,正需要,省很多工夫了,下载来看看。
回复

使用道具 举报

ID:670155 发表于 2020-11-26 10:44 | 显示全部楼层
有32HAI库的吗?
回复

使用道具 举报

ID:900714 发表于 2021-4-4 22:40 | 显示全部楼层
感谢分享,请问 NOP_5() 是什么意思?延时5个指令周期吗?
回复

使用道具 举报

ID:359215 发表于 2021-7-16 11:21 | 显示全部楼层
SetPinMux, SetPinDir 这2个函数,谁能看懂?
回复

使用道具 举报

ID:632424 发表于 2021-7-18 12:03 | 显示全部楼层
感谢楼主分享,很强大,收藏起来
回复

使用道具 举报

ID:853896 发表于 2021-10-10 20:53 | 显示全部楼层
一江春水一号 发表于 2020-5-5 17:18
有测试过的朋友吗?能用不?

我初步测了一下,可以的,就是程序有地方,要改一下,改成自己使用的芯片
回复

使用道具 举报

ID:853896 发表于 2021-10-10 20:56 | 显示全部楼层
luhuimin 发表于 2021-7-16 11:21
SetPinMux, SetPinDir 这2个函数,谁能看懂?

这2函数,不用管它,我把它注销了,在初始化时,设置好输入,输出口子
回复

使用道具 举报

ID:625282 发表于 2021-11-10 10:48 | 显示全部楼层
ccnnzz315 发表于 2021-10-10 20:56
这2函数,不用管它,我把它注销了,在初始化时,设置好输入,输出口子

请问一下这个程序用的是模拟SPI吧,如果想接硬件SPI要怎么接,CS1237的DI/DO引脚分开接到MOSI和MISO吗
回复

使用道具 举报

ID:582255 发表于 2021-11-11 22:02 | 显示全部楼层
有人测试过吗
回复

使用道具 举报

ID:915491 发表于 2022-8-29 22:13 | 显示全部楼层
测试没问题,谢谢
回复

使用道具 举报

ID:915491 发表于 2022-8-29 22:13 | 显示全部楼层
可以用
回复

使用道具 举报

ID:1047410 发表于 2022-10-12 13:32 | 显示全部楼层
多谢,希望有用
回复

使用道具 举报

ID:1047410 发表于 2022-10-13 08:24 | 显示全部楼层
请问SetGpio(10, 0),ClearGpio(10, 0),SetGpio(10, 0),ClearGpio(10, 1)是对应什么,10表示什么
回复

使用道具 举报

ID:1099766 发表于 2023-11-15 00:22 | 显示全部楼层

请问SetGpio(10, 0),ClearGpio(10, 0),SetGpio(10, 0),ClearGpio(10, 1)是对应什么,10表示什么
回复

使用道具 举报

ID:912589 发表于 2024-1-24 10:46 | 显示全部楼层
很好的资料参考,感谢分享
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表