基于51单片机的电子秤【HX711,手动价格,总价累积】(仿真)

基于51单片机的电子秤【HX711,手动价格,总价累积】(仿真)

给大家提供一些资料详细解释,有需要的自行提取,网盘地址我放在下面

 链接:https://pan.baidu.com/s/1NigBeujDZTCFL0hdMiu7yg?pwd=syxp 
提取码:syxp 

1、矩阵按键输入价格

2、具备累加功能,通过按键累加每次的商品价格

3、去皮功能。先将果皮放在托盘上,点击去皮以后系统会记录重量,后续称量其他物品将会自动扣除去皮重量

4、重量超过量程报警

#include <SHT11.h>
#include"intrins.h"
unsigned char sht_temp;			// 保存温度
unsigned char sht_humi;			// 保存湿度

typedef union              		//定义共用同类型
{
	unsigned int i;
	float f;
}value;

char ShtWriteByte(unsigned char value)
{
	unsigned char i,error=0;
	for(i=128;i>0;i>>=1)  // 高位为1,循环右移
	{
		if (i&value)
			Data_P=1;       	// 和要发送的数相与,结果为发送的位
		else
			Data_P=0;
		Sck_P=1;
		_nop_();						// 延时3us
		_nop_();
		_nop_();
		Sck_P=0;
	}
	Data_P=1;    					// 释放数据线
	Sck_P=1;
	error=Data_P;  				// 检查应答信号,确认通讯正常
	_nop_();
	_nop_();
	_nop_();
	Sck_P=0;
	Data_P=1;
	return error; 				// error=1 通讯错误
}

char ShtReadByte(unsigned char ack)
{
	unsigned char i,val=0;
	Data_P=1; 						// 释放数据线
	for(i=0x80;i>0;i>>=1)	// 高位为1,循环右移
	{
		Sck_P=1;
		if(Data_P)
			val=(val|i);    	// 读一位数据线的值
		Sck_P=0;
	}
	Data_P=!ack;    			// 如果是校验,读取完后结束通讯
	Sck_P=1;
	_nop_();							// 延时3us
	_nop_();
	_nop_();
	Sck_P=0;
	_nop_();
	_nop_();
	_nop_();
	Data_P=1; 						// 释放数据线
	return val;
}


void ShtTransStart(void)
{
	Data_P=1;
	Sck_P=0;
	_nop_();
	Sck_P=1;
	_nop_();
	Data_P=0;
	_nop_();
	Sck_P=0;
	_nop_();
	_nop_();
	_nop_();
	Sck_P=1;
	_nop_();
	Data_P=1;
	_nop_();
	Sck_P=0;
}

void ShtConnectReset(void)
{
	unsigned char i;
	Data_P=1; 		   		//准备
	Sck_P=0;
	for(i=0;i<9;i++)  	//DATA保持高,SCK时钟触发9次,发送启动传输,通迅即复位
	{
		Sck_P=1;
		Sck_P=0;
	}
	ShtTransStart();   	//启动传输
}

char ShtMeasure(unsigned char *p_value, unsigned char *p_checksum, unsigned char mode)
{
	unsigned error=0;
	unsigned int i;
	ShtTransStart();  		// 启动传输
	switch(mode)       		// 选择发送命令
	{
		case 1 :   					// 测量温度
			error+=ShtWriteByte(0x03);
			break;
		case 2 :   					// 测量湿度
			error+=ShtWriteByte(0x05);
			break;
		default:
			break;
	}
	for(i=0;i<65535;i++)
		if(Data_P==0)
			break;  					// 等待测量结束
		if(Data_P)
			error+=1;   			// 如果长时间数据线没有拉低,说明测量错误
	*(p_value) =ShtReadByte(1);  		// 读第一个字节,高字节 (MSB)
	*(p_value+1)=ShtReadByte(1); 		// 读第二个字节,低字节 (LSB)
	*p_checksum =ShtReadByte(0);  	// read CRC校验码
	return error;  									// error=1 通讯错误
}

void CalcSHT11(float *p_humidity ,float *p_temperature)
{
	const float C1=-4.0;	 			// 12位湿度精度 修正公式
	const float C2=+0.0405;			// 12位湿度精度 修正公式
	const float C3=-0.0000028;	// 12位湿度精度 修正公式
	const float T1=+0.01;	 			// 14位温度精度 5V条件 修正公式
	const float T2=+0.00008;	 	// 14位温度精度 5V条件 修正公式
	float rh=*p_humidity;	 			// rh: 12位 湿度
	float t=*p_temperature;			// t:  14位 温度
	float rh_lin;								// rh_lin: 湿度 linear值
	float rh_true;							// rh_true: 湿度 ture值
	float t_C;	 								// t_C : 温度 ℃
	t_C=t*0.01 - 40;	 					//补偿温度
	rh_lin=C3*rh*rh + C2*rh + C1;					//相对湿度非线性补偿
	rh_true=(t_C-25)*(T1+T2*rh)+rh_lin;		//相对湿度对于温度依赖性补偿
	*p_temperature=t_C;	 				//返回温度结果
	*p_humidity=rh_true;	 			//返回湿度结果
}

unsigned char TempCorrect(int temp)
{
	if(temp<0)	temp=0;
	if(temp>970)  temp=970;
	if(temp>235)  temp=temp+10;
	if(temp>555)  temp=temp+10;
	if(temp>875)  temp=temp+10;
	temp=(temp%1000)/10;
	return temp;
}

unsigned char HumiCorrect(unsigned int humi)
{
	if(humi>999)  humi=999;
	if((humi>490)&&(humi<951))  humi=humi-10;
	humi=(humi%1000)/10;
	return humi+4;
}

void ReadShtData()
{
	value humi_val,temp_val;  	// 定义两个共同体,一个用于湿度,一个用于温度
	unsigned char error;  							// 用于检验是否出现错误
	unsigned char checksum;  						// CRC
	unsigned int temp1,humi1;						// 临时读取到的温湿度数据

	error=0; 										//初始化error=0,即没有错误
	error+=ShtMeasure((unsigned char*)&temp_val.i,&checksum,1); 	//温度测量
	error+=ShtMeasure((unsigned char*)&humi_val.i,&checksum,2); 	//湿度测量

	if(error!=0) 		  					//如果发生错误,系统复位
		ShtConnectReset();
	else
	{
		humi_val.f=(float)humi_val.i; 				//转换为浮点数
		temp_val.f=(float)temp_val.i;  				//转换为浮点数
		CalcSHT11(&humi_val.f,&temp_val.f);  	//修正相对湿度及温度
		temp1=temp_val.f*10;
		sht_temp=TempCorrect(temp1);
		humi1=humi_val.f*10-50;
		sht_humi=HumiCorrect(humi1);
		humi1=humi1-1;
	}

}

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
1层PCB 85 x 80 mm FR-4、1.6 mm,1,带铅的HASL,绿色阻焊剂,白色丝印 一个简单的水检测器。它可以用作泄漏报警器等。它可以在9V电池上运行多年。 这是您可以自行构建的简单水检测器。它可用于许多应用,例如洗碗机和其他水设备的检漏仪,花园浇水箱已满的警报等。它仅使用基本组件(NPN晶体管,电阻器和陶瓷电容器),并使用9V电池运行数年。 电路操作 水检测器电路图如下所示。传感器是PCB上的图形,但螺丝孔也与传感器并联。当水到达传感器时,会有小电流流过。电流由Q2和Q1放大。R9确保当传感器上没有水时警报保持关闭状态。您可以通过增加R9来提高灵敏度,并通过降低R9来降低灵敏度。如果传感器短路,电阻R3将电流限制在安全水平。 晶体管Q3和Q3形成一个不稳定的多谐振荡器(振荡器)。频率由R10,R11,C4和C5确定,约为1 Hz。该振荡器的目的是提供间歇的蜂鸣声,比连续的声音更容易察觉。由于蜂鸣器仅在50%的时间内处于活动状态,因此还节省了一些电量。晶体管Q5提供更多的驱动电流,以向末级供电。 最后阶段是另一个振荡器。它的频率设置为ca。4 kHz以匹配压电测深仪B1的谐振频率。如果您使用其他类型的压电蜂鸣器,请检查数据表中的谐振频率!如果不是4 kHz,请调整R7,R8和/或C2,C3以获取正确的频率。压电元件将在很宽的频率范围内工作,但声音在共振频率上是最大的。压电元件不喜欢其上是否有恒定的直流电压,但是在此电路中这不是问题,因为当压电体不发出声音时,最终振荡器的电源会完全切断。 我设计了一个单面PCB,说它是单侧板,带有底部铜,底部阻焊层和顶部丝网印刷。否则,您可能会对此有其他疑问。Eagle设计文件可从附件下载 组件值也显示在上方的装配图中,并印刷在丝网上。BOM也在此页面上列出。组件值并不严格,但R7,R8,C2和C3的值应与指定值相匹配,以发出响亮的警报。 使用水检测器 这很简单。只需安装电池并用电缆扎带固定,然后将开发板放置在要监控的位置即可。有很多方法可以安装PCB: -使用M3支脚为电路板做“脚”,使其垂直站立,电池在顶部(请参见本页顶部右侧的图片)。支脚螺钉也可以用作传感器,因为螺钉孔与板背面的条纹传感器并联连接 -支座的不同用法显示在此页面顶部图像的左侧。在这种情况下,只有支座充当传感器。当水上升到条纹传感器区域时,整个电路会变湿,可能无法正常工作。为了增加灵敏度,您可以在支架的底部添加金属线或金属条。 -将PCB悬在顶部的孔中。例如在墙上用钉子钉。 -用焊料或螺丝将两个螺丝孔上的电线连接起来。然后,您可以将PCB放在干燥的地方,然后将电线铺设到要监视的位置。下图显示了浇水桶注满时的监控示例。我使用的是实心铜线,因此它们可以同时用作传感器和吊钩。 该项目中使用的物料清单 1 kohm轴向电阻2个 18 kohm轴向电阻 6个 1 Mohm轴向电阻 3个 10 nF径向陶瓷电容器 3个 470 nF径向陶瓷电容器 2个 2N4401晶体管TO92 7个 22毫米压电蜂鸣器 1个 9V电池卡扣连接器 1个 150毫米扎带 2个

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白茶丫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值