历史上的今天
返回首页

历史上的今天

今天是:2025年02月24日(星期一)

正在发生

2020年02月24日 | 称重传感器HX711+lcd12864

2020-02-24 来源:51hei

程序分为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();


}

推荐阅读

史海拾趣

EM Devices Corporation公司的发展小趣事

EM Devices Corporation始终将产品质量放在首位。公司建立了一套严格的质量管理体系,对生产过程中的每一个环节都进行严格的监控和检测。同时,公司还不断引入先进的生产设备和工艺,提高产品的生产效率和质量。此外,公司还鼓励员工提出改进意见和建议,以便及时发现并解决问题。这种持续改进的精神使得EM Devices Corporation的产品在市场上始终保持着良好的口碑。

圣邦微电子(Fangtek)公司的发展小趣事

在产品研发取得突破的同时,EM Devices Corporation也积极拓展市场,寻求与国际企业的合作。公司参加了多个国际电子展,展示了自己的产品和技术实力。通过与国外企业的交流与合作,公司不仅获得了更多的市场机会,还学习到了先进的生产和管理经验。这些经验为公司后续的发展奠定了坚实的基础。

CONTTEK Group GmbH公司的发展小趣事

随着市场竞争的加剧,CONTTEK Group GmbH公司意识到只有不断创新才能在行业中立足。因此,公司加大了对研发的投入,积极引进新技术、新材料和新工艺,不断推动产品的升级换代。通过持续的技术创新,公司成功推出了一系列具有创新性和竞争力的新产品,进一步巩固了其在电子连接器领域的领先地位。

B&F Fastener Supply公司的发展小趣事

随着全球电子市场的不断扩大,B&F Fastener Supply公司开始将目光投向海外市场。公司积极开拓国际市场,与多个国家和地区的电子企业建立合作关系。同时,B&F还加大了对海外市场的投入力度,通过设立海外分支机构、参加国际展会等方式提升品牌知名度和市场份额。

这些故事虽然基于假设和推测,但试图展现了B&F Fastener Supply公司在电子行业中的可能发展历程。请注意,这些故事并非真实事件,仅用于说明公司在电子行业发展的可能性和方向。

复旦微电子(FM)公司的发展小趣事

随着全球电子市场的不断扩大,B&F Fastener Supply公司开始将目光投向海外市场。公司积极开拓国际市场,与多个国家和地区的电子企业建立合作关系。同时,B&F还加大了对海外市场的投入力度,通过设立海外分支机构、参加国际展会等方式提升品牌知名度和市场份额。

这些故事虽然基于假设和推测,但试图展现了B&F Fastener Supply公司在电子行业中的可能发展历程。请注意,这些故事并非真实事件,仅用于说明公司在电子行业发展的可能性和方向。

登丰微(GSTEK)公司的发展小趣事

歌普电子始终将产品质量视为企业的生命线。公司采用精细化管理模式,并严格执行ISO9001质量管理体系,确保每一件产品都达到高标准。同时,歌普的产品还通过了UL、CSA、TUV等国际安全认证及RoHS2.0、REACH欧盟绿色环保检测,进一步证明了其产品的可靠性和环保性。这些努力使得歌普在市场上获得了广泛的认可,与众多知名企业建立了长期稳定的合作关系。

问答坊 | AI 解惑

avr单片机入门

avr单片机入门资料…

查看全部问答>

Stellaris单片机相关安装软件下载

[ 本帖最后由 chenzhufly 于 2010-3-15 18:35 编辑 ]…

查看全部问答>

点阵电子显示屏

本帖最后由 paulhyde 于 2014-9-15 09:22 编辑  …

查看全部问答>

为什么我在WINCE6上用Direct播放视频,只能播放WMV,不能播放MPG,AVI

大家好,我遇到个问题,我在ARM9的2440平台上,WINCE5上,就可以直接用Direct播放,WMV,AVI,MPG,可是,换成,ARM11的机子上,再用同样代码,在WINCE6.0上,就只能播放WMV,而且特别卡,MPG,和AVI播的时候没反映…

查看全部问答>

wince 阿拉伯语言系统

ce 5.0, 在platform settings->locale相应地方选中阿拉伯语,并添加阿拉伯字体。可编译出来的系统是英文,为什么呢?…

查看全部问答>

如何写AT88SC0104加密芯片的驱动

我在S3C2410开发板上开发AT88SC0104的驱动程序时,无法向配置区中写入数据.对命令(command,addr1,addr2,NumOfData,data)不太了解,数据总是存放在以0x00开始的地址,后一个地址会把第一个地址覆盖掉. 根据I2C协议(Addr,data),写入数据时,第一个为地址, ...…

查看全部问答>

DDK编译驱动,不识别头文件定义的自数据类型

两个文件: try.c try.h source: TARGETNAME=try TARGETPATH=obj TARGETTYPE=DRIVER DRIVERTYPE=WDM INCLUDES=$(XPBASE)inc\\ddk\\wdm\\wxp SOURCES=try.c --------------- DDKXP 2600 采用命令行编译,在程序目录下,build 报错,都是 ...…

查看全部问答>

倾囊求助 s3c44B0x 板子问题

前一段时间买了个s3c44B0的板子,用了没几次就不行了,上电后串口没有任何打印信息 附带的资料说是正常情况上电后 应该 d1 d2 d3依次闪烁,我的板子是它们一齐全亮了,重烧系统也不行。 com1 下面就是那三个灯 …

查看全部问答>

新手51串口接收的问题!!!!!

51串口每秒接收一组上位机数据,要求是如果这组数据是想要的就控制一个开关通断!想请教的是串口中断接收数据怎么才能很好的控制一个开关通断,开关平均500MS闭合一次!在接收中断函数里面写延时行不通!请教各位。。!…

查看全部问答>

到啦!哈哈!

我团购的板子到手啦!吼吼,小样,来,摸摸。…

查看全部问答>