基于STC8G1K08A+hx711体重秤设计

之前写了一篇关于基于stm32+HX711的体重秤设计:http://t.csdnimg.cn/rjEzk

现在换一种更为简单的芯片STC8去读取传感器的数值。

1. STC8G1K08A单片机

选用STC8G1K08A单片机,用于数据处理和控制显示。单片机通过读取A/D转换器的输出值,计算并显示体重。选择低功耗微控制器,进行信号处理和控制。

STC8G单片机是深圳英科微电子生产的一款高性能8位单片机系列,具有较为丰富的外设和功能特性。关于STC8G单片机的一些基本特点:基于8051架构,运行频率可达30MHz。集成了标准的8051核心指令集,具备8位数据总线和16位地址总线。存储器:通常内置有较大的闪存和/或EEPROM,用于程序存储和数据存储。可扩展的外部存储器接口,如SRAM、EEPROM等。外设和接口:多种通用IO口,用于连接外部设备和传感器。定时器/计数器,用于精确的定时和PWM输出。UART、SPI、I2C等串行通信接口,用于与其他设备进行通信。功耗管理:支持多种低功耗模式,适合电池供电的应用。可以通过软件控制来调整工作模式,以最小化功耗。开发工具支持:提供了丰富的开发工具和软件支持,如编译器、调试器、仿真器等,便于开发人员进行软硬件开发和调试。

2. 电路图

其中使用了HX711传感器,还有TM1637数码管驱动器。和之前基于stm32+HX711的体重秤设计差不多,只不过这次是直接把模块直接焊到电路板上面了,数码管使用的是共阳极数码管。

其中电路图如下所示:

3. 程序设计

主程序:包括系统初始化、A/D数据读取、数据处理、显示控制等模块。

3.1 A/D转换读取

MCU与HX711转换器的通信。串口通讯线由管脚 PD_SCK 和 DOUT 组成,用来输出数据,选择输入通道和增益。当数据输出管脚 DOUT 为高电平时,表明A/D 转换器还未准备好输出数据,此时串口时钟输入信号 PD_SCK 应为低电平。当 DOUT 从高电平变低电平后,PD_SCK 应输入 25 至 27 个不等的时钟脉冲。其中第一个时钟脉冲的上升沿 将读出输出 24 位数据的最高位(MSB),直至第 24 个时钟脉冲完成,24 位输出数据从最高位至最低位逐位输出完成。第 25至 27 个时钟脉冲用来选择下一次 A/D 转换的输入通道和增益。

unsigned long Read_HX711(void) //CLK为25,输入通道A
{
    unsigned long count;    // unsigned long为4字节32个位二进制
    unsigned char i;
    	HX711_CLK = 0;
    count = 0;
   while(HX711_DATA);  // 等待DATA变低
    for (i = 0; i < 24; i++)   // 24
		{
		 Delay_us(1);
        HX711_CLK = 1;   // CLK变高,准备读取数据位
		 Delay_us(1);
        count = count << 1;  // 左移一个位,为下一个数据位腾出位置
        HX711_CLK = 0;   // CLK变低,在CLK的上升沿读取数据位
        if (HX711_DATA)
		   count++;
    }
    HX711_CLK = 1;     // 发送额外的脉冲,设定下一次读取的增益
    Delay_us(1);
		count = count ^ 0x800000; // 如果需要的话可以转换为负数
    HX711_CLK = 0;
    return (count);
}

3.2 数据处理

根据A/D转换器的输出值,通过校准算法计算体重,并考虑体重秤的自重等因素以提高测量精度。首先获取体重秤的初始重量,在一开始的时候减去。使用标准的重量多次测试校准,使用一次函数校准。当体重值小于一定数值时不显示数值,只有超过上限才显示。体重的变化小于0.5Kg体重秤稳定,当这会牺牲其精度。

weight = Get_Weight1();
		weight =  (weight*Value_k + Value_b)/100; 	//计算实物的实际重量
		if(weight > (weight1+20)) weight1 = weight; //只有当重量大于或小于之前2kg时才赋值					
		else if (weight < (weight1-20))  weight1 = weight;
		Print_display(weight1);
		if(weight1>100)  TM1637_DisplayInt(weight1);
		else  TM1637_off();

3.3 显示控制

 将计算得到的体重值显示在数码管上。TM1637的串行数据输入/输出,输入数据在 SLCK 的低电平变化,在SCLK 的高电平被传输,每传输一个字节芯片内部都将在第八个时钟下降沿产生一个 ACK。通过控制TM1637的显示寄存器地址和显示模式寄存器存储,可以将串行接口从外部器件传送到TM1637 的数据,其中寄存器地址00H-05H共6个字节单元,分别与芯片SGE和GRID管脚所接的LED灯对应。

/** 按从左到右的顺序显示, h 控制 ':', 1显示,0不显示 */
void TM1637_display(unsigned char a,unsigned char b,unsigned char c,unsigned char d,unsigned char h)
{
    TM1637_start();
    TM1637_Write(0x40);//写数据+自动地址加1+普通模式
    TM1637_ack();
    TM1637_stop();
    TM1637_start();
    TM1637_Write(0xc0);//设置显示首地址即第一个LED  c0
    TM1637_ack();

    TM1637_Write(tab[a]|h<<7);
    TM1637_ack();
    TM1637_Write(tab[b]|h<<7);//h为1时显示时钟中间的两点
    TM1637_ack();
    TM1637_Write(tab[c]|h<<7);
    TM1637_ack();
    TM1637_Write(tab[d]|h<<7);
    TM1637_ack();
    TM1637_stop();
    TM1637_start();
    TM1637_Write(0x8f);//开显示,2/16亮度   0x89
    TM1637_ack();
    TM1637_stop();
}

4. 测试

在实际调试时候有很多问题。首先接线很重要,因为接线错了数值一种为零读不到数值,接线在上次的基于stm32+HX711的体重秤设计介绍过了。还有数据变量如果是只int就会发生数据丢失,因为STC8G是16位单片机,int只有2位,在实际读取过程中你会发现数值到一定值后会往下掉,然后反复循环。这时候就要用long来增加位数。

4.1 接线问题

体重秤会有过零的时候,初始为负值比如0xff8e,加上一定重量后变成正数比如0x0081。如果只是将A-和A+接线翻转,结果只会使体重的数值由增长型变成递减型,并不会得到初始正值。这时候可以使E-和E+接线翻转,或者修改采样电阻将采样电阻R8换到A-那一边,当然这需要修改电路。这里采样电阻R8也影响到采样倍率,电阻值越大同样重量变化越小。

4.2 程序问题

在原始给的芯片资料是这样写的是24位,二进制补码输出,读取的时候使用count = count ^ 0x800000,将读到数值最高位异或1,这样如果数值为负数最高位为1,异或1就变成0,比如原来的0xff8e就会变成0x7f8e,当实际为正数时0x008e就会变成0x808e,怎么看都不对劲。

我可以使用软件转换一下:

/**
  * 名字: 制数转换函数 
  */
long int Hex_decimal (long int hex)
{
	long int abs_hex = hex & 0xFFFFFF;
	long decimal = 0;

	if(hex >> 23 == 1)  //如果是负数,则先取其绝对值,再转换为十进制,然后乘以-1
		{
			decimal = (abs_hex ^ 0xFFFFFF) + 1;
			decimal *= -1;
		} 
	else   // 如果是正数,直接转换为十进制
		{	
				decimal = hex;
		}
	return decimal;
}

4.3 读数问题

我在使用STC8G读取数值时出现一个很奇怪的事情到现在还没弄明白,使用STM32读取就不会出现这种问题。就是当第16位为1的时候,后面的16到24位全变成了1,也就是FF。我也查看了波形,还是没有找到原因在哪里。最后只能提高采样电阻的数值到200K欧姆,让变化达不到第16位,才勉强读到正确数值。

 

电路图和程序已经打包好了:https://download.csdn.net/download/zhenxixianzai00/89717778

码字不易您觉得有帮助谢谢点赞,有错误的地方也欢迎指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值