找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2954|回复: 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 单片机教程网

快速回复 返回顶部 返回列表