找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2864|回复: 9
打印 上一主题 下一主题
收起左侧

求助想用称重传感器实时重量来控制直流电机启停

[复制链接]
跳转到指定楼层
楼主
ID:910207 发表于 2021-9-6 17:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 ErniuSong 于 2021-9-10 18:27 编辑

求助 想用称重传感器实时重量 来控制直流电机启停,目前电机在单片机打开后会不停转,称重显示也对,但是不会根据实时重量启停

源码如下 我是哪里的问题呀?
9.10更新:目前加了发送数据函数及中断之后 LCD会显示 WIGHT = 0.0000KG但是压称重传感器 LCD显示还是0没有变化 电机在一直转。
  1. #include "main.h"
  2. #include <reg52.h>
  3. #include "LCD1602.h"
  4. #include "HX711.h"
  5. #include "EEPROM.H"
  6. #include "motor4.H"
  7. #include <stdio.h>
  8. #include <intrins.h>

  9. //定义变量
  10. #define uchar  unsigned char
  11. #define uint   unsigned int
  12. unsigned char KEY_NUM = 0;   //用来存放按键按下的键值
  13. unsigned long HX711_Buffer = 0;  //用来存放HX711读取出来的数据
  14. unsigned long Weight_Maopi = 0; //用来存放毛皮数据
  15. long Weight_Shiwu = 0;          //用来存放实物重量

  16. long Max_Value = 0;             //用来存放设置最大值
  17. char maxValueTable[4] = {1,0,0,0};
  18. unsigned char state = 0;    //用来存放设置状态
  19. unsigned char Blink_Speed = 0;
  20. typedef unsigned char u8;    //定义取值范围为0-255的数
  21. #define Blink_Speed_Max 6          //该值可以改变设置指针闪烁频率

  22. #define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};


  23. uchar data  RXDdata[ ] = {0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
  24.                           0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20 };
  25. uchar temp,buf,m,count,KZW;

  26. bit   playflag=0;



  27. void init_main()
  28. {
  29.   TMOD=0x20;                   //用定时器设置串口波特率           9600
  30.         TH1=0xfd;
  31.         TL1=0xfd;
  32.         TR1=1;
  33.         TI=1;
  34.         REN=1;          //串口初始化
  35.         SM0=0;
  36.         SM1=1;
  37.         EA=1;           //开启总中断
  38.         ES=1;
  39. }

  40. //校准参数
  41. //因为不同的传感器特性曲线不是很一致,因此,每一个传感器需要矫正这里这个参数才能使测量值很准确。
  42. //当发现测试出来的重量偏大时,增加该数值。
  43. //如果测试出来的重量偏小时,减小改数值。
  44. //该值可以为小数
  45. #define GapValue 3219.9

  46. //传感器最大测量值,单位是g
  47. #define AlarmValue 20000               

  48. //****************************************************
  49. //主函数
  50. //****************************************************
  51. void main()
  52. {
  53. //        unsigned char receiveData1,receiveData2,receiveData3,receiveData4;
  54.         double temp,te;
  55. //   chuankouinit();           //串口初始化
  56.         Init_LCD1602();                                                //初始化LCD1602

  57.         LCD1602_write_com(0x80);                        //设置LCD1602指针
  58.         LCD1602_write_word("Welcome to use!");
  59.        
  60.         Get_Maopi();
  61.         Get_Maopi();
  62.         Delay_ms(2000);                 //延时2s
  63.         Get_Maopi();
  64.         Get_Maopi();                                //称毛皮重量        //多次测量有利于HX711稳定
  65.     LCD1602_write_com(0x01);    //清屏
  66.     init_main();        //组态王通信程序初始化
  67.     while(1)
  68.         {
  69.         Get_Weight();       
  70. //                 Weight_Shiwu=39876;
  71.                 temp=(Weight_Shiwu/100+(Weight_Shiwu%100)*0.01);
  72.                 te=Weight_Shiwu;
  73.                 //显示当前重量
  74.                 LCD1602_write_com(0x80);
  75.         LCD1602_write_word("Weight=");
  76.                 LCD1602_write_data((Weight_Shiwu/10000)%10 + 0x30);
  77.                 LCD1602_write_data((Weight_Shiwu/1000)%10 + 0x30);
  78.                 LCD1602_write_data((Weight_Shiwu/100)%10 + 0x30);
  79.                 LCD1602_write_data('.');
  80.                 LCD1602_write_data((Weight_Shiwu/10)%10 + 0x30);
  81.                 LCD1602_write_data(Weight_Shiwu%10 + 0x30);                       
  82.                 LCD1602_write_word("K");
  83.             LCD1602_write_word("g");
  84.                         Delay_ms(1000);
  85.                 printf("%.3f\r\n", temp);
  86.                 printf("%.3f\r\n", te);
  87.         }
  88.        
  89. }



  90. //****************************************************
  91. //称重
  92. //****************************************************
  93. void Get_Weight()
  94. {
  95.         Weight_Shiwu = HX711_Read();
  96.         Delay_ms(10);
  97.        
  98.         Weight_Shiwu = Weight_Shiwu - Weight_Maopi;                //获取净重
  99.        
  100.         if(Weight_Shiwu >= 0 )                       
  101.         {       
  102.                 Weight_Shiwu = (unsigned long)((float)Weight_Shiwu/GapValue);         //计算实物的实际重量
  103.                
  104.         }
  105.         else
  106.         {
  107.                 Weight_Shiwu = 0;
  108.                 Delay_ms(2);
  109.                
  110.         }

  111. }

  112. //****************************************************
  113. //获取毛皮重量
  114. //****************************************************
  115. void Get_Maopi()
  116. {
  117.         Weight_Maopi = HX711_Read();
  118.         Delay_ms(2);

  119. }


  120. //****************************************************
  121. //MS延时函数(12M晶振下测试)
  122. //****************************************************
  123. void Delay_ms(unsigned int n)
  124. {
  125.         unsigned int  i,j;
  126.         for(i=0;i<n;i++)
  127.                 for(j=0;j<123;j++);
  128. }



  129. /*********************************************************

  130.   发送数据函数;目前加了发送数据函数及中断之后 LCD会显示 WIGHT = 0.0000KG但是压称重传感器 LCD显示还是0没有变化 电机在一直转。


  131. *********************************************************/
  132. //void senddata(uchar dat)
  133. //{
  134. //     SBUF =dat;
  135. //     while(!TI);
  136. //     TI = 0;
  137. //}




  138. /*********************************************************

  139.   串行中断服务函数//
  140. *********************************************************/
  141. //void  serial() interrupt 4
  142. //{
  143. //   ES = 0;                //关闭串行中断
  144. //   RI = 0;                //清除串行接受标志位
  145. //   buf = SBUF;            //从串口缓冲区取得数据
  146. //     
  147. //   switch(buf)
  148. //   {
  149. //      case '!':  senddata(buf);break; //接受到1,发送字符'T'给计算机         
  150. //      case '?':  senddata(buf);break;//接受到2,发送字符'X'给计算机                       
  151. //      default:    senddata('X');break;  //接受到其它数据,将其发送给计算机         
  152. //   }


  153. //   ES = 1;    //允许串口中断
  154. //}







  155. //****************************************************
  156. //推料电机
  157. //****************************************************

  158. void zhongliangjiance()  /*重量检测*/
  159. {
  160.         if(Weight_Shiwu <=3000)/* 需要推料,单位为g*/
  161.                 KZW='a';
  162.         if(Weight_Shiwu >3000)/* 无需推料 */
  163.                 KZW='b';
  164. }

  165. void TL()
  166. {
  167.    EN4=1;         //推料,电机运转
  168. }
  169. void BT()
  170. {
  171.    EN4=0;         //不推料
  172. }

  173. void motor4()
  174. {
  175. while(1)        
  176.     {
  177.       zhongliangjiance();
  178.                         TL();
  179.                         Delay_ms(5);

  180.                 BT();
  181.                         Delay_ms(5);

  182.                
  183.                         temp =KZW;
  184.                                 Delay_ms(2);

  185.        if(count<16)
  186.        {         
  187.          RXDdata[count]=KZW;
  188.          count++;
  189.                  if(count>1)
  190.                          playflag=1;
  191.              }
  192.                                          Delay_ms(5);
  193.       play();

  194.     }

  195. }





  196. //void motor4()
  197. //{
  198. ////        u8 i;
  199. ////        EN4=0;
  200. //        if(Weight_Shiwu >= 1000)               
  201. //        {
  202. //               
  203. //                LCD1602_write_com(0x80+0x40+8);//写在第二行
  204. //          LCD1602_write_word("A");
  205. //        }
  206. //        else
  207. //        {
  208. ////                if(Weight_Shiwu==0)
  209. ////                                        LCD1602_write_com(0x80+0x40+8);//写在第二行
  210. ////                LCD1602_write_word("B");
  211. ////                else if(Weight_Shiwu<500)
  212. //                LCD1602_write_com(0x80+0x40+8);//写在第二行
  213. //                LCD1602_write_word("C");
  214. //                Display_Weight();
  215. //        }  
  216. //    EN4 = (3<= Weight_Shiwu) && (Weight_Shiwu < 7);
  217. //      
  218. //}




  219. //void tuiliaodianji()
  220. //{
  221. //        EN4 = 0;
  222. //        Weight_Shiwu = HX711_Read();
  223. //        if (Weight_Shiwu <=50)
  224. //        {
  225. //                u8 i;
  226. //        for (i=0;i<100;i++)
  227. //                {
  228. //             EN4 = 1;
  229. //                        //LCD1602_write_word("A");

  230. //                   Delay_ms(3000);
  231. //                }
  232. //         if (Weight_Shiwu >=50)
  233. //                   EN4 = 0 ;
  234. //        }
  235. //   else
  236. //         {
  237. //          EN4 = 0 ;
  238. //        // LCD1602_write_word("B");

  239. //         }
  240. //          
  241. //}

  242. //void ShowChar()
  243. //{
  244. // //{static bit Run_Flag;
  245. //   if (Weight_Shiwu <= 1)
  246. //  {
  247. //   //     u8 i;
  248. //     //                   if(!Run_Flag)
  249. //                //    {
  250. //    //    for (i=0; i<100; i++)
  251. //      //  {
  252. //           // EN4 = 1;
  253. //                        LCD_Init();
  254. //    LCD1602_ShowChar(2,3,"A");

  255. //         Delay_ms(3000);
  256. //     }
  257. //  //      if (Weight_Shiwu >=50)
  258. //         //EN4 = 0 ;
  259. //              //                  Run_Flag = 1;
  260. //   //                     }
  261. //   // }
  262. //   else
  263. //  {
  264. //   //  EN4 = 0 ;
  265. //                LCD_Init();
  266. //      LCD1602_ShowChar(2,3,"B");
  267. //            //             Run_Flag = 0;
  268. //  }
  269. ////}



复制代码




分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:161164 发表于 2021-9-6 19:11 | 只看该作者
没注释,不知道什么时候想启,什么时侯想停
纯推理一下
  1. void tuiliaodianji()
  2. {static bit Run_Flag;
  3.     if (Weight_Shiwu <=50)
  4.     {
  5.         u8 i;
  6.                         if(!Run_Flag)
  7.                         {
  8.         for (i=0; i<100; i++)
  9.         {
  10.             EN4 = 1;
  11.             //LCD1602_write_word("A");

  12.             Delay_ms(3000);
  13.         }
  14.         //if (Weight_Shiwu >=50)
  15.         //    EN4 = 0 ;
  16.                                 Run_Flag = 1;
  17.                         }
  18.     }
  19.     else
  20.     {
  21.         EN4 = 0 ;
  22.         // LCD1602_write_word("B");
  23.                                 Run_Flag = 0;
  24.     }
  25. }
复制代码
回复

使用道具 举报

板凳
ID:910207 发表于 2021-9-6 19:21 | 只看该作者
lkc8210 发表于 2021-9-6 19:11
没注释,不知道什么时候想启,什么时侯想停
纯推理一下

您好 是想在称重传感器显示比如3kg时开始运转 显示7kg时电机停
回复

使用道具 举报

地板
ID:420836 发表于 2021-9-7 08:26 | 只看该作者
代码中,重量检测的IF语句被注释了。
回复

使用道具 举报

5#
ID:161164 发表于 2021-9-7 22:10 | 只看该作者
ErniuSong 发表于 2021-9-6 19:21
您好 是想在称重传感器显示比如3kg时开始运转 显示7kg时电机停

void tuiliaodianji()
{
    EN4 = (3<= Weight_Shiwu) && (Weight_Shiwu < 7);
        //不知道是高电平启动还是低电平启动,就当是高电平启动吧
        //不知道是Weight_Shiwu的单位是什么,就当是kg吧
}
回复

使用道具 举报

6#
ID:910207 发表于 2021-9-8 10:11 | 只看该作者
TTQ001 发表于 2021-9-7 08:26
代码中,重量检测的IF语句被注释了。

您好,取消注释还是一样不行
回复

使用道具 举报

7#
ID:910207 发表于 2021-9-8 17:31 | 只看该作者
lkc8210 发表于 2021-9-7 22:10
void tuiliaodianji()
{
    EN4 = (3

您好 ,编译没问题但是还是 没有在3kg时开始转 电机还是一直再转
回复

使用道具 举报

8#
ID:161164 发表于 2021-9-8 17:46 来自触屏版 | 只看该作者
ErniuSong 发表于 2021-9-8 17:31
您好 ,编译没问题但是还是 没有在3kg时开始转 电机还是一直再转

把你改好的代码放上来吧~
再加一些注释,如高低电平的含意,模拟量的单位等
回复

使用道具 举报

9#
ID:910207 发表于 2021-9-10 18:28 | 只看该作者
lkc8210 发表于 2021-9-8 17:46
把你改好的代码放上来吧~
再加一些注释,如高低电平的含意,模拟量的单位等

您好 已经放上去啦,麻烦您帮忙看看,谢谢您。
回复

使用道具 举报

10#
ID:851629 发表于 2022-3-17 14:18 | 只看该作者
lkc8210 发表于 2021-9-6 19:11
没注释,不知道什么时候想启,什么时侯想停
纯推理一下


代码中,重量检测的IF语句被注释了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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