专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

电子秤AD TM7710/TM7709测试程序

作者:佚名   来源:本站原创   点击数:  更新时间:2012年11月26日   【字体:
#include <reg52.h> 

#include<absacc.h> 

//ad 控制线 

#define ad_244 XBYTE[0xbfff]; 

sbit ad_stb=P3^3; 

sbit ad_start=P1^1; 

//lcd 控制线 

sbit lcd_di=P1^7; 

sbit lcd_rw=P1^2; 

sbit lcd_e=P1^0; 

//7289 控制线 

sbit cs7289=P1^3; 

sbit clk7289=P1^4; 

sbit dio7289=P1^5; 

//sbit key7289=P1^6; //7289 查询方式 

sbit key7289=P3^2; //7289 中断方式 

sbit baoj=P3^5; 

//7289 子程序 

void ini_7289(void); 

void send7289(short); 

short receive(void); 

void keyin(void); 

//lcd 子程序 

void ini_lcd(void); 

void lcdd_send(short); 

void lcdi_send(short); 

void chk_busy(void); 

//ad 子程序 

void ad(void); 

void baojing(void); 

void d_change(long); 

// 初始化,编号,日期 

void ini(); 

void error1(void); 

void nop1() 

{} 

void change(s) 

int dealy; // 全局变量 

short sh=0; // 商品号 

short dot=0; // 小数点标志 

bit list=0; 

short qb=0; 

char xdata shuju[7]=""; 

short xdata bcd[5]; 

char xdata s1[16]=" 单价 : 元 "; 

char xdata s2[16]=" 重量 : Kg"; 

char xdata s3[16]=" 金额 : 元 "; 

char xdata s4[16]=" 累计 : 元 "; 

char code message0[]=" 大学 "; 

char code message1[]=" 输入收银员代号 :"; 

char code message2[]=" 输入日期 :"; 

char code message3[16]=" -- 大学 -- "; 

char code message5[16]="闽潘实业有限公司欢迎您 !!"; 

char xdata bianhao[16]=" 收银员: "; 

char xdata riqi[16]=" - - "; 

long int xdata zongjia=0,jine=0,jine1=0; 

int xdata shizhong=0,pizhong=0,zhongliang=0; 

long int xdata qingdan[20][4]; 

char code shangpin[11][4]={{" 单价 "},{" 苹果 "},{" 梨 "},{" 花生 "},{" 大米 "}, 

{" 桃子 "},{" 塑料 "},{" 瓜子 "},{" 桔子 "},{" 香蕉 "},{" 玉米 "}}; 

long int xdata danjia[11]= 

{0,2000,3635,5502,6660,3320,5502,660,3210,6600,5600}; 

char xdata jiage[6]={0x0,0x0,0x0,0xfe,0x0,0x0}; // 0.00 

short xdata xiuzheng[]={0,2,5,6,7,8,9,12,13}; 

char s[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]; 

} 

//**************************************************************** 

void main() 

{short i,j; 

long int x,z; 

int y; 

int xdata duilie[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(); // 初始页面 , 收银员编号,日期 

lcdi_send(0x1); // 总清 屏 

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]; // 商品名 单价 

for(i=0;i<4;i++) s1[i]=shangpin[x][i]; 

x=qingdan[0][1]; 

d_change(x); change(s1); 

lcdi_send(0x90); 

for(i=0;i<16;i++) lcdd_send(s1[i]); 

x=qingdan[0][2]; // 显示重量 

d_change(x); change(s2); 

s2[10]=s2[9];s2[9]='.'; 

if(s2[8]==32) s2[8]=0x30; 

lcdi_send(0x88); 

for(i=0;i<16;i++) lcdd_send(s2[i]); 

x=qingdan[0][3]; 

d_change(x); change(s3); 

lcdi_send(0x98); 

for(i=0;i<16;i++) lcdd_send(s3[i]); // 以上为第一页 

EA=0;EX0=0; // 关键盘中断 

for(j=1;j<qb;j++) 

{while(key7289); 

x=qingdan[j][2]; 

d_change(x); change(s2); // 显示数据 

s2[10]=s2[9]; 

s2[9]='.'; if(s2[8]==32) s2[8]=0x30; 

lcdi_send(0x90); 

for(i=0;i<16;i++) lcdd_send(s2[i]); 

x=qingdan[j][1]; 

d_change(x); change(s1); 

x=qingdan[j][0]; 

for(i=0;i<4;i++) s1[i]=shangpin[x][i]; 

lcdi_send(0x80); 

for(i=0;i<16;i++) lcdd_send(s1[i]); 

x=qingdan[j][3]; 

d_change(x); change(s3); 

lcdi_send(0x88); 

for(i=0;i<16;i++) lcdd_send(s3[i]); 

lcdi_send(0x98); 

for(i=0;i<16;i++) lcdd_send(0x20); 

lcdi_send(0x98); 

while(key7289==0); 

} 

while(key7289); 

d_change(zongjia); change(s4); 

lcdi_send(0x80); 

for(i=0;i<16;i++) lcdd_send(s4[i]); 

lcdi_send(0x90); 

for(i=0;i<16;i++) lcdd_send(bianhao[i]); 

lcdi_send(0x88); 

for(i=0;i<16;i++) lcdd_send(message5[i]); 

lcdi_send(0x98); 

for(i=0;i<16;i++) lcdd_send(riqi[i]); 

list=0; 

while(key7289==0); 

while(key7289==1); 

while(key7289==0); 

EA=1;EX0=1; 

} 

else{ y=0; 

/* duilie[2]=duilie[1]; // 数字滤波 

duilie[1]=duilie[0]; 

y=ad1(); 

duilie[0]=y>>1; 

x=duilie[0]; 

x=x<<1; 

x=x+duilie[1]+duilie[2]; */ 

zhongliang=ad1(); 

shizhong=zhongliang-pizhong; // 数据转换 

x=danjia[sh]; 

jine1=shizhong*x; 

jine=jine1/1000; 

d_change(shizhong); change(s2); // 显示数据 

s2[10]=s2[9]; s2[9]='.'; 

if(s2[8]==32) s2[8]=0x30; 

lcdi_send(0x90); 

for(i=0;i<16;i++) lcdd_send(s2[i]); 

d_change(danjia[sh]); change(s1); 

for(i=0;i<4;i++) s1[i]=shangpin[sh][i]; 

lcdi_send(0x80); 

for(i=0;i<16;i++) lcdd_send(s1[i]); 

d_change(jine); change(s3); 

lcdi_send(0x88); 

for(i=0;i<16;i++) lcdd_send(s3[i]); 

d_change(zongjia); change(s4); 

lcdi_send(0x98); 

for(i=0;i<16;i++) lcdd_send(s4[i]); 

lcdi_send(0x98); 

//while(1); 

} 

} 

} 

void keyin(void) interrupt 0 using 0 // 中断 0 服务程序 

{char X,i; 

long int y; 

send7289(0x15); // 接收数据 

X=receive(); 

cs7289=1; 

X=X&0x1f; 

switch(X) 

{case 0xf : {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; 

for(i=0;i<6;i++) jiage[i]=0; 

} 

break; // 累加 

case 0xe : pizhong=zhongliang; break; // 去皮 

case 0xd : {danjia[sh]=0;dot=0;} break; // 清单价 

case 0xc : {zongjia=0;jine=0;dot=0;list=0;qb=0;pizhong=0; 

if(sh==0) danjia[sh]=0;} break; // 总清 

case 0xa : dot=1;break; // 点 

case 0xb : list=1;break; // 清单 

case 0x19 : sh=10;break; 

case 0x18 : sh=9;break; 

case 0x17 : sh=8;break; 

case 0x16 : sh=7;break; 

case 0x15 : sh=6;break; 

case 0x14 : sh=5;break; 

case 0x13 : sh=4;break; 

case 0x12 : sh=3;break; 

case 0x11 : sh=2;break; 

case 0x10 : sh=1;break; 

case 0x1f : 

case 0x1e : 

case 0x1d : 

case 0x1c : 

case 0x1a : break; 

case 0x1b : dot=1;break; 

default :{ if(dot==0) {jiage[0]=jiage[1];jiage[1]=jiage[2];jiage[2]=X;} 

if(dot==1) {jiage[4]=X;dot++; } 

else if(dot==2) {jiage[5]=X; dot++;} 

else if(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]; 

} 

} 

while(key7289==0); // 等待键盘松开 

} 

/* 

void ad(void) interrupt 2 using 1 

{short x,y; 

x=ad_244; 

y=x; 

if(x&0x80) baojing(); 

else x=x>>4; 

y=y&0xf; 

bcd[x]=y; 

} */ 

// 初始页面 

void ini() // 输入收银员编号 , 日期 

{short i,j; 

char X; 

lcdi_send(0x80); // 提示输入收银员编号 

i=0; 

while(message1[i]) lcdd_send(message1[i++]); 

for(i=8;i<12;i++) 

{ 

while(key7289); 

send7289(0x15); // 接收数据 

X=receive(); 

cs7289=1; 

bianhao[i]=X+0x30; 

lcdi_send(0x93); 

for(j=8;j<16;j++) lcdd_send(bianhao[j]); 

while(key7289==0); 

} 

lcdi_send(0x88); // 提示输入日期 

i=0; 

while(message2[i]) lcdd_send(message2[i++]); 

for(i=0;i<10;i++) // 输入日期 

{if(i==4||i==7) i++; 

while(key7289==1); 

send7289(0x15); // 接收数据 

X=receive(); 

cs7289=1; 

riqi[i]=X+0x30; 

j=0; 

lcdi_send(0x9a); 

for(j=0;j<10;j++) lcdd_send(riqi[j]); 

while(key7289==0); 

} 

while(key7289); 

nop1(); 

while(key7289==0); 

nop1(); 

lcdi_send(0x1); 

} 

//LCD 子程序 

void ini_lcd() //LCD 初始化子程序 

{ 

lcdi_send(0x30); 

lcdi_send(0x1); // 总清 

lcdi_send(0xc); 

lcdi_send(0x2); // 光标右移, AC+1 

} 

void lcdd_send(short X) //LCD 发送数据子程序 

{chk_busy(); 

nop1(); 

lcd_di=1;lcd_rw=0;lcd_e=0; 

P0=X; 

for(dealy=0;dealy<5;dealy++);// 

lcd_e=1; X=X; 

P0=0xff; 

} 

void lcdi_send(short X) //LCD 发送指令子程序 

{chk_busy(); 

nop1(); 

lcd_di=0;lcd_rw=0;lcd_e=0; 

P0=X; 

for(dealy=0;dealy<5;dealy++);// 

lcd_e=1; X=X; 

P0=0xff; 

} 

void chk_busy() 

{short i=0xff; 

while(i&0x80) 

{lcd_di=0; 

lcd_rw=1; 

lcd_e=0; 

i=P0; 

lcd_e=1; 

} 

} 

//7289 子程序 

void ini_7289() 

{short i; 

cs7289=1; key7289=1; dio7289=1; //7289 初始化子程序 

for(i=0;i<50;i++) 

for(dealy=0;dealy<5000;dealy++); // 延时 25ms 

send7289(0xa4); cs7289=1; 

} 

void send7289(short X) //7289 发送数据子程序 

{short i,j=1; 

cs7289=0; 

for(dealy=0;dealy<6;dealy++); // 延时 50us 

for(i=7;i>=0;i--) 

{j=j<<i; 

dio7289=X&j; 

j=1;j=1;clk7289=1; 

for(dealy=0;dealy<1;dealy++) ; // 延时 10us 

clk7289=0; 

for(dealy=0;dealy<1;dealy++) ; // 延时 10us 

} 

dio7289=0; 

} 

short receive() //7289 接收数据子程序 

{short i,X=0; 

dio7289=1; 

for(dealy=0;dealy<6;dealy++); // 延时 50us 

for(i=0;i<=7;i++) 

{clk7289=1; 

for(dealy=0;dealy<1;dealy++); // 延时 10us 

X=X<<1; 

if(dio7289)X++; 

clk7289=0; 

for(dealy=0;dealy<1;dealy++); // 延时 10us 

} 

dio7289=0; 

return(X); 

} 

//ad 

//AD 子程序 

int ad1() 

{short k,x; 

int ad_zhi=0,xz; 

EA=0; 

ad_start=1; 

for(k=0;k<5;k++) 

{ while(ad_stb); 

x=ad_244; 

x=x&0xf; 

ad_zhi=ad_zhi*10+x; 

} 

ad_start=0; 

EA=1;EX0=1; 

ad_zhi=ad_zhi>>1; 

xz=ad_zhi-50; 

xz=xz/100; 

ad_zhi=ad_zhi+xiuzheng[xz]; 

return(ad_zhi); 

void d_change(long X) 

{char qian,bai,shi,ge,shifen,baifen; 

long int yu; 

if(X>999999) error1(); 

qian=X/100000; yu=X%100000; 

bai=yu/10000; yu=yu%10000; 

shi=yu/1000; yu=yu%1000; 

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; 

} 

void baojing() 

{short i; 

for(i=0;i<50;i++) 

{baoj=0; 

for(dealy=0;dealy<10;dealy++); 

baoj=1; 

for(dealy=0;dealy<10;dealy++); 

} 

} 

参考书目:

《电子电路设计与实践》 山东科学技术出版社 姚福安著

《新型集成电路》 西安电子科技大学出版社 杨振江著

《 8051 单片机实践与应用》 清华大学出版社 吴金戎著

《积分式 A/D 转换器其他专用集成电路分册》

科学技术文献出版社 梁廷贵著

Abstract
The design is based on the microcontroller AT89S52 system, has reliably actualized the meterage of weigh from 10g to 10Kg , and has the part of sampling circuit composed of ICL7135 、 a differential measuring amplifier .Our system can accurately measure weigh, and calculate the price .The data collected are processed by the microcontroller and then displayed in the LCD. In addition, to make the display more visual and convenient, our system can easily display the bill of every buyers.

Subject terms:
 

关闭窗口

相关文章