欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
51單片機hx711簡易電子秤源程序
[打印本頁]
作者:
w188081256
時間:
2018-8-7 12:05
標題:
51單片機hx711簡易電子秤源程序
此程序適用單片機類型STC89C52RC
0.png
(9.43 KB, 下載次數: 51)
下載附件
2018-8-8 02:23 上傳
單片機源程序如下:
#include<reg52.h>
#include<intrins.h>
#include<string.h>
#include<lcd12864.h>
#include<hx711.h>
#include<eeprom52.h>
#include<keyboard.h>
#define MAX 10000
#define uint unsigned int
#define uchar unsigned char
#define ulong unsigned long
#define delayNOP();{_nop_();_nop_();_nop_();_nop_();};
//定義量程系數
//#define RATIO 2356/1000
uint RATIO;
//定義標識
volatile bit FlagTest = 0; //定時測試標志,每0.5秒置位,測完清0
volatile bit FlagKeyPress = 0; //有鍵按下標志,處理完畢清0
volatile bit FlagSetPrice = 0; //價格設置狀態標志,設置好為1?
volatile bit ClearWeighFlag = 0; //傳感器調零標志位,清除0漂?
volatile bit wtk = 0; //稱重/時間模式
//管腳定義
sbit beep = P3^3;
sbit alert = P3^4;
//顯示用變量
int Counter;
uchar idata str1[6] = "000000";
int i, iTemp;
//稱重用變量
ulong idata FullScale; //滿量程AD值/1000
ulong AdVal; //AD采樣值
ulong weight; //重量值,單位g
ulong idata price; //單價,長整型值,單位為分
ulong idata money; //總價,長整型值,單位為分
ulong idata pricebc; //單價,長整型值,單位為分
//鍵盤處理變量
uchar keycode;
uchar DotPos; //小數點標志及位置
uchar wttime;//
//函數聲明
void int2str(int, char *);
void Data_Init();
void Timer0_Init();
void Timer0_ISR () ;
void INT1_Init();
void KeyPress(uchar);
void To_Zero();
void Display_Price(); //單價寫入屏函數
void Display_Weight(); //重量寫入屏函數
void Display_Money(); //總價寫入屏函數
//整型轉字符串的函數,轉換范圍0--65536
void int2str(int x, char* str)
{
int i=1;
int tmp=10;
while(x/tmp!=0)
{
i++;
tmp*=10;
}
tmp=x;
str[i]='\0';
while(i>1)
{
str[--i]='0'+(tmp%10);
tmp/=10;
}
str[0]=tmp+'0';
}
//重新找回零點,每次測量前調用
void To_Zero()
{
FullScale=ReadCount();
price=0;
}
/******************把數據保存到單片機內部eeprom中******************/
void write_eeprom()
{
uchar x1,x2;
x1=RATIO/256;
x2=RATIO%256;
SectorErase(0x2000);
byte_write(0x2000, x1);
byte_write(0x2001, x2);
byte_write(0x2058, a_a);
}
/******************把數據從單片機內部eeprom中讀出來*****************/
void read_eeprom()
{
uchar x1,x2;
x2 = byte_read(0x2001);
x1 = byte_read(0x2000);
a_a= byte_read(0x2058);
RATIO = x1*256+x2;
}
/**************開機自檢eeprom初始化*****************/
void init_eeprom()
{
read_eeprom(); //先讀
if(a_a != 1) //新的單片機初始單片機內問eeprom
{
RATIO = 3500;
a_a = 1;
write_eeprom(); //保存數據
}
}
//顯示單價,單位為元,四位整數,兩位小數
void Display_Price()
{
uint i,j;
uchar A1,A2,A3,A4;
uchar B1,B2;
i = price/100; //得到整數部分
j = price - i*100;//得到小數部分
int2str(i,str1);
A1=i/1000+48;
A2=i%1000/100+48;
A3=i%1000%100/10+48;
A4=i%1000%100%10+48;
B1=j/10+48;
B2=j%10+48;
//顯示整數部分
if (i>=1000)
{
Lcd_Pos(2,3);
Lcd_Wdat(A1);
Lcd_Wdat(A2);
Lcd_Wdat(A3);
Lcd_Wdat(A4);
}
else if (i>=100)
{
Lcd_Pos(2,3);
Lcd_Wdat(' ');
Lcd_Wdat(A2);
Lcd_Wdat(A3);
Lcd_Wdat(A4);
}
else if (i>=10)
{
Lcd_Pos(2,3);
Lcd_Wdat(' ');
Lcd_Wdat(' ');
Lcd_Wdat(A3);
Lcd_Wdat(A4);
}
else
{
Lcd_Pos(2,3);
Lcd_Wdat(' ');
Lcd_Wdat(' ');
Lcd_Wdat(' ');
Lcd_Wdat(A4);
}
//顯示小數點, 小數點部分
int2str(j,str1);
if(j<10)
{
Lcd_Pos(2,5);
Lcd_Wdat('.');
Lcd_Wdat('0');
Lcd_Wdat(B2);
Lcd_Wdat(' ');
}
else
{
Lcd_Pos(2,5);
Lcd_Wdat('.');
Lcd_Wdat(B1);
Lcd_Wdat(B2);
Lcd_Wdat(' ');
}
}
//顯示重量,單位kg,兩位整數,三位小數
void Display_Weight()
{
uint i,j;
uchar A1,A2;
uchar B1,B2,B3;
//weight單位是g
i = weight/1000; //得到整數部分
j = weight - i*1000;//得到小數部分
A1=i/10+48;
A2=i%10+48;
B1=j/100+48;
B2=j%100/10+48;
B3=j%100%10+48;
int2str(i,str1);
if (i>=10)
{
}
else
{
Lcd_Pos(1,4);
Lcd_Wdat(' ');
Lcd_Wdat(A2);
}
int2str(j,str1);
if (j<10)
{
Lcd_Pos(1,5);
Lcd_Wdat('.');
Lcd_Wdat('0');
Lcd_Wdat('0');
Lcd_Wdat(B3);
}
else if (j<100)
{
Lcd_Pos(1,5);
Lcd_Wdat('.');
Lcd_Wdat('0');
Lcd_Wdat(B2);
Lcd_Wdat(B3);
}
else
{
Lcd_Pos(1,5);
Lcd_Wdat('.');
Lcd_Wdat(B1);
Lcd_Wdat(B2);
Lcd_Wdat(B3);
}
}
//顯示總價,單位為元,四位整數,兩位小數
void Display_Money()
{
uint i,j;
uchar A1,A2,A3,A4;
uchar B1,B2;
if (money>999999) //超出顯示量程
{
Lcd_Pos(3,3);
Lcd_Wdat('-');
Lcd_Wdat('-');
Lcd_Wdat('-');
Lcd_Wdat('-');
Lcd_Wdat('-');
Lcd_Wdat('-');
Lcd_Wdat('-');
return;
}
i = money/100; //得到整數部分
j = money - i*100;//得到小數部分
A1=i/1000+48;
A2=i%1000/100+48;
A3=i%1000%100/10+48;
A4=i%1000%100%10+48;
B1=j/10+48;
B2=j%10+48;
int2str(i,str1);
//顯示整數部分
if (i>=1000)
{
Lcd_Pos(3,3);
Lcd_Wdat(A1);
Lcd_Wdat(A2);
Lcd_Wdat(A3);
Lcd_Wdat(A4);
}
else if (i>=100)
{
Lcd_Pos(3,3);
Lcd_Wdat(' ');
Lcd_Wdat(A2);
Lcd_Wdat(A3);
Lcd_Wdat(A4);
}
else if (i>=10)
{
Lcd_Pos(3,3);
Lcd_Wdat(' ');
Lcd_Wdat(' ');
Lcd_Wdat(A3);
Lcd_Wdat(A4);
}
else
{
Lcd_Pos(3,3);
Lcd_Wdat(' ');
Lcd_Wdat(' ');
Lcd_Wdat(' ');
Lcd_Wdat(A4);
}
//顯示小數點, 小數點部分
int2str(j,str1);
if(j<10)
{
Lcd_Pos(3,5);
Lcd_Wdat('.');
Lcd_Wdat('0');
Lcd_Wdat(B2);
}
else
{
Lcd_Pos(3,5);
Lcd_Wdat('.');
Lcd_Wdat(B1);
Lcd_Wdat(B2);
}
}
//數據初始化
void Data_Init()
{
price = 0;
DotPos = 0;
beep = 1;
alert = 1;
}
//定時器0初始化
void Timer0_Init()
{
ET0 = 1; //允許定時器0中斷
TMOD = 1; //定時器工作方式選擇
TL0 = 0x06;
TH0 = 0xf8; //定時器賦予初值
TR0 = 1; //啟動定時器
}
//定時器0中斷
void Timer0_ISR (void) interrupt 1 using 0
{
TL0 = 0x06;
TH0 = 0xf8; //定時器賦予初值
//每0.5秒鐘刷新重量
Counter ++;
if (Counter >= 200)
{
FlagTest = 1;
Counter = 0;
}
}
//按鍵響應程序,參數是鍵值
//返回鍵值:
// 1 2 3 10(清0)
// 4 5 6 11(刪除單價)
// 7 8 9 12(去皮)
// 14(未定義) 0 15(.) 13(未定義)
void KeyPress(uchar keycode)
{
switch (keycode)
{
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:
//目前在設置整數位,要注意price是整型,存儲單位為分
if (DotPos == 0)
{
//最多只能設置到千位
if (price<100000)
{
price=price*10+keycode*100;
}
}
//目前在設置小數位
else if (DotPos==1) //小數點后第一位
{
price=price+keycode*10;
DotPos++;
}
else if (DotPos==2)
{
price=price+keycode;
DotPos++;
}
Display_Price();
break;
case 10: //清零鍵
Delay(15);//延時
pricebc=price;
To_Zero();
price=pricebc;
Display_Price();
DotPos = 0;
beep=~beep;
break;
case 11: //清楚單價
Delay(15);//延時
price=0;
DotPos = 0;
Display_Price();
break;
case 12: //去皮
Delay(15);//延時
ClearWeighFlag = 1; //置零傳感器標志 置1
break;
case 13: //微調
Delay(15);//延時
if(wtk==0)
RATIO--;//微調系數
else
RATIO=RATIO-20;//微調系數
write_eeprom();//存入eerom內,掉電不丟失系數數據
break;
case 14: //微調減
Delay(15);//延時
if(wtk==0)
RATIO++;//微調系數
else
RATIO=RATIO+20;//微調系數
write_eeprom();//存入eerom內,掉電不丟失系數數據
break;
case 15: //小數點按下
Delay(15);//延時
if (DotPos == 0)
{
DotPos = 1; //小數點后第一位
}
break;
}
Delay(10);
}
void main()
{
Lcd_Init();
EA = 0;
Data_Init();
Timer0_Init();
EA = 1;//初始化完成,開中斷
beep=1;
init_eeprom();
Lcd_Clear(); //clear all dots
Lcd_Display1();
Delay(700);
To_Zero();
Lcd_Clear();
Lcd_Display2();
Display_Price();
while(1)
{
//每0.5秒稱重一次
if (FlagTest==1)
{
//稱重,得到重量值weight,單位為g
AdVal=ReadCount();
weight=FullScale-AdVal;
if (weight>0x8000000) weight=0;
weight=weight*10/RATIO;//物體實際重量=總量量程對于的是多少。
//weight=10000*weight/FullScale;
//weight=weight*RATIO;
//如果超量程,則報警
if (weight >= MAX)
{
beep = 0;
alert = 0;
Lcd_Pos(1,4);
Lcd_Wdat('-');
Lcd_Wdat('-');
Lcd_Wdat('-');
Lcd_Wdat('-');
Lcd_Wdat('-');
Lcd_Wdat('-');
Lcd_Pos(3,3);
Lcd_Wdat('-');
Lcd_Wdat('-');
Lcd_Wdat('-');
Lcd_Wdat('-');
Lcd_Wdat('-');
Lcd_Wdat('-');
Lcd_Wdat('-');
}
//如果不超量程
else
{
beep = 1;
alert = 1;
Display_Weight();
money = weight*price/1000; //money單位為分
Display_Money();//顯示總金額
if(money>999999)
money=999999;
……………………
…………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
1-程序-10kg.rar
(67.55 KB, 下載次數: 144)
2018-8-7 12:05 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
的外號
時間:
2018-8-11 12:38
博主那個清除0飄是什么意思啊
作者:
weimian2018
時間:
2018-9-11 20:12
點贊,感覺收益很大
作者:
Saigetsu
時間:
2019-8-3 11:24
下載一個看看能不能用上
作者:
zgs660429
時間:
2019-9-30 09:17
下載一個看看,這個還搞不懂。
作者:
karolyte
時間:
2020-5-9 22:37
請教一下,您這個校正的原理是什么呢?程序里 有嗎?
作者:
凡塵一葉
時間:
2020-6-27 11:09
大佬,需要用到些什么東西,怎么連接,可以教一下嗎
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1