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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

51單片機的簡易電子秤換了一個開發板就不顯示了,求大神幫忙解決

[復制鏈接]
跳轉到指定樓層
樓主
本帖最后由 AT88C52RC 于 2019-7-20 11:08 編輯

下面程序是在本論壇下載后修改的,下載到開發板后都能用,但是換了一個開發板之后稱重模塊就不能用了或者說不顯示重量了,下面是顯示和接線。求大神支招該怎么辦?原本顯示重量數字的地方現在沒有任何顯示。

  1. #include<reg51.h>    //包含單片機寄存器的頭文件
  2. #include<intrins.h>  //包含_nop_()函數定義的頭文件
  3. #define GapValue 400

  4. typedef unsigned int u16;
  5. typedef unsigned char u8;
  6. sbit bz= P1^5;

  7. unsigned long HX711_Buffer = 0;
  8. sbit HX711_SCK=P2^1;
  9. sbit HX711_DOUT=P2^0;
  10. void Delay__hx711_us()
  11. {
  12.         _nop_();
  13.         _nop_();
  14. }

  15. long Weight_Shiwu = 0;
  16. unsigned long Weight_Maopi = 0;
  17. unsigned int ge=0,shi=0,bai=0,qian=0;
  18. unsigned char code string[ ]={"Weight:"};          //顯示數組
  19. //unsigned char code string3[ ]={"error!"};          //顯示數組
  20. unsigned char code digit[ ]={"0123456789"}; //定義字符數組顯示數字

  21. sbit RS=P2^6;    //寄存器選擇位,將RS位定義為P2.0引腳
  22. sbit RW=P2^5;    //讀寫選擇位,將RW位定義為P2.1引腳
  23. sbit E=P2^7;     //使能信號位,將E位定義為P2.2引腳
  24. sbit BF=P0^7;    //忙碌標志位,將BF位定義為P0.7引腳
  25. /*****************************************************
  26. 函數功能:延時1ms
  27. (3j+2)*i=(3×33+2)×10=1010(微秒),可以認為是1毫秒
  28. ***************************************************/
  29. void delay1ms()
  30. {
  31.    unsigned char i,j;        
  32.          for(i=0;i<10;i++)
  33.           for(j=0;j<33;j++)
  34.            ;                 
  35. }
  36. /*****************************************************
  37. 函數功能:延時若干毫秒
  38. 入口參數:n
  39. ***************************************************/
  40. void delay(unsigned char n)
  41. {
  42.    unsigned char i;
  43.         for(i=0;i<n;i++)
  44.            delay1ms();
  45. }
  46. /*****************************************************
  47. 函數功能:判斷液晶模塊的忙碌狀態
  48. 返回值:result。result=1,忙碌;result=0,不忙
  49. ***************************************************/
  50. unsigned char BusyTest(void)
  51.   {
  52.    bit result;
  53.         RS=0;       //根據規定,RS為低電平,RW為高電平時,可以讀狀態
  54.     RW=1;
  55.     E=1;        //E=1,才允許讀寫
  56.     _nop_();   //空操作
  57.     _nop_();
  58.     _nop_();
  59.     _nop_();   //空操作四個機器周期,給硬件反應時間        
  60.    result=BF;  //將忙碌標志電平賦給result
  61.         E=0;
  62.     return result;
  63.   }
  64. /*****************************************************
  65. 函數功能:將模式設置指令或顯示地址寫入液晶模塊
  66. 入口參數:dictate
  67. ***************************************************/
  68. void WriteInstruction (unsigned char dictate)
  69. {   
  70.     while(BusyTest()==1); //如果忙就等待
  71.          RS=0;                  //根據規定,RS和R/W同時為低電平時,可以寫入指令
  72.          RW=0;   
  73.          E=0;                   //E置低電平(根據表8-6,寫指令時,E為高脈沖,
  74.                              // 就是讓E從0到1發生正跳變,所以應先置"0"
  75.          _nop_();
  76.          _nop_();             //空操作兩個機器周期,給硬件反應時間
  77.          P0=dictate;            //將數據送入P0口,即寫入指令或地址
  78.          _nop_();
  79.          _nop_();
  80.          _nop_();
  81.          _nop_();               //空操作四個機器周期,給硬件反應時間
  82.          E=1;                   //E置高電平
  83.          _nop_();
  84.          _nop_();
  85.          _nop_();
  86.          _nop_();               //空操作四個機器周期,給硬件反應時間
  87.           E=0;                  //當E由高電平跳變成低電平時,液晶模塊開始執行命令
  88. }
  89. /*****************************************************
  90. 函數功能:指定字符顯示的實際地址
  91. 入口參數:x
  92. ***************************************************/
  93. void WriteAddress(unsigned char x)
  94. {
  95.      WriteInstruction(x|0x80); //顯示位置的確定方法規定為"80H+地址碼x"
  96. }
  97. /*****************************************************
  98. 函數功能:將數據(字符的標準ASCII碼)寫入液晶模塊
  99. 入口參數:y(為字符常量)
  100. ***************************************************/
  101. void WriteData(unsigned char y)
  102. {
  103.     while(BusyTest()==1);  
  104.           RS=1;           //RS為高電平,RW為低電平時,可以寫入數據
  105.           RW=0;
  106.           E=0;            //E置低電平(根據表8-6,寫指令時,E為高脈沖,
  107.                        // 就是讓E從0到1發生正跳變,所以應先置"0"
  108.           P0=y;           //將數據送入P0口,即將數據寫入液晶模塊
  109.           _nop_();
  110.           _nop_();
  111.            _nop_();
  112.      _nop_();       //空操作四個機器周期,給硬件反應時間
  113.           E=1;          //E置高電平
  114.           _nop_();
  115.           _nop_();
  116.           _nop_();
  117.          _nop_();        //空操作四個機器周期,給硬件反應時間
  118.          E=0;            //當E由高電平跳變成低電平時,液晶模塊開始執行命令
  119. }
  120. /*****************************************************
  121. 函數功能:對LCD的顯示模式進行初始化設置
  122. ***************************************************/
  123. void LcdInitiate(void)
  124. {
  125.    delay(15);             //延時15ms,首次寫指令時應給LCD一段較長的反應時間
  126.    WriteInstruction(0x38);  //顯示模式設置:16×2顯示,5×7點陣,8位數據接口
  127.         delay(5);   //延時5ms 
  128.         WriteInstruction(0x38);
  129.         delay(5);
  130.         WriteInstruction(0x38);
  131.         delay(5);
  132.         WriteInstruction(0x0c);  //顯示模式設置:顯示開,有光標,光標閃爍
  133.         delay(5);
  134.         WriteInstruction(0x06);  //顯示模式設置:光標右移,字符不移
  135.         delay(5);
  136.         WriteInstruction(0x01);  //清屏幕指令,將以前的顯示內容清除
  137.         delay(5);
  138. }

  139. unsigned long HX711_Read(void)        //增益128
  140. {
  141.         unsigned long count;
  142.         unsigned char i;
  143.           HX711_DOUT=1;
  144.                 Delay__hx711_us();
  145.           HX711_SCK=0;
  146.           count=0;
  147.           while(HX711_DOUT);
  148.           for(i=0;i<24;i++)                                
  149.         {
  150.                   HX711_SCK=1;
  151.                   count=count<<1;
  152.                         HX711_SCK=0;
  153.                   if(HX711_DOUT)
  154.                         count++;
  155.         }
  156.          HX711_SCK=1;
  157.     count=count^0x800000;//第25個脈沖下降沿來時,轉換數據
  158.         Delay__hx711_us();
  159.     HX711_SCK=0;
  160.    return(count);        
  161. }

  162. //****************************************************
  163. //獲取毛皮重量
  164. //****************************************************
  165. void Get_Maopi()
  166. {
  167.         Weight_Maopi = HX711_Read();        
  168. }

  169. //****************************************************
  170. //稱重
  171. //****************************************************
  172. void Get_Weight()
  173. {
  174.     unsigned char i;
  175.         Weight_Shiwu = HX711_Read();
  176.         Weight_Shiwu = Weight_Shiwu - Weight_Maopi;                //獲取凈重
  177.         if(Weight_Shiwu > 0)                        
  178.         {        
  179.         Weight_Shiwu = (unsigned int)((float)Weight_Shiwu/GapValue);         //計算實物的實際重量        
  180.    ge=Weight_Shiwu%10;
  181.    WriteAddress(0x4c);  
  182.    WriteData(digit[ge]);
  183.    shi=Weight_Shiwu/10%10;
  184.    WriteAddress(0x4b);  
  185.    WriteData(digit[shi]);
  186.    bai=Weight_Shiwu/100%10;
  187.    WriteAddress(0x4a);  
  188.    WriteData(digit[bai]);
  189.    qian=Weight_Shiwu/1000;
  190.    WriteAddress(0x49);  
  191.    WriteData(digit[qian]);

  192.         if(Weight_Shiwu > 5000)
  193.         {
  194.           while(1)
  195.           {
  196.             bz=~bz;
  197.                 delay(1);
  198.           }        
  199.         }
  200.           else
  201.           {
  202.             ;
  203.           }
  204.         }        
  205.         else
  206.         {
  207.       ;
  208.         }        
  209. }

  210. void main(void)            //主函數
  211. {
  212.     unsigned char i;
  213.         LcdInitiate();         //調用LCD初始化函數
  214.         WriteAddress(0x00);          //寫地址,從第1行第1列開始顯示        
  215.          i=0;              //從字符數組的第1個元素開始顯示
  216.          while(string[i]!='\0')   //只要沒有顯示到字符串的結束標志'\0',就繼續
  217.          {
  218.                  WriteData(string[i]); //將第i個字符數組元素寫入LCD
  219.                  i++;                 //指向下一個數組元素
  220.          }
  221.                  WriteAddress(0x4D);     //寫地址,將M顯示在第2行第16列
  222.             WriteData('g');        

  223.         Get_Maopi();                                //稱毛皮重量

  224.                 while(1)
  225.                 {
  226.                   EA=0;
  227.                   Get_Weight();
  228.                   EA=1;
  229.                 }                       
  230. }
復制代碼


/*--------------------------------------------------------------------------
INTRINS.H

Intrinsic functions for C51.
Copyright (c) 1988-2004 Keil Elektronik GmbH and Keil Software, Inc.
All rights reserved.
--------------------------------------------------------------------------*/

#ifndef __INTRINS_H__
#define __INTRINS_H__

extern void          _nop_     (void);
extern bit           _testbit_ (bit);
extern unsigned char _cror_    (unsigned char, unsigned char);
extern unsigned int  _iror_    (unsigned int,  unsigned char);
extern unsigned long _lror_    (unsigned long, unsigned char);
extern unsigned char _crol_    (unsigned char, unsigned char);
extern unsigned int  _irol_    (unsigned int,  unsigned char);
extern unsigned long _lrol_    (unsigned long, unsigned char);
extern unsigned char _chkfloat_(float);
extern void          _push_    (unsigned char _sfr);
extern void          _pop_     (unsigned char _sfr);

#endif




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

使用道具 舉報

沙發
ID:524818 發表于 2019-7-19 21:21 | 只看該作者
兩個開發板肯定線路上有區別,仔細比較一下應該能看出來
回復

使用道具 舉報

板凳
ID:96682 發表于 2019-7-19 23:04 | 只看該作者
移植程序到別的 51 單片機或開發板上可能需要修改原代碼
回復

使用道具 舉報

地板
ID:412580 發表于 2019-7-20 00:22 | 只看該作者
不是說換了開發板就不能用嗎 有沒有考慮過開發板的問題
回復

使用道具 舉報

5#
ID:452821 發表于 2019-7-20 07:17 | 只看該作者
附:我先問一下,這個稱重傳感器不初始化一下就是能用的嗎?
既然你之前的完全能用只是換了一塊開發板就不行了,但是這塊開發板也能顯示漢字什么的都是正常的,說明這塊開發板本身是壞的或者硬件連接大不一樣的可能性就很小了。所以我比較傾向于你可能是線接錯了,我掃了眼程序沒仔細看,發現了如while(HX711_DOUT);這樣的語句,這種寫法就會導致如果你的HX711_DOUT的值不正確你的程序就會一直卡在這里,自然也就沒有后面的顯示重量的部分。


回復

使用道具 舉報

6#
ID:465315 發表于 2019-7-20 08:22 | 只看該作者
應該是跳線帽接的有問題
回復

使用道具 舉報

7#
ID:586945 發表于 2019-7-20 08:50 | 只看該作者
兩塊開發板電路是一模一樣的?看看電路原理圖接線的區別
回復

使用道具 舉報

8#
ID:587195 發表于 2019-7-20 08:51 | 只看該作者
檢查另一個開發板,晶振、芯片是不是一樣
回復

使用道具 舉報

9#
ID:457495 發表于 2019-7-20 09:39 | 只看該作者
你看看開發板上的單片機是不是一樣的,60S2是有自帶ADC轉換模塊的,89c52是沒有的,你看看有沒有用到ADC轉換,還是你們自己用的ADC芯片,再看看線路,拿一字螺絲刀改一下灰度值。
回復

使用道具 舉報

10#
ID:285069 發表于 2019-7-20 10:44 | 只看該作者
檢查一下HX711的DATA_OUT接到開發板(P2.0),板上有接"上拉電阻"嗎?
HX711的DOUT是"開漏輸出"的;沒上拉電組,是沒訊號的.
回復

使用道具 舉報

11#
ID:584339 發表于 2019-7-20 11:00 | 只看該作者
尹子歸來 發表于 2019-7-20 07:17
附:我先問一下,這個稱重傳感器不初始化一下就是能用的嗎?
既然你之前的完全能用只是換了一塊開發板就不 ...

那么需要怎樣修改呢?
回復

使用道具 舉報

12#
ID:584339 發表于 2019-7-20 11:15 | 只看該作者
我么得感情 發表于 2019-7-20 09:39
你看看開發板上的單片機是不是一樣的,60S2是有自帶ADC轉換模塊的,89c52是沒有的,你看看有沒有用到ADC轉 ...

單片機用的是同一塊,開發板不同之處也修改了的,就是不知道為什么顯示重量哪里直接沒有了
回復

使用道具 舉報

13#
ID:584339 發表于 2019-7-20 11:20 | 只看該作者
277563114 發表于 2019-7-20 00:22
不是說換了開發板就不能用嗎 有沒有考慮過開發板的問題

考慮過了,并且把開發板上不同的參數都在源程序上修改了,只不過可能改的不完全
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲精品久久久一区二区三区 | 久久久久国产一区二区三区 | 日韩中文字幕av | 另类在线 | 日本欧美在线观看视频 | 成年人视频在线免费观看 | 超碰操| 欧美日一区二区 | 午夜一区二区三区在线观看 | 伊人欧美视频 | 亚州国产 | av色站| 久久午夜电影 | 一区二区在线免费观看 | 久久99精品久久久久久 | 日韩国产三区 | 亚洲天堂一区二区 | 中文字幕在线中文 | 欧美日韩一区二区在线观看 | 青青草网站在线观看 | 午夜视频在线免费观看 | 97久久精品午夜一区二区 | 久久国产精品精品 | 精品自拍视频在线观看 | 精品欧美一区二区精品久久久 | 欧美一区二区三区在线 | 欧日韩不卡在线视频 | 婷婷综合网 | 精品综合久久 | 中文字幕一区二区三区在线乱码 | 精品无码三级在线观看视频 | 久久大陆 | 国产目拍亚洲精品99久久精品 | 午夜免费福利片 | 99在线观看视频 | 日韩一二区| 久久丝袜视频 | 久久精品亚洲欧美日韩久久 | 一区二区视频在线观看 | 精品一区二区电影 | 97久久精品午夜一区二区 |