欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 26770|回復: 39
收起左側

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, 下載次數: 744)


評分

參與人數 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 來自觸屏版 | 顯示全部樓層
牛逼學習了
回復

使用道具 舉報

15#
無效樓層,該帖已經被刪除
ID:640046 發表于 2019-11-11 21:44 | 顯示全部樓層
十分感謝!!!!
回復

使用道具 舉報

17#
無效樓層,該帖已經被刪除
ID:79874 發表于 2019-11-17 18:28 來自觸屏版 | 顯示全部樓層
大哥不行我的stc89c52r
回復

使用道具 舉報

ID:432101 發表于 2019-12-10 22:03 | 顯示全部樓層
謝謝分享,正找著
回復

使用道具 舉報

20#
無效樓層,該帖已經被刪除
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 | 顯示全部樓層
有測試過的朋友嗎?可以用不?
回復

使用道具 舉報

28#
無效樓層,該帖已經被刪除
29#
無效樓層,該帖已經被刪除
30#
無效樓層,該帖已經被刪除
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個指令周期嗎?
回復

使用道具 舉報

34#
無效樓層,該帖已經被刪除
35#
無效樓層,該帖已經被刪除
ID:359215 發表于 2021-7-16 11:21 | 顯示全部樓層
SetPinMux, SetPinDir 這2個函數,誰能看懂?
回復

使用道具 舉報

ID:632424 發表于 2021-7-18 12:03 | 顯示全部樓層
感謝樓主分享,很強大,收藏起來
回復

使用道具 舉報

38#
無效樓層,該帖已經被刪除
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函數,不用管它,我把它注銷了,在初始化時,設置好輸入,輸出口子
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表