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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 19507|回復(fù): 26
收起左側(cè)

帶詳細(xì)注釋的51單片機(jī)CS1237電子秤源程序

  [復(fù)制鏈接]
ID:313435 發(fā)表于 2018-4-21 23:35 | 顯示全部樓層 |閱讀模式
工程硬件平臺:    1,51Core-V1.0(51單片機(jī)最小系統(tǒng)板)
                2,差分ADC模塊-CS1237
                3,稱重傳感器模塊
                4,OLED顯示器0.96寸,4PIN

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

硬件:

1,單片機(jī)內(nèi)部時鐘設(shè)置為 5.5296MHZ

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

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

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

5,鋰電池供電下的運(yùn)行功耗:19mA    待機(jī)功耗:<2mA

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



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

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

3,    去皮功能。經(jīng)過兩個點(diǎn)的校準(zhǔn)后便可以正常使用。使用過程中隨時可以去皮重。按下 KEY3 按鍵即可。

4,    電池供電使用。接上一節(jié)普通鋰電池即可使用(也可以是兩節(jié)或三節(jié)普通干電池串聯(lián)),接到5V供電的位置即可。
    OLED顯示屏?xí)@示電池的電壓,單位是mV。
   
5,    程序正常執(zhí)行顯示的是實(shí)時重量。

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

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

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

---------------------------------------------------
單片機(jī)源程序如下:
  1. //內(nèi)部時鐘 5.5296MHZ
  2. //電池供電可用,實(shí)時顯示重量,單位g
  3. //KEY1 校準(zhǔn)時第一步空稱 ;  KEY2 砝碼校準(zhǔn)500G砝碼 ;KEY3 常規(guī)去皮功能
  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]  //校準(zhǔn)用,皮重
  13. #define  BGA_EEPROM   EEROM_20Long[1]  //在5V供電下,校準(zhǔn)的內(nèi)部BGA參數(shù)
  14. #define  First_ON     EEROM_20Long[2]  //第一次開機(jī)標(biāo)志位 如果不是88則表示第一次開機(jī),用于批量生產(chǎn)
  15. #define  Weight_500g  EEROM_20Long[3]  //500G標(biāo)定時候的ADC數(shù)值


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

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

  31. void main(void)
  32. {
  33.         unsigned int Main_Loop=0;//在主函數(shù)里面用的,循環(huán)時候控制循環(huán)次數(shù)的變量
  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;//打開單片機(jī)全局中斷
  44.         Re_20_Long(0XD3B8,EEROM_20Long);//讀取所有的掉電保存數(shù)據(jù)到內(nèi)存里
  45.         Delay1ms(10);
  46.         if(First_ON != 88)//如果檢測到第一次開機(jī)情況,表示需要校準(zhǔn),用于批量生產(chǎn)時候
  47.         {
  48.                 LED2 = 0;//燈亮
  49.                 First_ON = 88;
  50.                 Main_Loop = 10;
  51.                 while(Main_Loop--)
  52.                         Tare = Read_18Bit_AD();//讀取出CS1237的數(shù)據(jù),5V情況下
  53.                 Main_Loop = 10;
  54.                 while(Main_Loop--)
  55.                         BGA_EEPROM = Get_BGA();//在5V供電情況下,保存BGA參數(shù)
  56.                 Wr_20_Long(0XD3B8,EEROM_20Long);//保存數(shù)據(jù)到EEPROM
  57.                 LED2 = 1;//燈滅
  58.         }
  59.         else
  60.                 Get_Weight_Coe();//依據(jù)EEPROM內(nèi)容,計(jì)算稱重系數(shù)
  61.         Send_Data1(Read_CON());//發(fā)送CS1237配置信息到串口
  62.         
  63.         //---------------------------------------------------------------//
  64.         LED2 = 0;//燈亮
  65.         Main_Loop = 10;//開機(jī)自動讀取一次當(dāng)前皮重。
  66.         while(Main_Loop--)//連續(xù)讀取10次,是因?yàn)镃S1237讀取程序里有軟件濾波器,這樣做更接近真實(shí)值
  67.                 Tare_Coe = Read_18Bit_AD();//讀取出皮重的ADC數(shù)據(jù)
  68.         Tare_Coe *= Weight_Coe;
  69.         LED2 = 1;//關(guān)燈
  70.         //--------------------------------------------------------------//               
  71.         while(1)
  72.         {
  73.                 if(Key_1)//去皮后的值保存到EEPROM里面,必須在5V環(huán)境下 校準(zhǔn)專用
  74.                 {
  75.                         Key_1 = 0;
  76.                         LED2 = 0;//燈亮
  77.                         Main_Loop = 10;
  78.                         while(Main_Loop--)
  79.                                 Tare = Read_18Bit_AD();//讀取出CS1237的數(shù)據(jù),5V情況下
  80.                         Main_Loop = 10;
  81.                         while(Main_Loop--)
  82.                                 BGA_EEPROM = Get_BGA();//在5V供電情況下,保存BGA參數(shù)
  83.                         Wr_20_Long(0XD3B8,EEROM_20Long);//保存數(shù)據(jù)到EEPROM
  84.                         LED2 = 1;//關(guān)燈
  85.                 }
  86.                
  87.                 if(Key_2)//放上一個500g砝碼,用于校準(zhǔn)誤差,必須在5V供電環(huán)境下
  88.                 {
  89.                         Key_2 = 0;
  90.                         LED2 = 0;//燈亮
  91.                         Main_Loop = 10;
  92.                         while(Main_Loop--)
  93.                                 Weight_500g = Read_18Bit_AD();//讀取出500G的數(shù)據(jù)
  94.                         Weight_Coe = Weight_500g -  Tare;//除去皮重的ADC數(shù)值
  95.                         Weight_Coe = 500000 / Weight_Coe;//放大1000倍的斜率
  96.                         Tare_Coe = Weight_Coe * Tare;//皮重的重量,放大1000倍之后的
  97.                         Wr_20_Long(0XD3B8,EEROM_20Long);//保存數(shù)據(jù)到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數(shù)據(jù)
  108.                         Tare_Coe *= Weight_Coe;
  109.                         LED2 = 1;
  110.                 }
  111.                
  112.                 //定時器控制的子程序,每150ms調(diào)用一次
  113.                 if(Work_Count == 4)
  114.                 {
  115.                         OLED_ShowNum(7*9,2,Get_Bat(),4,16);//顯示電池電壓
  116.                         Weight_30S_1 = Get_Weight();//每一次稱重,都要更新一下用于低功耗的數(shù)據(jù)
  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進(jìn)入低功耗模式
  133.                         OLED_Power_Down();//OLED進(jìn)入低功耗模式
  134.                         INT_CLKO |= 0X10;//使能INT2中斷,主要用于喚醒單片機(jī)
  135.                         //所有IO口設(shè)置為高阻輸入
  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;//單片機(jī)進(jìn)入停機(jī)模式
  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為單位的電壓保留一位小數(shù) 比如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;//計(jì)算出當(dāng)前重量,毛重,1000倍放大的
  173.         dat -= Tare_Coe;//減去皮重的重量
  174.         if(dat<0)
  175.                 dat = 0;
  176.         dat2 = dat;
  177.         dat2 /= 100;//準(zhǔn)備四舍五入,因?yàn)榉糯罅?00倍,所以現(xiàn)在保留了小數(shù)點(diǎn)后一位
  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. //根據(jù)校準(zhǔn)的數(shù)值,計(jì)算出稱重系數(shù)
  190. void Get_Weight_Coe(void)
  191. {
  192.         Weight_Coe = Weight_500g -  Tare;//除去皮重的ADC數(shù)值
  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黑下載附件…………
復(fù)制代碼
0.jpg

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



評分

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

查看全部評分

回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

ID:353236 發(fā)表于 2018-6-17 14:09 | 顯示全部樓層
感謝大佬分享
回復(fù)

使用道具 舉報(bào)

ID:420883 發(fā)表于 2018-11-14 08:19 | 顯示全部樓層

感謝分享!!謝謝
回復(fù)

使用道具 舉報(bào)

ID:426702 發(fā)表于 2018-11-14 21:27 | 顯示全部樓層
感謝分享!!謝謝
回復(fù)

使用道具 舉報(bào)

ID:290014 發(fā)表于 2019-1-4 13:32 | 顯示全部樓層
很詳細(xì),很精辟的 一個貼
回復(fù)

使用道具 舉報(bào)

ID:407082 發(fā)表于 2019-1-18 16:16 | 顯示全部樓層
感謝大佬的分享
回復(fù)

使用道具 舉報(bào)

ID:407082 發(fā)表于 2019-1-18 16:17 | 顯示全部樓層
謝謝了
回復(fù)

使用道具 舉報(bào)

ID:383374 發(fā)表于 2019-1-22 00:50 來自觸屏版 | 顯示全部樓層
可以幫我移植52到這個單片機(jī)上嗎,可以有報(bào)酬
回復(fù)

使用道具 舉報(bào)

ID:128880 發(fā)表于 2019-4-10 10:41 | 顯示全部樓層
謝謝樓主分享資料
回復(fù)

使用道具 舉報(bào)

ID:546644 發(fā)表于 2019-5-24 22:13 | 顯示全部樓層
正好想學(xué)習(xí)一下,謝謝分享
回復(fù)

使用道具 舉報(bào)

ID:280497 發(fā)表于 2019-6-12 22:49 | 顯示全部樓層
做一個小項(xiàng)目正好用上,謝謝樓主分享資料。
回復(fù)

使用道具 舉報(bào)

ID:64765 發(fā)表于 2019-7-27 20:06 | 顯示全部樓層
謝樓主分享。
回復(fù)

使用道具 舉報(bào)

ID:595681 發(fā)表于 2019-8-5 16:54 | 顯示全部樓層
謝謝樓主分享
回復(fù)

使用道具 舉報(bào)

ID:280272 發(fā)表于 2019-9-15 11:22 | 顯示全部樓層
謝謝樓主分享!
回復(fù)

使用道具 舉報(bào)

ID:146278 發(fā)表于 2019-9-20 09:55 | 顯示全部樓層
感謝分享
回復(fù)

使用道具 舉報(bào)

ID:614056 發(fā)表于 2019-9-20 15:00 | 顯示全部樓層
夢園心田 發(fā)表于 2019-1-22 00:50
可以幫我移植52到這個單片機(jī)上嗎,可以有報(bào)酬

我可以幫你,我專業(yè)做電子秤的
回復(fù)

使用道具 舉報(bào)

18#
無效樓層,該帖已經(jīng)被刪除
ID:79874 發(fā)表于 2019-11-17 19:23 來自觸屏版 | 顯示全部樓層
可以幫我一下嗎移植到stc89c52r
回復(fù)

使用道具 舉報(bào)

ID:643948 發(fā)表于 2019-11-17 22:24 | 顯示全部樓層
感謝大佬的分享 哦
回復(fù)

使用道具 舉報(bào)

ID:644814 發(fā)表于 2019-11-19 09:31 | 顯示全部樓層
學(xué)習(xí)了,謝謝
回復(fù)

使用道具 舉報(bào)

ID:64765 發(fā)表于 2020-2-14 16:38 | 顯示全部樓層
雪中送碳,太感謝了。謝樓主分享。
回復(fù)

使用道具 舉報(bào)

ID:688367 發(fā)表于 2020-3-24 00:09 來自觸屏版 | 顯示全部樓層
ancient-gree 發(fā)表于 2018-6-17 14:09
感謝大佬分享

謝謝了,正需要學(xué)習(xí)下。
回復(fù)

使用道具 舉報(bào)

ID:298008 發(fā)表于 2020-3-26 08:35 | 顯示全部樓層
謝謝樓主分享
回復(fù)

使用道具 舉報(bào)

ID:71535 發(fā)表于 2020-3-26 20:44 | 顯示全部樓層
太感謝了。謝樓主分享。看換成STM的芯
回復(fù)

使用道具 舉報(bào)

ID:286702 發(fā)表于 2020-4-1 19:14 | 顯示全部樓層
CS1237 24位 怎樣算出最終的值呢?
回復(fù)

使用道具 舉報(bào)

27#
無效樓層,該帖已經(jīng)被刪除
28#
無效樓層,該帖已經(jīng)被刪除
ID:900714 發(fā)表于 2021-4-5 10:31 | 顯示全部樓層
感謝分享,請問那個50次求平均,改為64次平均,用右移的運(yùn)算,是不是還快一點(diǎn)?
回復(fù)

使用道具 舉報(bào)

30#
無效樓層,該帖已經(jīng)被刪除
31#
無效樓層,該帖已經(jīng)被刪除
32#
無效樓層,該帖已經(jīng)被刪除
ID:196702 發(fā)表于 2022-9-2 14:43 | 顯示全部樓層

注釋詳細(xì),感謝大佬的分享!
回復(fù)

使用道具 舉報(bào)

34#
無效樓層,該帖已經(jīng)被刪除
35#
無效樓層,該帖已經(jīng)被刪除
您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表