找回密码
 立即注册

QQ登录

只需一步,快速开始

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

称重传感器HX711+lcd12864

  [复制链接]
跳转到指定楼层
楼主
ID:415912 发表于 2019-5-19 16:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  由于称重模块不是我们组负责的,我只知道个大概过程。负责称重程序的同学特地去实验室用砝码一个一个弄的,精度还有挺高的。
  程序分为main.c+HX711.c+HX711.h+lcd12864.c+lcd12864.h  


//lcd12864.h

#ifndef __lcd12864_H
#define __lcd12864_H
//---包含头文件---//
#include<reg52.h>
//---重定义关键词---//
#ifndef uchar
#define uchar unsigned char
#endif
#ifndef uint
#define uint unsigned int
#endif
//---如果使用画图模式定义这个---//
//#define LCD12864_PICTURE
//---定义使用的IO口---//
#define LCD12864_DATAPORT P0   //数据IO口
sbit LCD12864_RS  =  P2^6;             //(数据命令)寄存器选择输入
sbit LCD12864_RW  =  P2^5;             //液晶读/写控制
sbit LCD12864_EN  =  P2^7;             //液晶使能控制
sbit LCD12864_PSB =  P3^2;             //串/并方式控制
sbit LCD12864_RST =  P3^4;      //复位端

//---声明全局函数---//
void LCD12864_Delay1ms(uint c);
uchar LCD12864_Busy(void);
void LCD12864_WriteCmd(uchar cmd);
void LCD12864_WriteData(uchar dat);
void LCD12864_Init();
void LCD12864_ClearScreen(void);
void LCD12864_SetWindow(uchar x, uchar y);
#endif


//lcd12864.c
#include"lcd12864.h"
/*******************************************************************************
* 函 数 名         : LCD12864_Delay1ms
* 函数功能     : 延时1MS
* 输    入         : c
* 输    出         : 无
*******************************************************************************/
void LCD12864_Delay1ms(uint c)
{
    uchar a,b;
for(; c>0; c--)
{
     for(b=199; b>0; b--)
  {
         for(a=1; a>0; a--);
  }
}
}
/*******************************************************************************
* 函 数 名         : LCD12864_Busy
* 函数功能     : 检测LCD是否忙
* 输    入         : 无
* 输    出         : 1或0(1表示不忙,0表示忙)
*******************************************************************************/
uchar LCD12864_Busy(void)
{
uchar i = 0;
LCD12864_RS = 0;    //选择命令
LCD12864_RW = 1; //选择读取
LCD12864_EN = 1;
LCD12864_Delay1ms(1);
while((LCD12864_DATAPORT & 0x80) == 0x80) //检测读取到的值
{
  i++;
  if(i > 100)
  {
   LCD12864_EN = 0;
   return 0;    //超过等待时间返回0表示失败
  }
}
LCD12864_EN = 0;
return 1;
}
/*******************************************************************************
* 函 数 名         : LCD12864_WriteCmd
* 函数功能     : 写命令
* 输    入         : cmd
* 输    出         : 无
*******************************************************************************/
void LCD12864_WriteCmd(uchar cmd)
{
uchar i;
i = 0;
while( LCD12864_Busy() == 0)
{
  LCD12864_Delay1ms(1);
  i++;
  if( i>100)
  {
   return;    //超过等待退出
  }
}

LCD12864_RS = 0;     //选择命令
LCD12864_RW = 0;     //选择写入
LCD12864_EN = 0;     //初始化使能端
LCD12864_DATAPORT = cmd;   //放置数据
LCD12864_EN = 1;     //写时序
LCD12864_Delay1ms(5);
LCD12864_EN = 0;         
}
/*******************************************************************************
* 函 数 名         : LCD12864_WriteData
* 函数功能     : 写数据
* 输    入         : dat
* 输    出         : 无
*******************************************************************************/
void LCD12864_WriteData(uchar dat)
{
uchar i;
i = 0;
while( LCD12864_Busy() == 0)
{
  LCD12864_Delay1ms(1);
  i++;
  if( i>100)
  {
   return;    //超过等待退出
  }
}
LCD12864_RS = 1;     //选择数据
LCD12864_RW = 0;     //选择写入
LCD12864_EN = 0;     //初始化使能端
LCD12864_DATAPORT = dat;   //放置数据
LCD12864_EN = 1;     //写时序
LCD12864_Delay1ms(5);
LCD12864_EN = 0;            
}
/*******************************************************************************
* 函 数 名         : LCD12864_ReadData
* 函数功能     : 读取数据
* 输    入         : 无
* 输    出         : 读取到的8位数据
*******************************************************************************/
#ifdef LCD12864_PICTURE
uchar LCD12864_ReadData(void)
{
uchar i, readValue;
i = 0;
while( LCD12864_Busy() == 0)
{
  LCD12864_Delay1ms(1);
  i++;
  if( i>100)
  {
   return 0;    //超过等待退出
  }
}
LCD12864_RS = 1;       //选择命令
LCD12864_RW = 1;
LCD12864_EN = 0;
LCD12864_Delay1ms(1);  //等待
LCD12864_EN = 1;
LCD12864_Delay1ms(1);
readValue = LCD12864_DATAPORT;
LCD12864_EN = 0;
return readValue;
}
#endif
/*******************************************************************************
* 函 数 名         : LCD12864_Init
* 函数功能     : 初始化LCD12864
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void LCD12864_Init()
{
LCD12864_PSB = 1;   //选择并行输入
LCD12864_RST = 1;   //复位
LCD12864_WriteCmd(0x30);  //选择基本指令操作
LCD12864_WriteCmd(0x0c);  //显示开,关光标
LCD12864_WriteCmd(0x01);  //清除LCD12864的显示内容
}
/*******************************************************************************
* 函 数 名         : LCD12864_ClearScreen
* 函数功能     : 在画图模式下,LCD12864的01H命令不能清屏,所以要自己写一个清
*                  * 屏函数
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
#ifdef LCD12864_PICTURE
void LCD12864_ClearScreen(void)
{
uchar i,j;
LCD12864_WriteCmd(0x34);   //开启拓展指令集
for(i=0;i<32;i++)     //因为LCD有纵坐标32格所以写三十二次
{
  LCD12864_WriteCmd(0x80+i);    //先写入纵坐标Y的值
  LCD12864_WriteCmd(0x80);    //再写入横坐标X的值
  for(j=0;j<32;j++)    //横坐标有16位,每位写入两个字节的的数据,也
  {        //就写入32次以为当写入两个字节之后横坐标会自
   LCD12864_WriteData(0xFF);   //动加1,所以就不用再次写入地址了。
  }
}
LCD12864_WriteCmd(0x36);  //0x36扩展指令里面打开绘图显示
LCD12864_WriteCmd(0x30);  //恢复基本指令集
}
#endif
/*******************************************************************************
* 函 数 名         : LCD12864_SetWindow
* 函数功能     : 设置在基本指令模式下设置显示坐标。注意:x是设置行,y是设置列
* 输    入         : x, y
* 输    出         : 无
*******************************************************************************/
void LCD12864_SetWindow(uchar x, uchar y)
{
uchar pos;
if(x == 0)    // 第一行的地址是80H
{
  x = 0x80;
}
  
else if(x == 1)  //第二行的地址是90H
{
  x = 0x90;
}

else if(x == 2)  //第三行的地址是88H
{
  x = 0x88;
}

else if(x == 3)  //第三行的地址是98H
{
  x = 0x98;
}

pos = x + y;
LCD12864_WriteCmd(pos);
}




//HX711.h
#ifndef _HX711_H_
#define _HX711_H_
#include "reg52.h"
#define HXNOREAD 0XFFFF
sbit ADSK=P2^0;
sbit ADDO=P2^1;
#define ADSK_LOW        ADSK = 0
#define ADSK_HIGH       ADSK = 1
#ifndef u32
#define u32 unsigned long
#endif
#ifndef u16
#define u16 unsigned int
#endif
#ifndef u8
#define u8 unsigned char
#endif
////////////////////去噪后的均值滤波
#define WEILINE_LEN 10 //总缓冲点数
#define CUTHEAD_LEN 3  //去极大值点数
#define CUTLAST_LEN 3  //去极小值点数
#define USEDATA_LEN (WEILINE_LEN - CUTHEAD_LEN - CUTLAST_LEN) //均值点数
////////////////////
void Read_40HzInit(void);
unsigned long ReadCount(void);
void InsertSort(u16 pushdata, u16* avedata, u16 dst[], u8 len);
u16 HxAveDataRead(void);
#endif



//HX711.c
#include "HX711.H"
#define AveNum 5
unsigned long grabuffer[AveNum];
unsigned long ReadCount(void)
{
volatile unsigned long Count;
unsigned char i;
u16 noreadcount = 0;
ADSK_LOW;   //使能AD SCK置低
Count=0;
while(ADDO)  //AD转换未结束则等待
{
  noreadcount++;
  if(noreadcount > 100)
   return HXNOREAD;
}
for(i=0;i<24;i++)
{
  ADSK_HIGH;   //
  Count=Count<<1; //
  ADSK_LOW;   //
  if(ADDO) Count++;
}
ADSK_HIGH;
Count=Count^0x7FFFFF;
ADSK_LOW;
//////////////
ADSK_HIGH;
ADSK_LOW;
ADSK_HIGH;
ADSK_LOW;      
////////////
// Base_GData_temp = Count;
Count=Count/256;
return(Count);
}
void Read_40HzInit(void)
{
unsigned char i;

ADSK_LOW;   //使能AD(PD_SCK 置低)
while(ADDO);  //AD转换未结束则等待,否则开始读取
for(i=0;i<27;i++)
{
  ADSK_HIGH;   //PD_SCK 置高(发送脉冲)
  ADSK_LOW;   //PD_SCK 置低
}
ADSK_HIGH;
ADSK_LOW;
}
volatile short datasbuf[WEILINE_LEN];
void InsertSort(u16 pushdata, u16* avedata, u16 dst[], u8 len)
{
u16 i, j;
u32 buf, sum = 0;

///insert
for(i = 0; i < (len-1); i++)
{
  dst[i] = dst[i+1];
}
dst[len-1] = pushdata;
///sort
for(i = 0 ; i < len; i++)
  datasbuf[i] = dst[i];
for(i = len-1; i > 0; i--)
{
  for(j = 0; j < i; j++)
  {
   if(datasbuf[j] < datasbuf[j + 1])
   {
    buf = datasbuf[j+1];
    datasbuf[j+1] = datasbuf[j];
    datasbuf[j] = buf;
   }
  }
}
///get ave
for(i = CUTHEAD_LEN; i < (len- CUTLAST_LEN); i++)
{
  sum += datasbuf[i];
}
*avedata = sum/USEDATA_LEN;
}
static u16 AveData = 0;
u16 grafifo[WEILINE_LEN];
u16 HxAveDataRead(void)
{
u16 datatemp;
datatemp = ReadCount();
if(datatemp != HXNOREAD)
{
  InsertSort(datatemp, &AveData, grafifo, WEILINE_LEN);
}
return AveData;
}



//main.c
#include "reg52.h"    //此文件中定义了单片机的一些特殊功能寄存器
#include "lcd12864.h"
#include "HX711.H"

#ifndef u32
#define u32 unsigned long
#endif
#ifndef u16
#define u16 unsigned int
#endif
#ifndef u8
#define u8 unsigned char
#endif
sbit k8=P2^2;
u16 i=0;
unsigned char code  dis1[] ="重量:g";
u8 Disp[4];
u32 Dispcz=32810;
u32 WeightData = 0;
void Delay200ms()  //@11.0592MHz
{
unsigned char i, j, k;
i = 9;
j = 104;
k = 139;
do
{
  do
  {
   while (--k);
  } while (--j);
} while (--i);
}

/*******************************************************************************
* 函 数 名         : main
* 函数功能     : 主函数
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void chengzhong()
{
   WeightData = ((HxAveDataRead()-Dispcz)*1.3235);
    Disp[0]=WeightData%10000/1000/*+0x30*/;
Disp[1]=WeightData%10000%1000/100/*+0x30*/;
Disp[2]=WeightData%10000%1000%100/10/*+0x30*/;
Disp[3]=WeightData%10000%1000%100%10/*+0x30*/;
if(k8==0)
  {
    Dispcz=HxAveDataRead();
    Delay200ms();
  }
}
void XSCZ()
{
           LCD12864_SetWindow(0, 0);
   LCD12864_WriteData(dis1[0]);
   LCD12864_WriteData(dis1[1]);
   LCD12864_WriteData(dis1[2]);
   LCD12864_WriteData(dis1[3]);
   LCD12864_WriteData(dis1[4]);
   LCD12864_WriteData(Disp[0]+0x30);
   LCD12864_WriteData(Disp[1]+0x30);
   LCD12864_WriteData(Disp[2]+0x30);
   LCD12864_WriteData(Disp[3]+0x30);
   LCD12864_WriteData(dis1[5]);
  
chengzhong(); //数据处理函数  

}

void main(void)
{

  k8=1;
  LCD12864_Init();
while(1)
{
   XSCZ();

}
}



称重.zip

54.42 KB, 下载次数: 122, 下载积分: 黑币 -5

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

沙发
ID:531573 发表于 2019-5-23 15:11 | 只看该作者
dis()这个函数呢?
回复

使用道具 举报

板凳
ID:415912 发表于 2019-5-27 10:35 | 只看该作者

可以说的具体点吗?你说的是程序中的 dis1[]。还是说自定义函数?unsigned char code dis1[] 这个在主函数中
回复

使用道具 举报

地板
ID:596808 发表于 2019-8-9 11:46 | 只看该作者
有原理图吗?
回复

使用道具 举报

5#
ID:62514 发表于 2019-8-16 20:37 | 只看该作者
很好,学习了。
回复

使用道具 举报

6#
ID:525478 发表于 2019-8-17 10:06 | 只看该作者
有原理图吗  学习学习
回复

使用道具 举报

7#
ID:64765 发表于 2020-2-23 19:00 | 只看该作者
好资料,学习了。谢谢分享。
回复

使用道具 举报

8#
ID:110278 发表于 2020-2-24 12:11 | 只看该作者
很详细
回复

使用道具 举报

9#
ID:951299 发表于 2021-7-18 18:51 | 只看该作者
能不能解释下它称重的公式,有点看不懂
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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