久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 19541|回復: 26
打印 上一主題 下一主題
收起左側

帶詳細注釋的51單片機CS1237電子秤源程序

  [復制鏈接]
跳轉到指定樓層
樓主
工程硬件平臺:    1,51Core-V1.0(51單片機最小系統板)
                2,差分ADC模塊-CS1237
                3,稱重傳感器模塊
                4,OLED顯示器0.96寸,4PIN

工程程序版本:51單片機廚房(藥房)秤方案 V1.0.0.0
(本例程僅提供一種實現思路,學會后完全可以使用其他品牌的單片機替代)
---------------------------------------------------
------------------------------------------------------------------------------------------------------.

硬件:

1,單片機內部時鐘設置為 5.5296MHZ

2,“差分ADC模塊-CS1237”的電源正確連接到“51單片機最小系統板“的5V電源上。同時數字接口如下連接:
    OUT = P3^7;//數據對應IO口
    CLK = P3^5;//時鐘對應IO口

3,”稱重傳感器模塊“和”差分ADC模塊-CS1237“連接好。接線定義如下:
    CS1237模塊的E+ 連接 紅色
    CS1237模塊的E- 連接 黑色
    CS1237模塊的S+ 連接 綠色
    CS1237模塊的S- 連接 白色
(本例程的軟件上有處理,S+和S-不用區別正負極,因為CS1237的模擬輸入通道是差分輸入)

4,OLED顯示器0.96寸4PIN ,直接查到51最小系統板的P17排母上即可

5,鋰電池供電下的運行功耗:19mA    待機功耗:<2mA

------------------------------------------------------------------------------------------------------



---------------------------------------------------

程序功能:
1,    第一個點校準功能。需要保證系統供電是一個精確的5V,第一次燒寫完程序后會進行第一個點的自動校準。
    此功能也可以通過按 KEY1 按鍵隨時進入。
    第一個點校準后,不能直接稱重,還需要第二個點校準。
   
2,    第二個點的校準功能。需要在秤盤上放一個500克的砝碼,等待幾秒,按下 KEY2 按鍵即可。

3,    去皮功能。經過兩個點的校準后便可以正常使用。使用過程中隨時可以去皮重。按下 KEY3 按鍵即可。

4,    電池供電使用。接上一節普通鋰電池即可使用(也可以是兩節或三節普通干電池串聯),接到5V供電的位置即可。
    OLED顯示屏會顯示電池的電壓,單位是mV。
   
5,    程序正常執行顯示的是實時重量。

6,    當程序檢測到超過30S重量沒有變化,則自動進入低功耗模式,關閉OLED以達到省電的目的。若想再次使用必須按下 KEY3 按鍵。
    (此時的KEY3按鍵相當于產品上面的“開機”按鍵。當然你也可以做一個電源開關,直接關閉系統)

7,    開機去皮。由于每次開機時候,傳感器受力情況會發生微妙變化(比如移動位置,秤盤被壓過,底座沒放平等),所以程序在每次開機時
    會進行去皮,軟件上消除此誤差。

8,    按鍵KEY1和KEY2只在校準時候使用,若廠家做產品,只需要在出場時候校準使用即可。留給用戶的接口只有KEY3按鍵,兼容去皮和開機喚醒。

---------------------------------------------------
單片機源程序如下:
  1. //內部時鐘 5.5296MHZ
  2. //電池供電可用,實時顯示重量,單位g
  3. //KEY1 校準時第一步空稱 ;  KEY2 砝碼校準500G砝碼 ;KEY3 常規去皮功能
  4. #include "STC15W.h"
  5. #include "intrins.h"
  6. #include "Uart_1.h"
  7. #include "OLED_IIC.h"
  8. #include "CS1237.h"
  9. #include "T4_Key.h"
  10. #include "ADC.h"
  11. #include "IAP_EEPROM.h"


  12. #define  Tare         EEROM_20Long[0]  //校準用,皮重
  13. #define  BGA_EEPROM   EEROM_20Long[1]  //在5V供電下,校準的內部BGA參數
  14. #define  First_ON     EEROM_20Long[2]  //第一次開機標志位 如果不是88則表示第一次開機,用于批量生產
  15. #define  Weight_500g  EEROM_20Long[3]  //500G標定時候的ADC數值


  16. extern bit Key_1,Key_2,Key_3;//三個按鍵的狀態,全局變量 1表示按下 ,每次用過之后需要手動置零
  17. extern unsigned int Battery_Now;//計算出來的當前電池電壓
  18. long EEROM_20Long[20];//用于掉電保存的數值,每次燒寫過后可能會歸零
  19. unsigned char Work_Count=0;//放在定時器里面,每50ms進行一次顯示,稱重。
  20. unsigned int Low_Power = 0;//放到定時器里面,進行關機檢測,30S重量沒有變化后進入低功耗模式
  21. static float Weight_Coe=0.00000;//全局變量,稱重時參考的重量系數
  22. static float Tare_Coe=0.00000;//全局變量,皮重的重量,放大1000倍之后的數值
  23. static unsigned int Weight_30S_1,Weight_30S_2;//30S讀取一次重量,然后比較,如果兩次相同則進入低功耗
  24. static unsigned char Power_Down_F=0;//單片機掉電標志位,用于掉電重啟后初始化所有設備

  25. //獲取電池電壓,50次平均值
  26. unsigned int Get_Bat(void);
  27. //讀取CS1237,去皮后的重量,精確到g
  28. unsigned int  Get_Weight(void);
  29. //根據校準的數值,計算出稱重系數
  30. void Get_Weight_Coe(void);

  31. void main(void)
  32. {
  33.         unsigned int Main_Loop=0;//在主函數里面用的,循環時候控制循環次數的變量
  34.         
  35.         P0M1=0;P0M0=0;P1M1=0;P1M0=0;
  36.         P2M1=0;P2M0=0;P3M1=0;P3M0=0;
  37.         P4M1=0;P4M0=0;P5M1=0;P5M0=0;//上電初始化所有IO口為普通IO
  38.         Init_Uart1();//初始化串口1,9600bps
  39.         OLED_Init();  //OLED初始化
  40.         Init_T4();//初始化T4,用于按鍵檢測
  41.         Init_CS1237();//初始化CS1237
  42.         Init_ADC();//初始化ADC
  43.         EA = 1;//打開單片機全局中斷
  44.         Re_20_Long(0XD3B8,EEROM_20Long);//讀取所有的掉電保存數據到內存里
  45.         Delay1ms(10);
  46.         if(First_ON != 88)//如果檢測到第一次開機情況,表示需要校準,用于批量生產時候
  47.         {
  48.                 LED2 = 0;//燈亮
  49.                 First_ON = 88;
  50.                 Main_Loop = 10;
  51.                 while(Main_Loop--)
  52.                         Tare = Read_18Bit_AD();//讀取出CS1237的數據,5V情況下
  53.                 Main_Loop = 10;
  54.                 while(Main_Loop--)
  55.                         BGA_EEPROM = Get_BGA();//在5V供電情況下,保存BGA參數
  56.                 Wr_20_Long(0XD3B8,EEROM_20Long);//保存數據到EEPROM
  57.                 LED2 = 1;//燈滅
  58.         }
  59.         else
  60.                 Get_Weight_Coe();//依據EEPROM內容,計算稱重系數
  61.         Send_Data1(Read_CON());//發送CS1237配置信息到串口
  62.         
  63.         //---------------------------------------------------------------//
  64.         LED2 = 0;//燈亮
  65.         Main_Loop = 10;//開機自動讀取一次當前皮重。
  66.         while(Main_Loop--)//連續讀取10次,是因為CS1237讀取程序里有軟件濾波器,這樣做更接近真實值
  67.                 Tare_Coe = Read_18Bit_AD();//讀取出皮重的ADC數據
  68.         Tare_Coe *= Weight_Coe;
  69.         LED2 = 1;//關燈
  70.         //--------------------------------------------------------------//               
  71.         while(1)
  72.         {
  73.                 if(Key_1)//去皮后的值保存到EEPROM里面,必須在5V環境下 校準專用
  74.                 {
  75.                         Key_1 = 0;
  76.                         LED2 = 0;//燈亮
  77.                         Main_Loop = 10;
  78.                         while(Main_Loop--)
  79.                                 Tare = Read_18Bit_AD();//讀取出CS1237的數據,5V情況下
  80.                         Main_Loop = 10;
  81.                         while(Main_Loop--)
  82.                                 BGA_EEPROM = Get_BGA();//在5V供電情況下,保存BGA參數
  83.                         Wr_20_Long(0XD3B8,EEROM_20Long);//保存數據到EEPROM
  84.                         LED2 = 1;//關燈
  85.                 }
  86.                
  87.                 if(Key_2)//放上一個500g砝碼,用于校準誤差,必須在5V供電環境下
  88.                 {
  89.                         Key_2 = 0;
  90.                         LED2 = 0;//燈亮
  91.                         Main_Loop = 10;
  92.                         while(Main_Loop--)
  93.                                 Weight_500g = Read_18Bit_AD();//讀取出500G的數據
  94.                         Weight_Coe = Weight_500g -  Tare;//除去皮重的ADC數值
  95.                         Weight_Coe = 500000 / Weight_Coe;//放大1000倍的斜率
  96.                         Tare_Coe = Weight_Coe * Tare;//皮重的重量,放大1000倍之后的
  97.                         Wr_20_Long(0XD3B8,EEROM_20Long);//保存數據到EEPROM
  98.                         LED2 = 1;
  99.                 }
  100.                
  101.                 if(Key_3)//正常的去皮重,不保存到EEPROM里面
  102.                 {
  103.                         Key_3 = 0;
  104.                         LED2 = 0;
  105.                         Main_Loop = 10;
  106.                         while(Main_Loop--)
  107.                                 Tare_Coe = Read_18Bit_AD();//讀取出皮重的ADC數據
  108.                         Tare_Coe *= Weight_Coe;
  109.                         LED2 = 1;
  110.                 }
  111.                
  112.                 //定時器控制的子程序,每150ms調用一次
  113.                 if(Work_Count == 4)
  114.                 {
  115.                         OLED_ShowNum(7*9,2,Get_Bat(),4,16);//顯示電池電壓
  116.                         Weight_30S_1 = Get_Weight();//每一次稱重,都要更新一下用于低功耗的數據
  117.                         OLED_ShowNum(7*8,4,Weight_30S_1,4,16);//OLED顯示重量
  118.                         Work_Count = 0;
  119.                         if(Weight_30S_1 == Weight_30S_2)
  120.                         {
  121.                                 Low_Power ++;
  122.                         }
  123.                         else
  124.                         {
  125.                                 Weight_30S_2 = Weight_30S_1;
  126.                                 Low_Power = 0;
  127.                         }
  128.                 }
  129.                 //
  130.                 if(Low_Power > 150)
  131.                 {
  132.                         CS1237_Power_Down();//CS1237進入低功耗模式
  133.                         OLED_Power_Down();//OLED進入低功耗模式
  134.                         INT_CLKO |= 0X10;//使能INT2中斷,主要用于喚醒單片機
  135.                         //所有IO口設置為高阻輸入
  136.                         P0M1=0;P0M0=0;P1M1=0;P1M0=0;
  137.                         P2M1=0;P2M0=0;P3M1=0;P3M0=0;
  138.                         P4M1=0;P4M0=0;P5M1=0;P5M0=0;
  139.                         P0 = 0xff;P1 = 0xff;P2 = 0xff;
  140.                         P3 = 0xff;P4 = 0xff;P5 = 0xff;
  141.                         Power_Down_F = 0;
  142.                         PCON |= 0X02;//單片機進入停機模式
  143.                         while(1)
  144.                         {
  145.                                 if(Power_Down_F)//
  146.                                         IAP_CONTR = 0x20;
  147.                         }
  148.                 }
  149.         }
  150. }
  151. //獲取電池電壓,50次平均值
  152. unsigned int Get_Bat(void)
  153. {
  154.         unsigned char i=50;
  155.         unsigned long  dat=0;
  156.         while(i--)
  157.         {
  158.                 Get_Vol();//主要是為了獲取電池電壓
  159.                 dat += Battery_Now;
  160.         }
  161.         dat /= 50;
  162.         dat /= 100;//特意忽略電壓的最后兩位 表示以V為單位的電壓保留一位小數 比如3800mV,即3.8V
  163.         dat *= 100;
  164.         return dat;
  165. }
  166. //讀取CS1237,去皮后的重量,精確到g
  167. unsigned int Get_Weight(void)
  168. {
  169.         float dat;
  170.         unsigned long dat2;
  171.         dat = Read_18Bit_AD();
  172.         dat *= Weight_Coe;//計算出當前重量,毛重,1000倍放大的
  173.         dat -= Tare_Coe;//減去皮重的重量
  174.         if(dat<0)
  175.                 dat = 0;
  176.         dat2 = dat;
  177.         dat2 /= 100;//準備四舍五入,因為放大了100倍,所以現在保留了小數點后一位
  178.         if((dat2 % 10) > 5)
  179.         {
  180.                 dat2 /= 10;
  181.                 dat2 += 1;
  182.         }
  183.         else
  184.         {
  185.                 dat2 /= 10;
  186.         }
  187.         return dat2;
  188. }
  189. //根據校準的數值,計算出稱重系數
  190. void Get_Weight_Coe(void)
  191. {
  192.         Weight_Coe = Weight_500g -  Tare;//除去皮重的ADC數值
  193.         Weight_Coe = 500000 / Weight_Coe;//放大1000倍的斜率
  194.         Tare_Coe = Weight_Coe * Tare;//皮重的重量,放大1000倍之后的
  195. }
  196. //
  197. //外部中斷入口,主要用于掉電喚醒
  198. void EX_Int2(void) interrupt 10       //INT2
  199. {
  200. Power_Down_F = 1 ;
  201. }


  202. //






  203. ……………………

  204. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼


所有資料51hei提供下載:
電子秤程序.zip (158.05 KB, 下載次數: 572)



評分

參與人數 1黑幣 +1 收起 理由
心青見 + 1 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏20 分享淘帖 頂2 踩
回復

使用道具 舉報

來自 2#
ID:614056 發表于 2019-9-20 15:05 | 只看該作者
CS1237是深圳芯海科技專用ADC芯片,在128倍放大倍數情況下,AD精度可以到18位左右,VS參考電壓本身芯片可以提供,硬件可以選擇,可以做廚房秤和人體秤,以及其他高精度場合,軟件處理最好加上滑動濾波操作,從12年開始就使用芯海科技的ADC,希望有這方面愛好的便宜一起研究討論
回復

使用道具 舉報

板凳
ID:353236 發表于 2018-6-17 14:09 | 只看該作者
感謝大佬分享
回復

使用道具 舉報

地板
ID:420883 發表于 2018-11-14 08:19 | 只看該作者

感謝分享!!謝謝
回復

使用道具 舉報

5#
ID:426702 發表于 2018-11-14 21:27 | 只看該作者
感謝分享!!謝謝
回復

使用道具 舉報

6#
ID:290014 發表于 2019-1-4 13:32 | 只看該作者
很詳細,很精辟的 一個貼
回復

使用道具 舉報

7#
ID:407082 發表于 2019-1-18 16:16 | 只看該作者
感謝大佬的分享
回復

使用道具 舉報

8#
ID:407082 發表于 2019-1-18 16:17 | 只看該作者
謝謝了
回復

使用道具 舉報

9#
ID:383374 發表于 2019-1-22 00:50 來自觸屏版 | 只看該作者
可以幫我移植52到這個單片機上嗎,可以有報酬
回復

使用道具 舉報

10#
ID:128880 發表于 2019-4-10 10:41 | 只看該作者
謝謝樓主分享資料
回復

使用道具 舉報

11#
ID:546644 發表于 2019-5-24 22:13 | 只看該作者
正好想學習一下,謝謝分享
回復

使用道具 舉報

12#
ID:280497 發表于 2019-6-12 22:49 | 只看該作者
做一個小項目正好用上,謝謝樓主分享資料。
回復

使用道具 舉報

13#
ID:64765 發表于 2019-7-27 20:06 | 只看該作者
謝樓主分享。
回復

使用道具 舉報

14#
ID:595681 發表于 2019-8-5 16:54 | 只看該作者
謝謝樓主分享
回復

使用道具 舉報

15#
ID:280272 發表于 2019-9-15 11:22 | 只看該作者
謝謝樓主分享!
回復

使用道具 舉報

16#
ID:146278 發表于 2019-9-20 09:55 | 只看該作者
感謝分享
回復

使用道具 舉報

17#
ID:614056 發表于 2019-9-20 15:00 | 只看該作者
夢園心田 發表于 2019-1-22 00:50
可以幫我移植52到這個單片機上嗎,可以有報酬

我可以幫你,我專業做電子秤的
回復

使用道具 舉報

18#
ID:79874 發表于 2019-11-17 19:23 來自觸屏版 | 只看該作者
可以幫我一下嗎移植到stc89c52r
回復

使用道具 舉報

19#
ID:643948 發表于 2019-11-17 22:24 | 只看該作者
感謝大佬的分享 哦
回復

使用道具 舉報

20#
ID:644814 發表于 2019-11-19 09:31 | 只看該作者
學習了,謝謝
回復

使用道具 舉報

21#
ID:64765 發表于 2020-2-14 16:38 | 只看該作者
雪中送碳,太感謝了。謝樓主分享。
回復

使用道具 舉報

22#
ID:688367 發表于 2020-3-24 00:09 來自觸屏版 | 只看該作者
ancient-gree 發表于 2018-6-17 14:09
感謝大佬分享

謝謝了,正需要學習下。
回復

使用道具 舉報

23#
ID:298008 發表于 2020-3-26 08:35 | 只看該作者
謝謝樓主分享
回復

使用道具 舉報

24#
ID:71535 發表于 2020-3-26 20:44 | 只看該作者
太感謝了。謝樓主分享。看換成STM的芯
回復

使用道具 舉報

25#
ID:286702 發表于 2020-4-1 19:14 | 只看該作者
CS1237 24位 怎樣算出最終的值呢?
回復

使用道具 舉報

26#
ID:900714 發表于 2021-4-5 10:31 | 只看該作者
感謝分享,請問那個50次求平均,改為64次平均,用右移的運算,是不是還快一點?
回復

使用道具 舉報

27#
ID:196702 發表于 2022-9-2 14:43 | 只看該作者

注釋詳細,感謝大佬的分享!
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 成人精品鲁一区一区二区 | 国产美女永久免费无遮挡 | 中文字幕av在线播放 | 久久久成人免费一区二区 | 亚洲免费人成在线视频观看 | 热久久性 | 日日日干干干 | 欧美日韩网站 | 91精品国产91久久久久久不卞 | 亚洲一区二区三区桃乃木香奈 | 久久久久久国产免费视网址 | 日产精品久久久一区二区福利 | 日韩在线中文 | 99热视 | 国产这里只有精品 | 一区二区久久电影 | 国产丝袜人妖cd露出 | 久久久精品影院 | 伊人影院在线观看 | 欧美精品久久久久久久久老牛影院 | 丁香综合 | 亚洲一区中文字幕 | 亚洲 欧美 激情 另类 校园 | 成人片在线看 | 国产高清免费 | 亚洲精品久久久久久一区二区 | 9porny九色视频自拍 | av一二三四 | av在线成人 | 中文字幕一区二区三区在线乱码 | 伊人精品久久久久77777 | 久久精品网 | 成人精品一区二区户外勾搭野战 | 国产伊人精品 | 中文字幕 在线观看 | 在线观看涩涩视频 | 欧美一区二区三区一在线观看 | 亚洲欧美日韩在线一区二区 | 亚洲视频区| 日本免费一区二区三区视频 | 日本精品网站 |