欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
單片機智能電子秤電路程序設計
[打印本頁]
作者:
Ever_stars
時間:
2020-6-14 10:00
標題:
單片機智能電子秤電路程序設計
功能描述本文設計了一種智能電子秤,論述了儀器的工作原理,介紹了儀器的誤差來源于誤差分配,給出了儀器電路設計與軟件流程。智能電子秤主要由電源、稱重傳感器、A/D轉換器、單片機、鍵盤/開關、LCD顯示器等部分組成。主要技術指標為:稱量范圍0~15kg;分度值為0.005kg;精度等級Ⅲ級。儀器主要功能有自檢、去皮、計價、單價設定、過載報警等。儀器若不進行稱量操作,5分鐘后自動進入休眠模式,降低電源消耗。電路原理圖
單片機源程序如下:
#include<reg52.h>
#include<intrins.h>
#include<string.h>
#include<lcd12864.h>
#include<hx711.h>
#include<keyboard.h>
#define uint unsigned int
#define uchar unsigned char
#define ulong unsigned long
#define delayNOP();{_nop_();_nop_();_nop_();_nop_();};
//定義量程系數
#define RATIO 6797/1000
//定義標識
volatile bit FlagTest = 0; //定時測試標志,每0.5秒置位,測完清0
volatile bit FlagKeyPress = 0; //有鍵按下標志,處理完畢清0
volatile bit FlagSetPrice = 0; //價格設置狀態標志,設置好為1。
//管腳定義
//sbit LedA = P2^2;
sbit beep = P1^5;
sbit alert = P1^6;
sbit key_all=P3^7; //總金額鍵
//顯示用變量
int Counter;
uchar idata str1[6] = "000000";
uchar code name0[]={"本次購物總金額:"};
uchar code name1[]={"香蕉"};
uchar code name2[]={"蘋果"};
uchar code name3[]={"橘子"};
uchar code name4[]={"葡萄"};
uchar code name5[]={"柚子"};
uchar code name6[]={"橙子"};
uchar code name7[]={"梨子"};
uchar code name8[]={"西瓜"};
uchar code name9[]={"木瓜"};
uchar code name10[]={"桃子"};
int i, iTemp;
//稱重用變量
ulong idata FullScale; //滿量程AD值/1000
ulong AdVal; //AD采樣值
ulong weight; //重量值,單位g
ulong idata price; //單價,長整型值,單位為分
ulong idata money; //總價,長整型值,單位為分
ulong dec_weight;
//鍵盤處理變量
uchar keycode;
uchar DotPos; //小數點標志及位置
uchar Dec_pi; //去皮變量
uchar all_flag; //累計變量
//標志位
uchar num_name; //名稱數量標志
uchar shuliang; //數量值
ulong idata all_money; //累計
//函數聲明
void int2str(int, char *);
void Data_Init();
void Port_Init();
void Timer0_Init();
void Timer0_ISR () ;
void INT1_Init();
void KeyPress(uchar);
void To_Zero();
void Display_Namenum();
void Display_Price();
void Display_Weight();
void Display_Money();
void Display_Allmoney();
//整型轉字符串的函數,轉換范圍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()/1000;
price=0;
}
//顯示名稱數量,單位為元,四位整數,兩位小數
void Display_Namenum()
{
uint i,j;
uchar A1,A2,A3,A4;
uchar B1,B2;
i = price/100; //得到整數部分
j = price - i*100;//得到小數部分
// int2str(a,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;
//顯示整數部分
Lcd_Pos(0,4);
Lcd_Wdat(':');
Lcd_Wdat(A1);
Lcd_Wdat(A2);
Lcd_Wdat(A3);
Lcd_Wdat(A4);
Lcd_Wdat('-');
//顯示小數點, 小數點部分
// int2str(j,str1);
Lcd_Pos(0,7);
Lcd_Wdat(B1);
Lcd_Wdat(B2);
}
//顯示單價,單位為元,四位整數,兩位小數
void Display_Price()
{
uint i,j;
uchar A1,A2,A3,A4;
uchar B1,B2;
i = price/100; //得到整數部分
j = price - i*100;//得到小數部分
// int2str(a,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 Display_Allmoney()
{
uint i,j;
uchar A1,A2,A3,A4;
uchar B1,B2;
// all_money=all_money/2;
if (all_money>999999) //超出顯示量程
{
Lcd_Pos(3,3);
Lcd_Wdat('-');
Lcd_Wdat('-');
Lcd_Wdat('-');
Lcd_Wdat('-');
Lcd_Wdat('-');
Lcd_Wdat('-');
Lcd_Wdat('-');
return;
}
i = all_money/100; //得到整數部分
j = all_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(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);
}
else
{
Lcd_Pos(2,5);
Lcd_Wdat('.');
Lcd_Wdat(B1);
Lcd_Wdat(B2);
}
}
//數據初始化
void Data_Init()
{
price = 0;
DotPos = 0;
beep = 1;
alert = 1;
num_name=0;
all_money=0;
Dec_pi=0;
dec_weight=0;
all_flag=0;
}
//管腳配置
void Port_Init()
{
}
//定時器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;
}
}
//按鍵響應程序,參數是鍵值
//返回鍵值:
// 7 8 9 10(清0)
// 4 5 6 11(刪除)
// 1 2 3 12(未定義)
// 14(未定義) 0 15(.) 13(確定價格)
void KeyPress(uchar keycode)
{
uint nam1,nam2;
uchar i;
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++;
}
if(num_name==0)
{
Display_Namenum();
}
else if(num_name==1)
{
Display_Price();
}
break;
case 10: //清零鍵
To_Zero();
Display_Price();
Display_Namenum();
FlagSetPrice = 0;
DotPos = 0;
num_name=0;
Dec_pi=0;
dec_weight=0;
break;
case 11: //刪除鍵,按一次刪除最右一個數字
if (DotPos==2)
{
price=price/10;
price=price*10;
DotPos--;
}
else if (DotPos==1)
{
price=price/100;
price=price*100;
DotPos--;
}
else if (DotPos==0)
{
price=price/1000;
price=price*100;
}
if(num_name==0)
{
Display_Namenum();
}
else if(num_name==1)
{
Display_Price();
}
break;
case 12: //
Dec_pi=1; //去皮變量
break;
case 13: //確認鍵,名稱數量和單價
if(num_name==0)
{
nam1=price/100;
nam2=price-nam1*100;
num_name=1;
if(nam2!=0)
{
//顯示整數部分
Lcd_Pos(0,4);
Lcd_Wdat(':');
Lcd_Wdat(' ');
Lcd_Pos(0,5); //顯示位置為第四行的第1個字符
i = 0;
if(nam1==1)
{
while(name1[i] != '\0')
{
Lcd_Wdat(name1[i]); //顯示相應表格中的字符
i++;
}
}
else if(nam1==2)
{
while(name2[i] != '\0')
{
Lcd_Wdat(name2[i]); //顯示相應表格中的字符
i++;
}
}
else if(nam1==3)
{
while(name3[i] != '\0')
{
Lcd_Wdat(name3[i]); //顯示相應表格中的字符
i++;
}
}
else if(nam1==4)
{
while(name4[i] != '\0')
{
Lcd_Wdat(name4[i]); //顯示相應表格中的字符
i++;
}
}
else if(nam1==5)
{
while(name5[i] != '\0')
{
Lcd_Wdat(name5[i]); //顯示相應表格中的字符
i++;
}
}
else if(nam1==6)
{
while(name6[i] != '\0')
{
Lcd_Wdat(name6[i]); //顯示相應表格中的字符
i++;
}
}
else if(nam1==7)
{
while(name7[i] != '\0')
{
Lcd_Wdat(name7[i]); //顯示相應表格中的字符
i++;
}
}
else if(nam1==8)
{
while(name8[i] != '\0')
{
Lcd_Wdat(name8[i]); //顯示相應表格中的字符
i++;
}
}
else if(nam1==9)
{
while(name9[i] != '\0')
{
Lcd_Wdat(name9[i]); //顯示相應表格中的字符
i++;
}
}
else if(nam1==10)
{
while(name10[i] != '\0')
{
Lcd_Wdat(name10[i]); //顯示相應表格中的字符
i++;
}
}
else
{
num_name=0;
Lcd_Pos(0,4);
Lcd_Wdat(':');
Lcd_Wdat('0');
Lcd_Wdat('0');
Lcd_Wdat('0');
Lcd_Wdat('0');
Lcd_Wdat('-');
Lcd_Wdat('0');
Lcd_Wdat('0');
}
}
else if(nam2==0)
{
num_name=0;
Lcd_Pos(0,4);
Lcd_Wdat(':');
Lcd_Wdat('0');
Lcd_Wdat('0');
Lcd_Wdat('0');
Lcd_Wdat('0');
Lcd_Wdat('-');
Lcd_Wdat('0');
Lcd_Wdat('0');
}
shuliang=nam2;
price=0;
DotPos=0;
Dec_pi=0;
}
else if(num_name==1)
{
FlagSetPrice = 1;
DotPos=0;
num_name=0;
Dec_pi=0;
}
break;
case 14: //累計
all_money=all_money+money;
break;
case 15: //小數點按下
if (DotPos == 0)
{
DotPos = 1; //小數點后第一位
}
break;
}
Delay(10);
}
void main()
{
// Rom_CS=1;
Lcd_Init();
EA = 0;
Data_Init();
Port_Init();
Timer0_Init();
//初始化完成,開中斷
EA = 1;
beep=1;
//背光
// LedA = 1;
Lcd_Clear(); //clear all dots
Lcd_Display1();
Delay(1000);
To_Zero();
Lcd_Clear();
Lcd_Display2();
Display_Price();
while(1)
{
//每0.5秒稱重一次
if (FlagTest==1)
{
//稱重,得到重量值weight,單位為g
AdVal=ReadCount();
weight=FullScale-AdVal/1000;
if (weight>0x8000) weight=0;
weight=10000*weight/FullScale;
weight=weight*RATIO;
if(Dec_pi==1)
{
dec_weight=weight;
Dec_pi=0;
}
weight=weight-dec_weight;
//如果超量程,則報警
if (weight >= 10000)
{
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('-');
……………………
…………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
電子秤 原理圖 c程序 說明.zip
(222.99 KB, 下載次數: 40)
2020-6-14 10:00 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
電子秤原理圖.jpg
(167.76 KB, 下載次數: 104)
下載附件
2020-6-14 10:00 上傳
作者:
天然有瑕
時間:
2022-11-29 14:59
求大神根據樓主的資料畫個仿真圖
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1