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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

stc15w4單片機+HX711稱重傳感器+12864源程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:586048 發表于 2019-8-5 15:08 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
這是我從網上一堆程序整合成的電子秤,發給大家參考參考,有什么不對的希望大家指出。
程序已經完全調試正常,在雖然小數點的顯示不出來,但是穩定在克是沒有什么問題的。

單片機源程序如下:
  1. /*********************************************************************
  2. //主時鐘在 common.H 定義
  3. //u8,u16,u32已在"STC15Fxxxx.h"定義
  4. //因為15W系列快89系列 6——12倍,
  5. //時序圖上面的時間也要相應的加倍,具體多少要具體測試
  6. *********************************************************************/

  7. /*
  8. **********************************************************************
  9. *                         頭文件包含
  10. **********************************************************************
  11. */

  12. #include "common.h"
  13. #include "LCD12864.h"
  14. #include "HX711.h"
  15. //使用了宏晶科技的資料及程序

  16. /*********************************************************************
  17. 0 0 準雙向口(標準 8051 單片機輸出模式),灌電流可達 20mA,拉電流典型 值為 200uA,由于制造誤差,實際為 150~270 uA。
  18. 0 1 推挽輸出,強上拉輸出,可達 20 mA,外加限流電阻,盡量少用
  19. 1 0 僅為輸入(高阻)
  20. 1 1 開漏,內部上拉電阻斷開,要外接上拉電阻才可以輸出高電平。
  21. **********************************************************************/
  22. void port_mode(void)
  23. {
  24.         P0M1 = 0;        P0M0 = 0;        //設置為準雙向口
  25.         P1M1 = 0;        P1M0 = 0;        //設置為準雙向口
  26.         P2M1 = 0;        P2M0 = 0;        //設置為準雙向口
  27.         P3M1 = 0;        P3M0 = 0;        //設置為準雙向口
  28.         P4M1 = 0;        P4M0 = 0;        //設置為準雙向口
  29.         P5M1 = 0;        P5M0 = 0;        //設置為準雙向口
  30.         P6M1 = 0;        P6M0 = 0;        //設置為準雙向口
  31.         P7M1 = 0;        P7M0 = 0;        //設置為準雙向口
  32. }

  33. /*********************************************************************
  34. * 函 數 名       : main
  35. * 函數功能                   : 主函數
  36. * 參數列表       : 無
  37. * 函數輸出             : 無
  38. *********************************************************************/

  39. void main(void)
  40. {
  41.                 port_mode();                                                                //設置為準雙向口

  42.                 Lcd12864Init();                                                        //初始化
  43.                 Lcd12864ClearScreen();                        // 清屏        
  44.                 Lcd12864ShowStr(0,0,"   Holle word!");
  45.                 Lcd12864FlashScreen();
  46.                 delay_ms(200);
  47.                 Lcd12864ClearScreen();                        // 清屏        
  48.         delay_ms(1);
  49.         chengzhongmain();                                                                //顯示重量:單位G
  50.         while(1);

  51. }
復制代碼

所有資料51hei提供下載:
stc15w4k.zip (141.24 KB, 下載次數: 114)


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

使用道具 舉報

沙發
ID:586048 發表于 2019-8-5 15:14 | 只看該作者
12864的部分代碼
  1. /*
  2. **********************************************************************
  3. *                         頭文件包含
  4. **********************************************************************
  5. */
  6. #include "lcd12864.h"
  7. #include "delay.h"

  8. /*
  9. **********************************************************************
  10. *                         本地全局變量
  11. **********************************************************************
  12. */
  13. sbit gLcd12864_E  = P5^2;                        // LCD12864控制總線的使能信號
  14. sbit gLcd12864_RW = P5^1;                        // LCD12864控制總線的讀寫選擇信號
  15. sbit gLcd12864_RS = P5^0;                        // LCD12864控制總線的數據/命令選擇信號
  16. sbit gLcd12864_PSB= P5^4;                        // PSB腳為12864-12系列的串、并通訊功能切換,PSB=1為并口,PSB=0為串口


  17. // 顯示的圖片字模,取模軟件在光盤工具軟件目錄下的字模提取軟件
  18. // 注意要設置為橫向取模,不要勾選字節倒序

  19. /*
  20. **********************************************************************
  21. *                         內部函數原型聲明
  22. **********************************************************************
  23. */


  24. /*********************************************************************
  25. * 函 數 名       : Lcd12864WaitNoBusy
  26. * 函數功能                 : 阻塞等待LCD12864直到不忙狀態
  27. * 參數列表       : 無
  28. * 函數輸出             : 無
  29. *********************************************************************/
  30. static void Lcd12864WaitNoBusy(void)  //忙檢測函數,判斷bit7是0,允許執行;1禁止
  31. {
  32.     u8 sta = 0;      

  33.     LCD12864_DATA_PORT = 0xff;
  34.     gLcd12864_RS = 0;
  35.     gLcd12864_RW = 1;
  36.     do
  37.     {
  38.         gLcd12864_E = 1;
  39.         sta = LCD12864_DATA_PORT;
  40.         gLcd12864_E = 0;    //使能,用完就拉低,釋放總線
  41.     }while(sta & 0x80);
  42. }


  43. /*********************************************************************
  44. * 函 數 名       : Lcd12864WriteCmd
  45. * 函數功能                 : 按照LCD12864低層時序向LCD內部寫入8位命令字
  46. * 參數列表       : cmd - 待寫入的8位命令字
  47. * 函數輸出             : 無
  48. *********************************************************************/
  49. static void Lcd12864WriteCmd(u8 cmd)          
  50. {
  51.         Lcd12864WaitNoBusy();                // 先等待LCD1602處于不忙狀態

  52.         gLcd12864_E = 0;                     // 禁止LCD
  53. //        Delay100us();
  54.         gLcd12864_RS = 0;                           // 選擇發送命令模式
  55. //        Delay100us();
  56.         gLcd12864_RW = 0;                           // 選擇寫入模式       
  57. //        Delay100us();
  58.         LCD12864_DATA_PORT = cmd;    // 將1字節命令字放入8位并行數據端口
  59.         Delay100us();
  60.         gLcd12864_E = 1;                          // 使能LED
  61.         Delay100us();
  62.         gLcd12864_E = 0;                                // 禁止LCD
  63. }


  64. /*********************************************************************
  65. * 函 數 名       : Lcd12864WriteData
  66. * 函數功能                 : 按照LCD12864低層時序向LCD內部寫入8位數據
  67. * 參數列表       : dat - 待寫入的8位命令字
  68. * 函數輸出             : 無
  69. *********************************************************************/
  70. static void Lcd12864WriteData(u8 dat)                       
  71. {
  72.         Lcd12864WaitNoBusy();                // 先等待LCD12864處于不忙狀態

  73.         gLcd12864_E = 0;                     // 禁止LCD
  74. //        Delay100us();
  75.         gLcd12864_RS = 1;                           // 選擇發送數據模式
  76. //        Delay100us();
  77.         gLcd12864_RW = 0;                           // 選擇寫入模式       
  78. //        Delay100us();
  79.         LCD12864_DATA_PORT = dat;    // 將1字節命令字放入8位并行數據端口
  80.         Delay100us();
  81.         gLcd12864_E = 1;                          // 使能LED
  82.         Delay100us();
  83.         gLcd12864_E = 0;                                // 禁止LCD
  84. }


  85. /************* 上面是底層時序函數,下面是高層時序函數 ***************/

  86. /*********************************************************************
  87. * 函 數 名       : Lcd12864Init
  88. * 函數功能                 : 按照LCD12864低層時序進行初始化序列
  89. * 參數列表       : 無
  90. * 函數輸出             : 無
  91. *********************************************************************/
  92. void Lcd12864Init(void)                                               
  93. {
  94.         gLcd12864_PSB = 1;                        // 設置為8位并行總線
  95.         Delay100us();
  96.         // 發送初始化序列
  97.         Lcd12864WriteCmd(0x30);          // 0x30為基本指令集
  98.         Lcd12864WriteCmd(0x01);                // 0x01為清屏指令
  99.         Lcd12864WriteCmd(0x06);          // 地址自動加1
  100.         Lcd12864WriteCmd(0x0c);                // 整體顯示、游標關閉
  101. }


  102. /*********************************************************************
  103. * 函 數 名       : Lcd12864ClearScreen
  104. * 函數功能                 : 清屏,即清除屏幕整個顯示內容
  105. * 參數列表       : 無
  106. * 函數輸出             : 無
  107. *********************************************************************/
  108. void Lcd12864ClearScreen(void)                                               
  109. {

  110.         // 發送初始化序列
  111.         Lcd12864WriteCmd(0x01);          // 0x01為清屏指令
  112. //        Lcd12864WriteCmd(0x34);                // 0x34為擴充指令集
  113. //        Lcd12864WriteCmd(0x30);          // 0x30為基本指令集
  114. }


  115. /*********************************************************************
  116. * 函 數 名       : Lcd12864FlashScreen3
  117. * 函數功能                         : 屏幕閃爍3次
  118. * 參數列表       : 無
  119. * 函數輸出             : 無
  120. *********************************************************************/
  121. void Lcd12864FlashScreen(void)                                               
  122. {
  123.         u8 time = 0;

  124.         for (time=0; time<3; time++)
  125.         {
  126.                 Lcd12864WriteCmd(0x08);
  127.                 Delay500ms();
  128.                 Lcd12864WriteCmd(0x0c);       
  129.                 Delay500ms();               
  130.         }
  131. }
  132. /****************************************************
  133. //顯示一個字符
  134. void Lcd12864ShowChar(u8 x, u8 y, u8 DData)
  135. {
  136.         switch (y)
  137.         {
  138.                 case 0:
  139.                         x |= 0x80;        break;
  140.                 case 1:
  141.                         x |= 0x90;        break;
  142.                 case 2:
  143.                         x |= 0x88;        break;
  144.                 case 3:
  145.                         x |= 0x98;        break;
  146.                 default:
  147.                                                 break;
  148.         }
  149.                                 Lcd12864WriteCmd(x); //這里不檢測忙信號,發送地址碼
  150.         Lcd12864WriteData(DData);
  151. }
  152. *******************************************************/
  153. /*********************************************************************
  154. * 函 數 名       : Lcd12864ShowStr
  155. * 函數功能                 : 從坐標(x, y)開始顯示字符串str,注意這個函數不能跨行
  156. *                                   顯示,因為顯存地址是不連續的。
  157. * 參數列表       : x - 橫向坐標,范圍是0-7
  158. *                                   y - 縱向坐標,范圍是0-3
  159. *                                   pStr - 指向待顯示的字符串的指針
  160. * 函數輸出             : 無
  161. *********************************************************************/
  162. void Lcd12864ShowStr(u8 x, u8 y, u8 *pStr)     //顯示字符串
  163. {
  164.         switch (y)
  165.         {
  166.                 case 0:
  167.                         x |= 0x80;        break;
  168.                 case 1:
  169.                         x |= 0x90;        break;
  170.                 case 2:
  171.                         x |= 0x88;        break;
  172.                 case 3:
  173.                         x |= 0x98;        break;
  174.                 default:
  175.                                                 break;
  176.         }
  177.         Lcd12864WriteCmd(x);                                         // 發送地址碼
  178.           while (*pStr != '\0')                         // 若到達字串尾則退出
  179.           {
  180.              Lcd12864WriteData(*pStr);
  181.              pStr++;
  182.                  Delay100us();
  183.           }
  184. }


  185. /*********************************************************************
  186. * 函 數 名       : Lcd12864ShowImage
  187. * 函數功能                         : 顯示一個128*64分辨率的2值位圖。
  188. * 參數列表       : pData - 指向待顯示的位圖圖像數組指針                  
  189. * 函數輸出             : 無
  190. *********************************************************************/
  191. //void Lcd12864ShowImage(u8 *pData)
  192. //{
  193. //        u8 x = 0, y = 0, i = 0;
  194. //        u16 tmp = 0;

  195. //        //分兩屏,上半屏和下半屏,因為起始地址不同,需要分開
  196. //        for (i=0; i<9; i+=8)
  197. //        {               
  198. //                for (x=0; x<32; x++)
  199. //                {                                //32行
  200. //                        Lcd12864WriteCmd(0x34);
  201. //                        Lcd12864WriteCmd(0x80 + x);                // 列地址
  202. //                        Lcd12864WriteCmd(0x80 + i);                // 行地址,下半屏,即第三行地址0X88
  203. //                        Lcd12864WriteCmd(0x30);               
  204. //                        for (y=0; y<16; y++)       
  205. //                                Lcd12864WriteData(pData[tmp+y]);        // 將取數據寫入LCD
  206. //                        tmp += 16;               
  207. //                }
  208. //        }
  209. //        Lcd12864WriteCmd(0x36);                                        // 擴充功能設定
  210. //        Lcd12864WriteCmd(0x30);
  211. //}


復制代碼
回復

使用道具 舉報

板凳
ID:586048 發表于 2019-8-5 15:14 | 只看該作者
HX711部分代碼
  1. #include "HX711.h"
  2. #include "LCD12864.h"


  3. //校準參數
  4. //因為不同的傳感器特性曲線不是很一致,因此,每一個傳感器需要矯正這里這個參數才能使測量值很準確。
  5. //當發現測試出來的重量偏大時,增加該數值。
  6. //如果測試出來的重量偏小時,減小改數值。
  7. //該值可以為小數

  8. #define GapValue A
  9. u16 A = 442.8;//這是一個修正系數,例如100g砝碼稱出來是99.2g,A=99.2*A/原數據;

  10. #define MEDIAN_LEN  9               //中值濾波的濾波長度,一般取奇數
  11. #define MEDIAN      5               //中值在濾波數組中的位置
  12. u32   buffer[MEDIAN_LEN];           //中值濾波的數據緩存
  13. u16     medleng = 0;                //一組中值濾波數據中,進入濾波緩存的數據個數
  14. u32   xd,xd1;                       //數據對比大小中間變量

  15. //函數或者變量聲明
  16. extern void Delay_ms(unsigned int n);
  17. extern void Get_Maopi();
  18. extern void Get_Weight();
  19. extern void Scan_Key();


  20. /*unsigned char code b[]={"0123456789.-g"};                //ZF        占兩個字符*/
  21. u8        dat[]="0000.00G";

  22. unsigned long HX711_Buffer = 0;
  23. unsigned long Weight_Maopi = 0;
  24. long Weight_Shiwu = 0;

  25. unsigned char flag = 0;
  26. bit Flag_ERROR = 0;                                                                       
  27. sbit KEY1 = P2^3;


  28. sbit speak= P5^5;//板子上的測試燈

  29. //****************************************************
  30. //讀取HX711
  31. //****************************************************
  32. u32 HX711_Read(void)        //增益128
  33. {
  34.         unsigned long count;
  35.         unsigned char i;
  36.        
  37.           HX711_DOUT=1;
  38.                 Delay5us();
  39.           HX711_SCK=0;
  40.           count=0;
  41.                         EA = 1;
  42.                         while(HX711_DOUT);
  43.                         EA = 0;
  44.                         for(i=0;i<24;i++)        //做24個脈沖
  45.                                 {
  46.                                         HX711_SCK=1;
  47.                                         count=count<<1;
  48.                                         HX711_SCK=0;
  49.                                        
  50.                                         if(HX711_DOUT)
  51.                                                 count++;
  52.                                 }
  53.                 HX711_SCK=1;
  54.     count=count^0x800000;//第25個脈沖下降沿來時,轉換數據
  55.                 Delay5us();
  56.                 HX711_SCK=0;  
  57.                 return(count);
  58. }

  59. //****************************************************
  60. //顯示稱重程序
  61. //****************************************************
  62. void chengzhongmain()
  63. {
  64.         u16 i;
  65.                 Get_Maopi();                                //稱毛皮重量
  66.                 Delay100us();
  67.                 Get_Maopi();                                //再次稱毛皮重量
  68.                
  69.                 while(1)
  70.                 {
  71.                         EA = 0;
  72.                         Get_Weight();                        //稱重
  73.                         EA = 1;

  74.                         Scan_Key();                                //按鍵,觸發去皮

  75.                         if(medleng == 0)                    //緩存的第1個元素,直接放入,不需要排序
  76.                         {
  77.                                 buffer[0] = Weight_Shiwu; medleng = 1;
  78.                         }
  79.                         else                                            //插入排序算法,按從小到大的順序排列
  80.                         {  
  81.                                 for(i = 0; i < medleng; i ++)  
  82.                                 {
  83.                                         if( buffer[i] > Weight_Shiwu)         // 輪詢到的當前元素>AD值,則交換它們的值,xd為中間變量存放位置
  84.                                         {
  85.                                                 xd = Weight_Shiwu; Weight_Shiwu = buffer[i]; buffer[i] = xd;
  86.                                         }
  87.                                 }
  88.                                 buffer[medleng] = Weight_Shiwu;         //把輪詢出較大的數放入緩存的后面.
  89.                                 medleng++;
  90.                         }               
  91.                         //顯示當前重量
  92.                 if(medleng >= MEDIAN_LEN)                                     //ADC采樣的數據個數達到中值濾波要求的數據個數
  93.                 {
  94.                         Weight_Shiwu = buffer[MEDIAN];            //最終重量取中值濾波數組的中間值
  95.                         medleng = 0;
  96.                         if( Flag_ERROR == 1)
  97.                         {
  98.                                 Lcd12864ClearScreen();                                                                                        //清屏
  99.                                 Lcd12864ShowStr(2,1,"error");                                                                //顯示錯誤
  100.                                 speak=0;                                                                                                                                                //大于5千克時亮
  101.                                 delay_ms(200);
  102.                                 Lcd12864ClearScreen();                                                                                        //清屏
  103.                         }               
  104.                         else
  105.                         {                                                                                                     
  106.                                                         speak=1;       
  107.                                         Lcd12864ShowStr(0,0,"重量:");                                                        //占三個字符
  108.                                         dat[0] = Weight_Shiwu/100000+'0';                                                //顯示千位
  109.                                         dat[1] = Weight_Shiwu%100000/10000+'0';
  110.                                         dat[2] = Weight_Shiwu%10000/1000+'0';
  111.                                         dat[3] = Weight_Shiwu%1000/100+'0';
  112.                                         dat[5] = Weight_Shiwu%100/10 + '0';                                        //顯示小數點后一位
  113.                                         dat[6] = Weight_Shiwu%10 + '0';                                       
  114.                                         Lcd12864ShowStr(3,0,dat);                                                                                //從第三個字符開始顯示,按中文字符算兩個
  115.                         }                                                                                                                                                                                                //中文前面不能只有一個英文字符,否則會亂碼
  116.                 }
  117.         }
  118. }


  119. //掃描按鍵
  120. void Scan_Key()                                        //key = P2^3
  121. {
  122.         if(KEY1 == 0)
  123.         {
  124.                 Delay_ms(5);
  125.                 if(KEY1 == 0)
  126.                 {
  127.                         while(KEY1 == 0);
  128.                         Get_Maopi();                        //去皮
  129.                 }       
  130.         }
  131. }

  132. //****************************************************
  133. //稱重:獲取被測物體重量
  134. //****************************************************
  135. void Get_Weight()
  136. {
  137.         Weight_Shiwu = 100*HX711_Read();                                                        //放大獲取小數
  138.         Weight_Shiwu = Weight_Shiwu - Weight_Maopi;                //獲取凈重
  139.         if(Weight_Shiwu > 1)                       
  140.         {       
  141.                 Weight_Shiwu = (unsigned int)((float)Weight_Shiwu/GapValue);         //計算實物的實際重量,重量轉換函數,傳感器型號不同此函數要適當修改(修GapValue大小)
  142.                                                                                                                                                                                                                                                                                                
  143.                 if(Weight_Shiwu > 500000)                //超重報警,5千克放大了100倍
  144.                 {
  145.                         Flag_ERROR = 1;       
  146.                 }
  147.                 else
  148.                 {
  149.                         Flag_ERROR = 0;
  150.                 }
  151.         }
  152.         else
  153.         {
  154.                 Weight_Shiwu = 0;
  155.         //        Flag_ERROR = 1;                                //負重報警
  156.         }
  157.        
  158. }

  159. //****************************************************
  160. //獲取毛皮重量,秤盤重量
  161. //****************************************************
  162. void Get_Maopi()
  163. {
  164.         /*u32 hx711_dat;
  165.         u16 i;
  166.         for(i=0;i<MEDIAN_LEN;i++)
  167.         {
  168.                 hx711_dat=HX711_Read();                          //HX711AD轉換數據處理
  169.                 if(medleng == 0)                    //緩存的第1個元素,直接放入,不需要排序
  170.                 {
  171.                         buffer[0] = hx711_dat; medleng = 1;
  172.                 }
  173.                 else                                    //插入排序算法,按從小到大的順序排列
  174.                 {  
  175.                         for(i = 0; i < medleng; i ++)  
  176.                         {
  177.                                 if( buffer[i] > hx711_dat)                 // 輪詢到的當前元素>AD值,則交換它們的值,xd為中間變量存放位置
  178.                                 {
  179.                                         xd = hx711_dat; hx711_dat = buffer[i]; buffer[i] = xd;
  180.                                 }
  181.                         }
  182.                         buffer[medleng] = hx711_dat;                 //把輪詢出較大的數放入緩存的后面.
  183.                         medleng++;
  184.                 }               
  185.                 if(medleng >= MEDIAN_LEN)                     //ADC采樣的數據個數達到中值濾波要求的數據個數
  186.                 {
  187.                         hx711_dat = buffer[MEDIAN];            //最終重量取中值濾波數組的中間值
  188.                         medleng = 0;
  189.                 }
  190.         }*///去掉上面這個可以加快速度,但精度有所降低,如果不顯示小數,加不加無所謂
  191.         Weight_Maopi = 100*HX711_Read();                //放大獲取小數
  192. }       
復制代碼
回復

使用道具 舉報

地板
ID:597842 發表于 2019-8-8 17:39 | 只看該作者
這是用的51還是?
回復

使用道具 舉報

5#
ID:62514 發表于 2019-8-16 20:39 | 只看該作者
學習中,希望一次調試通過。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美一区二区三区小说 | 亚洲欧美国产精品久久 | 久久电影一区 | www.久久久 | 日韩中文字幕视频 | 国产欧美一区二区三区免费 | 久久婷婷香蕉热狠狠综合 | 一本大道久久a久久精二百 国产成人免费在线 | 亚洲永久 | 欧美日高清| 亚洲一区二区久久 | 日韩精品一区二区三区中文在线 | 久久天天躁狠狠躁夜夜躁2014 | 黄色大片视频 | 午夜精品久久久久久不卡欧美一级 | 久久综合一区 | 久久国产综合 | 亚洲福利一区 | 夜夜骑首页 | 91免费小视频 | 国产精品一区二区三区在线播放 | 先锋资源在线 | 国产视频三级 | 久久国产成人 | 久久久www成人免费精品 | 日韩亚洲欧美综合 | 欧美国产精品一区二区三区 | 综合另类 | 青娱乐av | 91一区二区 | 亚洲激情网站 | 中文字幕av一区 | 久久精品国产一区二区电影 | 亚洲成人三区 | 中文字幕一区二区三区日韩精品 | 亚洲成人午夜电影 | 免费国产一区 | 亚洲二区在线 | 国产精品国产 | 综合五月婷 | 国产一级黄色网 |