本帖最后由 ErniuSong 于 2021-9-10 18:27 编辑
求助 想用称重传感器实时重量 来控制直流电机启停,目前电机在单片机打开后会不停转,称重显示也对,但是不会根据实时重量启停
源码如下 我是哪里的问题呀?
9.10更新:目前加了发送数据函数及中断之后 LCD会显示 WIGHT = 0.0000KG但是压称重传感器 LCD显示还是0没有变化 电机在一直转。
- #include "main.h"
- #include <reg52.h>
- #include "LCD1602.h"
- #include "HX711.h"
- #include "EEPROM.H"
- #include "motor4.H"
- #include <stdio.h>
- #include <intrins.h>
- //定义变量
- #define uchar unsigned char
- #define uint unsigned int
- unsigned char KEY_NUM = 0; //用来存放按键按下的键值
- unsigned long HX711_Buffer = 0; //用来存放HX711读取出来的数据
- unsigned long Weight_Maopi = 0; //用来存放毛皮数据
- long Weight_Shiwu = 0; //用来存放实物重量
- long Max_Value = 0; //用来存放设置最大值
- char maxValueTable[4] = {1,0,0,0};
- unsigned char state = 0; //用来存放设置状态
- unsigned char Blink_Speed = 0;
- typedef unsigned char u8; //定义取值范围为0-255的数
- #define Blink_Speed_Max 6 //该值可以改变设置指针闪烁频率
- #define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
- uchar data RXDdata[ ] = {0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
- 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20 };
- uchar temp,buf,m,count,KZW;
- bit playflag=0;
- void init_main()
- {
- TMOD=0x20; //用定时器设置串口波特率 9600
- TH1=0xfd;
- TL1=0xfd;
- TR1=1;
- TI=1;
- REN=1; //串口初始化
- SM0=0;
- SM1=1;
- EA=1; //开启总中断
- ES=1;
- }
- //校准参数
- //因为不同的传感器特性曲线不是很一致,因此,每一个传感器需要矫正这里这个参数才能使测量值很准确。
- //当发现测试出来的重量偏大时,增加该数值。
- //如果测试出来的重量偏小时,减小改数值。
- //该值可以为小数
- #define GapValue 3219.9
- //传感器最大测量值,单位是g
- #define AlarmValue 20000
- //****************************************************
- //主函数
- //****************************************************
- void main()
- {
- // unsigned char receiveData1,receiveData2,receiveData3,receiveData4;
- double temp,te;
- // chuankouinit(); //串口初始化
- Init_LCD1602(); //初始化LCD1602
- LCD1602_write_com(0x80); //设置LCD1602指针
- LCD1602_write_word("Welcome to use!");
-
- Get_Maopi();
- Get_Maopi();
- Delay_ms(2000); //延时2s
- Get_Maopi();
- Get_Maopi(); //称毛皮重量 //多次测量有利于HX711稳定
- LCD1602_write_com(0x01); //清屏
- init_main(); //组态王通信程序初始化
- while(1)
- {
- Get_Weight();
- // Weight_Shiwu=39876;
- temp=(Weight_Shiwu/100+(Weight_Shiwu%100)*0.01);
- te=Weight_Shiwu;
- //显示当前重量
- LCD1602_write_com(0x80);
- LCD1602_write_word("Weight=");
- LCD1602_write_data((Weight_Shiwu/10000)%10 + 0x30);
- LCD1602_write_data((Weight_Shiwu/1000)%10 + 0x30);
- LCD1602_write_data((Weight_Shiwu/100)%10 + 0x30);
- LCD1602_write_data('.');
- LCD1602_write_data((Weight_Shiwu/10)%10 + 0x30);
- LCD1602_write_data(Weight_Shiwu%10 + 0x30);
- LCD1602_write_word("K");
- LCD1602_write_word("g");
- Delay_ms(1000);
- printf("%.3f\r\n", temp);
- printf("%.3f\r\n", te);
- }
-
- }
- //****************************************************
- //称重
- //****************************************************
- void Get_Weight()
- {
- Weight_Shiwu = HX711_Read();
- Delay_ms(10);
-
- Weight_Shiwu = Weight_Shiwu - Weight_Maopi; //获取净重
-
- if(Weight_Shiwu >= 0 )
- {
- Weight_Shiwu = (unsigned long)((float)Weight_Shiwu/GapValue); //计算实物的实际重量
-
- }
- else
- {
- Weight_Shiwu = 0;
- Delay_ms(2);
-
- }
- }
- //****************************************************
- //获取毛皮重量
- //****************************************************
- void Get_Maopi()
- {
- Weight_Maopi = HX711_Read();
- Delay_ms(2);
- }
- //****************************************************
- //MS延时函数(12M晶振下测试)
- //****************************************************
- void Delay_ms(unsigned int n)
- {
- unsigned int i,j;
- for(i=0;i<n;i++)
- for(j=0;j<123;j++);
- }
- /*********************************************************
- 发送数据函数;目前加了发送数据函数及中断之后 LCD会显示 WIGHT = 0.0000KG但是压称重传感器 LCD显示还是0没有变化 电机在一直转。
- *********************************************************/
- //void senddata(uchar dat)
- //{
- // SBUF =dat;
- // while(!TI);
- // TI = 0;
- //}
- /*********************************************************
- 串行中断服务函数//
- *********************************************************/
- //void serial() interrupt 4
- //{
- // ES = 0; //关闭串行中断
- // RI = 0; //清除串行接受标志位
- // buf = SBUF; //从串口缓冲区取得数据
- //
- // switch(buf)
- // {
- // case '!': senddata(buf);break; //接受到1,发送字符'T'给计算机
- // case '?': senddata(buf);break;//接受到2,发送字符'X'给计算机
- // default: senddata('X');break; //接受到其它数据,将其发送给计算机
- // }
- // ES = 1; //允许串口中断
- //}
- //****************************************************
- //推料电机
- //****************************************************
- void zhongliangjiance() /*重量检测*/
- {
- if(Weight_Shiwu <=3000)/* 需要推料,单位为g*/
- KZW='a';
- if(Weight_Shiwu >3000)/* 无需推料 */
- KZW='b';
- }
- void TL()
- {
- EN4=1; //推料,电机运转
- }
- void BT()
- {
- EN4=0; //不推料
- }
- void motor4()
- {
- while(1)
- {
- zhongliangjiance();
- TL();
- Delay_ms(5);
- BT();
- Delay_ms(5);
-
- temp =KZW;
- Delay_ms(2);
- if(count<16)
- {
- RXDdata[count]=KZW;
- count++;
- if(count>1)
- playflag=1;
- }
- Delay_ms(5);
- play();
- }
- }
- //void motor4()
- //{
- //// u8 i;
- //// EN4=0;
- // if(Weight_Shiwu >= 1000)
- // {
- //
- // LCD1602_write_com(0x80+0x40+8);//写在第二行
- // LCD1602_write_word("A");
- // }
- // else
- // {
- //// if(Weight_Shiwu==0)
- //// LCD1602_write_com(0x80+0x40+8);//写在第二行
- //// LCD1602_write_word("B");
- //// else if(Weight_Shiwu<500)
- // LCD1602_write_com(0x80+0x40+8);//写在第二行
- // LCD1602_write_word("C");
- // Display_Weight();
- // }
- // EN4 = (3<= Weight_Shiwu) && (Weight_Shiwu < 7);
- //
- //}
- //void tuiliaodianji()
- //{
- // EN4 = 0;
- // Weight_Shiwu = HX711_Read();
- // if (Weight_Shiwu <=50)
- // {
- // u8 i;
- // for (i=0;i<100;i++)
- // {
- // EN4 = 1;
- // //LCD1602_write_word("A");
- // Delay_ms(3000);
- // }
- // if (Weight_Shiwu >=50)
- // EN4 = 0 ;
- // }
- // else
- // {
- // EN4 = 0 ;
- // // LCD1602_write_word("B");
- // }
- //
- //}
- //void ShowChar()
- //{
- // //{static bit Run_Flag;
- // if (Weight_Shiwu <= 1)
- // {
- // // u8 i;
- // // if(!Run_Flag)
- // // {
- // // for (i=0; i<100; i++)
- // // {
- // // EN4 = 1;
- // LCD_Init();
- // LCD1602_ShowChar(2,3,"A");
- // Delay_ms(3000);
- // }
- // // if (Weight_Shiwu >=50)
- // //EN4 = 0 ;
- // // Run_Flag = 1;
- // // }
- // // }
- // else
- // {
- // // EN4 = 0 ;
- // LCD_Init();
- // LCD1602_ShowChar(2,3,"B");
- // // Run_Flag = 0;
- // }
- ////}
复制代码
|