久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6488|回復(fù): 8
打印 上一主題 下一主題
收起左側(cè)

稱重傳感器HX711+lcd12864

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:415912 發(fā)表于 2019-5-19 16:27 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
  由于稱重模塊不是我們組負(fù)責(zé)的,我只知道個(gè)大概過程。負(fù)責(zé)稱重程序的同學(xué)特地去實(shí)驗(yàn)室用砝碼一個(gè)一個(gè)弄的,精度還有挺高的。
  程序分為main.c+HX711.c+HX711.h+lcd12864.c+lcd12864.h  


//lcd12864.h

#ifndef __lcd12864_H
#define __lcd12864_H
//---包含頭文件---//
#include<reg52.h>
//---重定義關(guān)鍵詞---//
#ifndef uchar
#define uchar unsigned char
#endif
#ifndef uint
#define uint unsigned int
#endif
//---如果使用畫圖模式定義這個(gè)---//
//#define LCD12864_PICTURE
//---定義使用的IO口---//
#define LCD12864_DATAPORT P0   //數(shù)據(jù)IO口
sbit LCD12864_RS  =  P2^6;             //(數(shù)據(jù)命令)寄存器選擇輸入
sbit LCD12864_RW  =  P2^5;             //液晶讀/寫控制
sbit LCD12864_EN  =  P2^7;             //液晶使能控制
sbit LCD12864_PSB =  P3^2;             //串/并方式控制
sbit LCD12864_RST =  P3^4;      //復(fù)位端

//---聲明全局函數(shù)---//
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"
/*******************************************************************************
* 函 數(shù) 名         : LCD12864_Delay1ms
* 函數(shù)功能     : 延時(shí)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--);
  }
}
}
/*******************************************************************************
* 函 數(shù) 名         : LCD12864_Busy
* 函數(shù)功能     : 檢測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;    //超過等待時(shí)間返回0表示失敗
  }
}
LCD12864_EN = 0;
return 1;
}
/*******************************************************************************
* 函 數(shù) 名         : LCD12864_WriteCmd
* 函數(shù)功能     : 寫命令
* 輸    入         : 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;   //放置數(shù)據(jù)
LCD12864_EN = 1;     //寫時(shí)序
LCD12864_Delay1ms(5);
LCD12864_EN = 0;         
}
/*******************************************************************************
* 函 數(shù) 名         : LCD12864_WriteData
* 函數(shù)功能     : 寫數(shù)據(jù)
* 輸    入         : 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;     //選擇數(shù)據(jù)
LCD12864_RW = 0;     //選擇寫入
LCD12864_EN = 0;     //初始化使能端
LCD12864_DATAPORT = dat;   //放置數(shù)據(jù)
LCD12864_EN = 1;     //寫時(shí)序
LCD12864_Delay1ms(5);
LCD12864_EN = 0;            
}
/*******************************************************************************
* 函 數(shù) 名         : LCD12864_ReadData
* 函數(shù)功能     : 讀取數(shù)據(jù)
* 輸    入         : 無
* 輸    出         : 讀取到的8位數(shù)據(jù)
*******************************************************************************/
#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
/*******************************************************************************
* 函 數(shù) 名         : LCD12864_Init
* 函數(shù)功能     : 初始化LCD12864
* 輸    入         : 無
* 輸    出         : 無
*******************************************************************************/
void LCD12864_Init()
{
LCD12864_PSB = 1;   //選擇并行輸入
LCD12864_RST = 1;   //復(fù)位
LCD12864_WriteCmd(0x30);  //選擇基本指令操作
LCD12864_WriteCmd(0x0c);  //顯示開,關(guān)光標(biāo)
LCD12864_WriteCmd(0x01);  //清除LCD12864的顯示內(nèi)容
}
/*******************************************************************************
* 函 數(shù) 名         : LCD12864_ClearScreen
* 函數(shù)功能     : 在畫圖模式下,LCD12864的01H命令不能清屏,所以要自己寫一個(gè)清
*                  * 屏函數(shù)
* 輸    入         : 無
* 輸    出         : 無
*******************************************************************************/
#ifdef LCD12864_PICTURE
void LCD12864_ClearScreen(void)
{
uchar i,j;
LCD12864_WriteCmd(0x34);   //開啟拓展指令集
for(i=0;i<32;i++)     //因?yàn)長CD有縱坐標(biāo)32格所以寫三十二次
{
  LCD12864_WriteCmd(0x80+i);    //先寫入縱坐標(biāo)Y的值
  LCD12864_WriteCmd(0x80);    //再寫入橫坐標(biāo)X的值
  for(j=0;j<32;j++)    //橫坐標(biāo)有16位,每位寫入兩個(gè)字節(jié)的的數(shù)據(jù),也
  {        //就寫入32次以為當(dāng)寫入兩個(gè)字節(jié)之后橫坐標(biāo)會(huì)自
   LCD12864_WriteData(0xFF);   //動(dòng)加1,所以就不用再次寫入地址了。
  }
}
LCD12864_WriteCmd(0x36);  //0x36擴(kuò)展指令里面打開繪圖顯示
LCD12864_WriteCmd(0x30);  //恢復(fù)基本指令集
}
#endif
/*******************************************************************************
* 函 數(shù) 名         : LCD12864_SetWindow
* 函數(shù)功能     : 設(shè)置在基本指令模式下設(shè)置顯示坐標(biāo)。注意:x是設(shè)置行,y是設(shè)置列
* 輸    入         : 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 //總緩沖點(diǎn)數(shù)
#define CUTHEAD_LEN 3  //去極大值點(diǎn)數(shù)
#define CUTLAST_LEN 3  //去極小值點(diǎn)數(shù)
#define USEDATA_LEN (WEILINE_LEN - CUTHEAD_LEN - CUTLAST_LEN) //均值點(diǎn)數(shù)
////////////////////
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轉(zhuǎn)換未結(jié)束則等待
{
  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轉(zhuǎn)換未結(jié)束則等待,否則開始讀取
for(i=0;i<27;i++)
{
  ADSK_HIGH;   //PD_SCK 置高(發(fā)送脈沖)
  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"    //此文件中定義了單片機(jī)的一些特殊功能寄存器
#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);
}

/*******************************************************************************
* 函 數(shù) 名         : main
* 函數(shù)功能     : 主函數(shù)
* 輸    入         : 無
* 輸    出         : 無
*******************************************************************************/
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(); //數(shù)據(jù)處理函數(shù)  

}

void main(void)
{

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

}
}



稱重.zip

54.42 KB, 下載次數(shù): 123, 下載積分: 黑幣 -5

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏4 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:531573 發(fā)表于 2019-5-23 15:11 | 只看該作者
dis()這個(gè)函數(shù)呢?
回復(fù)

使用道具 舉報(bào)

板凳
ID:415912 發(fā)表于 2019-5-27 10:35 | 只看該作者
17491756892191 發(fā)表于 2019-5-23 15:11
dis()這個(gè)函數(shù)呢?

可以說的具體點(diǎn)嗎?你說的是程序中的 dis1[]。還是說自定義函數(shù)?unsigned char code dis1[] 這個(gè)在主函數(shù)中
回復(fù)

使用道具 舉報(bào)

地板
ID:596808 發(fā)表于 2019-8-9 11:46 | 只看該作者
有原理圖嗎?
回復(fù)

使用道具 舉報(bào)

5#
ID:62514 發(fā)表于 2019-8-16 20:37 | 只看該作者
很好,學(xué)習(xí)了。
回復(fù)

使用道具 舉報(bào)

6#
ID:525478 發(fā)表于 2019-8-17 10:06 | 只看該作者
有原理圖嗎  學(xué)習(xí)學(xué)習(xí)
回復(fù)

使用道具 舉報(bào)

7#
ID:64765 發(fā)表于 2020-2-23 19:00 | 只看該作者
好資料,學(xué)習(xí)了。謝謝分享。
回復(fù)

使用道具 舉報(bào)

8#
ID:110278 發(fā)表于 2020-2-24 12:11 | 只看該作者
很詳細(xì)
回復(fù)

使用道具 舉報(bào)

9#
ID:951299 發(fā)表于 2021-7-18 18:51 | 只看該作者
能不能解釋下它稱重的公式,有點(diǎn)看不懂
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 久久天堂| 在线看片福利 | 精品色| 国产精品一区二区久久 | 亚洲精品888| 黄色一级片aaa | 欧美国产精品一区二区三区 | www.色53色.com | 精品av| 欧美舔穴 | 亚州精品天堂中文字幕 | 国产欧美日韩在线播放 | 国产精品久久久久久久久久久久久久 | 欧美区日韩区 | 亚洲欧美国产视频 | 国产自产21区 | 欧美二区三区 | 日本天天操| 欧美日韩亚洲国产综合 | 成人在线精品 | 欧美日韩国产一区 | 亚洲精品乱码久久久久久黑人 | 亚洲精品视频在线看 | 欧美日本在线观看 | 精品一二区 | 国产精品免费观看 | 黄a免费看 | 中文字幕日本一区二区 | 亚洲 中文 欧美 日韩 在线观看 | 99re在线视频观看 | 精品久久久久久久久久久久久久 | 综合精品久久久 | 日日骚av| 久久精品国产久精国产 | 国产传媒视频在线观看 | 91精品久久久久久久久久小网站 | 亚洲精品一区二区在线观看 | 午夜影院在线观看免费 | 精品欧美激情在线观看 | 欧美美女二区 | www.黄色在线观看 |