电子秤原理及电子秤原理图打印版文档格式.docx
《电子秤原理及电子秤原理图打印版文档格式.docx》由会员分享,可在线阅读,更多相关《电子秤原理及电子秤原理图打印版文档格式.docx(21页珍藏版)》请在冰豆网上搜索。
voidad(void);
voidbaojing(void);
voidd_change(long);
//初始化,编号,日期
voidini();
voiderror1(void);
voidnop1()
{}
voidchange(s)
intdealy;
//全局变量
shortsh=0;
//商品号
shortdot=0;
//小数点标志
bitlist=0;
shortqb=0;
charxdatashuju[7]="
"
;
shortxdatabcd[5];
charxdatas1[16]="
单价:
元"
charxdatas2[16]="
重量:
Kg"
charxdatas3[16]="
金额:
charxdatas4[16]="
累计:
charcodemessage0[]="
信息学院山东大学"
charcodemessage1[]="
输入收银员代号:
charcodemessage2[]="
输入日期:
charcodemessage3[16]="
--山东大学--"
charcodemessage5[16]="
垃圾公司欢迎您!
!
charxdatabianhao[16]="
收银员:
"
charxdatariqi[16]="
--"
longintxdatazongjia=0,jine=0,jine1=0;
intxdatashizhong=0,pizhong=0,zhongliang=0;
longintxdataqingdan[20][4];
charcodeshangpin[11][4]={{"
单价"
},{"
苹果"
梨"
花生"
大米"
},
{"
桃子"
塑料"
瓜子"
桔子"
香蕉"
玉米"
}};
longintxdatadanjia[11]=
{0,2,3635,5502,0,3320,5502,660,3210,6600,5600};
charxdatajiage[6]={0x0,0x0,0x0,0xfe,0x0,0x0};
//0.00
shortxdataxiuzheng[]={0,2,5,6,7,8,9,12,13};
chars[16];
{s[6]=shuju[0];
s[7]=shuju[1];
s[8]=shuju[2];
s[9]=shuju[3];
s[10]=shuju[4];
s[11]=shuju[5];
s[12]=shuju[6];
}
//****************************************************************
voidmain()
{shorti,j;
longintx,z;
inty;
intxdataduilie[3]={0};
P1=0xff;
ini_lcd();
//初始化LCD
lcdi_send(0x8a);
while(message0[i])lcdd_send(message0[i++]);
ini_7289();
//初始化7289
pizhong=ad1();
lcdi_send(0x1);
//总清屏
ini();
//初始页面,收银员编号,日期
EA=1;
EX0=1;
//中断
//EX1=1;
//ad_start=1;
while
(1)
{if(list){lcdi_send(0x80);
//显示单位名称
for(i=0;
i<
16;
i++)lcdd_send(message3[i]);
x=qingdan[0][0];
//商品名单价
4;
i++)s1[i]=shangpin[x][i];
x=qingdan[0][1];
d_change(x);
change(s1);
lcdi_send(0x90);
i++)lcdd_send(s1[i]);
x=qingdan[0][2];
//显示重量
change(s2);
s2[10]=s2[9];
s2[9]='
.'
if(s2[8]==32)s2[8]=0x30;
lcdi_send(0x88);
i++)lcdd_send(s2[i]);
x=qingdan[0][3];
change(s3);
lcdi_send(0x98);
i++)lcdd_send(s3[i]);
//以上为第一页
EA=0;
EX0=0;
//关键盘中断
for(j=1;
j<
qb;
j++)
{while(key7289);
x=qingdan[j][2];
//显示数据
if(s2[8]==32)s2[8]=0x30;
x=qingdan[j][1];
x=qingdan[j][0];
lcdi_send(0x80);
x=qingdan[j][3];
i++)lcdd_send(0x20);
while(key7289==0);
while(key7289);
d_change(zongjia);
change(s4);
i++)lcdd_send(s4[i]);
i++)lcdd_send(bianhao[i]);
i++)lcdd_send(message5[i]);
i++)lcdd_send(riqi[i]);
list=0;
while(key7289==1);
else{y=0;
/*duilie[2]=duilie[1];
//数字滤波
duilie[1]=duilie[0];
y=ad1();
duilie[0]=y>
>
1;
x=duilie[0];
x=x<
<
x=x+duilie[1]+duilie[2];
*/
zhongliang=ad1();
shizhong=zhongliang-pizhong;
//数据转换
x=danjia[sh];
jine1=shizhong*x;
jine=jine1/1;
d_change(shizhong);
s2[9]='
d_change(danjia[sh]);
i++)s1[i]=shangpin[sh][i];
d_change(jine);
//while
(1);
voidkeyin(void)interrupt0using0//中断0服务程序
{charX,i;
longinty;
send7289(0x15);
//接收数据
X=receive();
cs7289=1;
X=X&
0x1f;
switch(X)
{case0xf:
{zongjia=zongjia+jine;
qingdan[qb][0]=sh;
qingdan[qb][1]=danjia[sh];
qingdan[qb][2]=shizhong;
qingdan[qb][3]=jine;
qb++;
sh=0;
dot=0;
danjia[0]=0;
6;
i++)jiage[i]=0;
break;
//累加
case0xe:
pizhong=zhongliang;
break;
//去皮
case0xd:
{danjia[sh]=0;
}break;
//清单价
case0xc:
{zongjia=0;
jine=0;
qb=0;
pizhong=0;
if(sh==0)danjia[sh]=0;
//总清
case0xa:
dot=1;
//点
case0xb:
list=1;
//清单
case0x19:
sh=10;
case0x18:
sh=9;
case0x17:
sh=8;
case0x16:
sh=7;
case0x15:
sh=6;
case0x14:
sh=5;
case0x13:
sh=4;
case0x12:
sh=3;
case0x11:
sh=2;
case0x10:
sh=1;
case0x1f:
case0x1e:
case0x1d:
case0x1c:
case0x1a:
case0x1b:
default:
{if(dot==0){jiage[0]=jiage[1];
jiage[1]=jiage[2];
jiage[2]=X;
if(dot==1){jiage[4]=X;
dot++;
}
elseif(dot==2){jiage[5]=X;
dot++;
elseif(dot>
2)break;
//lcdi_send(0x84);
y=jiage[0];
y=y*10+jiage[1];
y=y*10+jiage[2];
y=y*10+jiage[4];
danjia[sh]=y*10+jiage[5];
//等待键盘松开
/*
voidad(void)interrupt2using1
{shortx,y;
x=ad_244;
y=x;
if(x&
0x80)baojing();
elsex=x>
y=y&
0xf;
bcd[x]=y;
}*/
//初始页面
voidini()//输入收银员编号,日期
charX;
//提示输入收银员编号
i=0;
while(message1[i])lcdd_send(message1[i++]);
for(i=8;
12;
i++)
{
bianhao[i]=X+0x30;
lcdi_send(0x93);
for(j=8;
j++)lcdd_send(bianhao[j]);
//提示输入日期
while(message2[i])lcdd_send(message2[i++]);
10;
i++)//输入日期
{if(i==4||i==7)i++;
riqi[i]=X+0x30;
j=0;
lcdi_send(0x9a);
for(j=0;
j++)lcdd_send(riqi[j]);
nop1();
//LCD子程序
voidini_lcd()//LCD初始化子程序
lcdi_send(0x30);
lcdi_send(0xc);
lcdi_send(0x2);
//光标右移,AC+1
voidlcdd_send(shortX)//LCD发送数据子程序
{chk_busy();
lcd_di=1;
lcd_rw=0;
lcd_e=0;
P0=X;
for(dealy=0;
dealy<
5;
dealy++);
//
lcd_e=1;
X=X;
P0=0xff;
voidlcdi_send(shortX)//LCD发送指令子程序
lcd_di=0;
voidchk_busy()
{shorti=0xff;
while(i&
0x80)
{lcd_di=0;
lcd_rw=1;
i=P0;
voidini_7289()
{shorti;
key7289=1;
dio7289=1;
//7289初始化子程序
50;
//延时25ms
send7289(0xa4);
cs7289=1;
voidsend7289(shortX)//7289发送数据子程序
{shorti,j=1;
cs7289=0;
//延时50us
for(i=7;
i>
=0;
i--)
{j=j<
i;
dio7289=X&
j;
j=1;
clk7289=1;
dealy++);
//延时10us
clk7289=0;
dio7289=0;
shortreceive()//7289接收数据子程序
{shorti,X=0;
dio7289=1;
=7;
{clk7289=1;
X=X<
if(dio7289)X++;
return(X);
//ad
//AD子程序
intad1()
{shortk,x;
intad_zhi=0,xz;
ad_start=1;
for(k=0;
k<
k++)
{while(ad_stb);
x=x&
ad_zhi=ad_zhi*10+x;
ad_start=0;
ad_zhi=ad_zhi>
xz=ad_zhi-50;
xz=xz/100;
ad_zhi=ad_zhi+xiuzheng[xz];
return(ad_zhi);
voidd_change(longX)
{charqian,bai,shi,ge,shifen,baifen;
longintyu;
if(X>
)error1();
qian=X/100;
yu=X%100;
bai=yu/10;
yu=yu%10;
shi=yu/1;
yu=yu%1;
ge=yu/100;
yu=yu%100;
shifen=yu/10;
baifen=yu%10;
qian=qian+0x30;
bai=bai+0x30;
shi=shi+0x30;
ge=ge+0x30;
shifen=shifen+0x30;
baifen=baifen+0x30;
if(qian==0x30)
{qian=0x20;
if(bai==0x30)
{bai=0x20;
if(shi==0x30)shi=0x20;
shuju[0]=qian;
shuju[1]=bai;
shuju[2]=shi;
shuju[3]=ge;
shuju[4]='
shuju[5]=shifen;
shuju[6]=baifen;
voidbaojing()
{baoj=0;
baoj=1;
摘要
本系统采用单片机AT89S52为控制核心,实现电子秤的基本控制功能。
系统的硬件部分包括最小系统板,数据采集、人机交互界面三大部分。
最小系统部分主要是扩展了外部数据存储器,数据采集部分由压力传感器、信号的前级处理和A/D转换部分组成。
人机界面部分为键盘输入,128
64点阵式液晶显示,可以直观的显示中文,使用方便。
软件部分应用单片机C语言实现了本设计的全部控制功能,包括基本的称重功能,和发挥部分的显示购物清单的功能,可以设置日期和重新设定10种商品的单价,具有超重报警功能,由于系统资源丰富,还可以方便的扩展其应用
第一部分:
方案论证与比较
一、控制器部分
本系统基于51系列单片机来实现,因为系统需要大量的控制液晶显示和键盘。
不宜采用大规模可编程逻辑器件:
CPLD、FPGA来实现。
(因为大规模可编程逻辑器件一般是使用状态机方式来实现,即所解决的问题都是规则的有限状态转换问题。
本系统状态较多,难度较大。
)另外系统没有其它高标准的要求,我们最终选择了AT