称重传感器HX711+lcd12864

发布者:花钱123最新更新时间:2020-02-24 来源: 51hei关键字:称重传感器  HX711  lcd12864 手机看文章 扫描二维码
随时随地手机看文章

程序分为main.c+HX711.c+HX711.h+lcd12864.c+lcd12864.h  


//lcd12864.h

#ifndef __lcd12864_H
#define __lcd12864_H
//---包含头文件---//
#include
//---重定义关键词---//
#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();


}

[1] [1]
关键字:称重传感器  HX711  lcd12864 引用地址:称重传感器HX711+lcd12864

上一篇:16*16LED点阵动态显示
下一篇:单片机粮仓温湿度控制系统

推荐阅读最新更新时间:2024-11-02 23:03

称重传感器技术参数基本定义
称重传感器技术参数基本定义: (1)额定载荷:传感器在规定技术指标范围内能够测量的最大轴向负荷。但实际使用时,一般只用额定量程的2/3~1/3。 (2)允许使用负荷(或称安全过载):称重传感器允许施加的最大轴向负荷。允许在一定范围内超负荷工作。一般为120%~150%。 (3)极限负荷(或称极限过载):称重传感器能承受的不使其丧失工作能力的最大轴向负荷。意即当工作超过此值时,传感器将会受到损坏。 (4)灵敏度: 输出增量与所加的负荷增量之比。通常每输入1V电压时额定输出的mV。 (5)非线性: 这是表征此传感器输出的电压信号与负荷之间对应关系的精确程度的参数。 (6)重复性: 重复性表征传感器在同一负荷在同样条件下反复施
[嵌入式]
LCD12864(KS0108)驱动程序 显示汉字-字符
仿真原理图如下 #include reg52.h #include intrins.h #include string.h #include hanzi.h //汉字库头文件 #include shuzi.h //字符库头文件 #define uchar unsigned char #define uint unsigned int // lcd12864(ks0108) #define LCD_DATA P2 //LCD8位并行数据口 sbit LCD_RS=P0^5; //寄存器选择 sbit LCD_RW=P0^6; //读/写选择 sbit LCD_EN=P0^7;
[单片机]
<font color='red'>LCD12864</font>(KS0108)驱动程序 显示汉字-字符
LCD12864液晶使用-ST7920
LCD12864液晶型号为ST7920,位带字库液晶,同时也有图形县显示区,具体操作请看手册,这里只是简单说下使用,本教程是串行使用方式,本教程实现了液晶的画图,显示字和自定义字功能。 第一幅图为画图效果,画了一幅图; 第二幅图为用自身字符库,写了一首诗; 第三幅图为用CGRAM,4个16*16用户自定义字拼出一个32*32的字; 一、DDRAM 使用内部字库,写入DDRAM,字体大小只能为16*16,对应整个屏幕 地址: X ----------------------------------- | | 80H,81H,82H,83H,84H,85H,86H,87H, |
[单片机]
<font color='red'>LCD12864</font>液晶使用-ST7920
51单片机+hx711电子秤
单片机源程序如下: #include reg52.h #include intrins.h #include string.h #include main.h #include LCD1602.h #include HX711.h #include eeprom52.h #define uchar unsigned char #define uint unsigned int unsigned long HX711_Buffer = 0; unsigned long Weight_Maopi = 0; unsigned long Weight_Maopi_0 = 0; long Weight_Shiwu =
[单片机]
51单片机+<font color='red'>hx711</font>电子秤
LCD12864简单菜单程序,八个按键带proteus仿真和程序
/**************************************************************************************** 简单菜单程序,八个按键.使用AVR单片机.2008/3/24--2008/3/29 编译器为ICCAVR7.14.晶振7.3728M,单片机为ATmega16(用ATmega32在proteus中仿真不成功!) *****************************************************************************************/ #include iom16v.h #include m
[单片机]
<font color='red'>LCD12864</font>简单菜单程序,八个按键带proteus仿真和程序
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved