10092-基于单片机的称重控制-玉米播种机压实度控制装置设计(PCB+原理图+源代码工程+详细介绍说明书)
功能描述:
玉米播种机压实度控制装置设计的运行过程主要包括数据采集、数据处理等环节。在数据采集环节中,系统通过压力传感器监测压力,并将采集到的压力信号转换为数字信号,传输到单片机中进行处理和存储。在数据处理环节中,系统对采集到的压力信号进行数据处理和算法运算,以获得更加准确压力数据,并对其进行存储和显示。当测试到的压力低于阈值时电机运行进行压实。压实到设置值±10%时停止。
1、在设定重量范围内±10%电机不转动
2、小于设定阈值重量范围±10%电机左转动
3、大于设定阈值重量范围±10%电机右转动
资料摘要:
本论文旨在设计一种基于单片机的玉米播种机压实度控制装置,以提高播种效率和作物产量。通过综合分析土壤特性、作物生长需求和机械结构,设计了一种能够精确控制土壤压实度的装置方案。在硬件设计方面,采用了称重测力传感器模块、执行机构和单片机控制电机运转模块等部分,通过设计合适的电路实现了装置的功能。在软件设计方面,开发了嵌入式软件,实现了单片机控制模块的功能,包括控制算法的编写、数据处理和通信协议的实现等,通过仿真验证,并进行了实物测试,验证了设计方案的可行性和性能。实验结果表明,设计的玉米播种机压实度控制装置能够有效提高播种效率和作物产量。本研究为玉米生产提供了一种新的技术手段和解决方案,具有一定的理论和实际应用价值。
资料包含:
1、详细设计说明书-16741字
2、仿真工程文件
3、原理图工程文件-PCB工程文件
4、源代码工程文件
5、物料清单excel
6、实物图片
#include "common.h"
#include "lcd1602.h"
#include "hx711.h"
#include "dht.h"
#include "StepMotor.h"
#include "eeprom52.h"
#include "filter.h"
#define u8 unsigned char
//定义量程系数
#define RATIO 0.00408 //这是一个修正系数,例如100g砝码称出来是245g,则RATIO为100/245=0.408。这里取0.00408是为了把重量缩小100倍;
//称重用变量
unsigned long idata FullScale; //满量程AD值/1000
unsigned long AdVal; //AD采样值
unsigned long idata weight; //重量值,单位g
sbit KEY1 = P3^5;//加
sbit KEY2 = P3^4;//减
sbit KEY3 = P3^6;
sbit KEY4 = P3^7;
#define KEY1_PRESS 1
#define KEY2_PRESS 2
#define KEY3_PRESS 3
#define KEY4_PRESS 4
unsigned int weight_L = 2250,weight_H = 2750,yuzhi_weight = 2500;//
bit open_flag = 0;//开启电机标志
unsigned char check = 0;//校验
/*******************************************************************************
* 函 数 名 : KEY_Scan
* 函数功能 : 按键扫描检测
* 输 入 : mode=0:单次按下按键
mode=1:连续按下按键
* 输 出 : 0:未有按键按下
KEY_UP_PRESS:KEY_UP键按下
KEY0_PRESS:KEY0键按下
KEY1_PRESS:KEY1键按下
KEY2_PRESS:KEY2键按下
*******************************************************************************/
u8 KEY_Scan(u8 mode)
{
static u8 key=1;
if(mode==1) //连续按键按下
key=1;
if(key==1&&(KEY1==0||KEY2==0||KEY3==0||KEY4==0)) //任意一个按键按下
{
delay_ms(1); //消抖
key=0;
if(KEY1==0)
return KEY1_PRESS;
else if(KEY2==0)
return KEY2_PRESS;
else if(KEY3==0)
return KEY3_PRESS;
else if(KEY4==0)
return KEY4_PRESS;
}
else if(KEY1==1&&KEY2==1&&KEY3==1&&KEY4==1) //无按键按下
key=1;
return 0;
}
//系统数据设置
void sys_data_set(void)
{
u8 key=0;
static u8 oneflag=0;
key=KEY_Scan(0);
//模式设置
if(key==KEY1_PRESS)
{
yuzhi_weight = yuzhi_weight - 100;
weight_L = yuzhi_weight * 0.9;
weight_H = yuzhi_weight * 1.1;
lcd_write_char(3,1,yuzhi_weight/1000%10+0x30);
lcd_write_char(5,1,yuzhi_weight%1000/100+0x30);
lcd_write_char(6,1,yuzhi_weight%100/10+0x30);
lcd_write_char(7,1,yuzhi_weight%10+0x30);
}
if(key==KEY2_PRESS)
{
yuzhi_weight = yuzhi_weight + 100;
weight_L = yuzhi_weight * 0.9;
weight_H = yuzhi_weight * 1.1;
lcd_write_char(3,1,yuzhi_weight/1000%10+0x30);
lcd_write_char(5,1,yuzhi_weight%1000/100+0x30);
lcd_write_char(6,1,yuzhi_weight%100/10+0x30);
lcd_write_char(7,1,yuzhi_weight%10+0x30);
}
}
void Timer_Init()//定时器1初始化
{
TMOD |= 0x01;//开启定时器0,工作方式1
TL0 = 0x00;//11.0592M晶振,定时50ms
TH0 = 0x4C;
ET0 = 1;//允许中断0打开
TR0 = 1;//定时器0开启
EA = 1;//打开总中断
}
void get_weight(void) //获取重量
{
volatile unsigned long cur_adc_value = 0;
cur_adc_value = ReadCount();//读取HX711的AD值
if (cur_adc_value <= FullScale)
{
weight = 0;//等于0
}
else
{
cur_adc_value = cur_adc_value - FullScale;//获取净重
if (cur_adc_value > 55)//55只是一个微动值的判定,因为HX711是一款24位高精度的AD芯片,一般很微小的值也能感应到
{
if (cur_adc_value % 100 >= 55)//余数大于55,也就是说这个数值必须大于等于155才执行这里
{
//把cur_adc_value值以55为基准进行取舍,假如cur_adc_value=257,则这里我们取整为300。再假如cur_adc_value=240,则我们取整200
cur_adc_value = cur_adc_value + (100 - (cur_adc_value % 100));
}
else
{
//把cur_adc_value值以55为基准进行取舍,假如cur_adc_value=89,则这里我们取整为100。再假如cur_adc_value=40,则我们取整0
cur_adc_value = cur_adc_value - (cur_adc_value % 100);
}
}
else
{
cur_adc_value = 0;
}
weight = cur_adc_value * RATIO;//乘上RATIO系数,得到正确的重量值
}
weight = weight_value_filter(weight);//重量值滤波。让重量值更稳定
}
//重新找回零点,每次测量前调用
void To_Zero()
{
FullScale=ReadCount();//读取hx711的AD值
}
//********************************************************* END ***********************************************************
//*************************************************************************************************************************
void display_weight()//显示重量函数
{
lcd_write_char(3,0,weight/1000%10+0x30);
lcd_write_char(5,0,weight%1000/100+0x30);
lcd_write_char(6,0,weight%100/10+0x30);
lcd_write_char(7,0,weight%10+0x30);
lcd_write_char(3,1,yuzhi_weight/1000%10+0x30);
lcd_write_char(5,1,yuzhi_weight%1000/100+0x30);
lcd_write_char(6,1,yuzhi_weight%100/10+0x30);
lcd_write_char(7,1,yuzhi_weight%10+0x30);
}
void main()
{
unsigned int count,dj_count;
short temperature;//温度
short humidity;//湿度
bit flag = 0;
lcd_init();//1602初始化
Timer_Init();//定时器初始化
To_Zero();//找回零点
lcd_write_str(0,0,"W: . kg ");//第一行显示的内容
lcd_write_str(0,1,"S: . kg");//第二行显示的内容
while(1)
{
sys_data_set();
get_weight();//获取重量
display_weight();//显示重量
if(weight < weight_L )
{
lcd_write_str(11,1,"Left ");
MotorCW();
}
if(weight > weight_H )
{
lcd_write_str(11,1,"Right");
MotorCCW();
}
if (weight >=weight_L && weight<=weight_H)
{
lcd_write_str(11,1,"Stop");
MotorStop();
}
}
}