|
由于稱重模塊不是我們組負(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
2019-5-19 16:24 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
54.42 KB, 下載次數(shù): 123, 下載積分: 黑幣 -5
評分
-
查看全部評分
|