機(jī)電之家資源網(wǎng)
單片機(jī)首頁(yè)|單片機(jī)基礎(chǔ)|單片機(jī)應(yīng)用|單片機(jī)開(kāi)發(fā)|單片機(jī)文案|軟件資料下載|音響制作|電路圖下載 |嵌入式開(kāi)發(fā)
培訓(xùn)信息
贊助商
實(shí)用電子秤5(第五部分:附錄 源程序)
實(shí)用電子秤5(第五部分:附錄 源程序)
 更新時(shí)間:2008-7-27 14:00:06  點(diǎn)擊數(shù):3
【字體: 字體顏色

電子秤的信號(hào)采集、處理、顯示的程序 .

#i nclude <reg52.h>

#i nclude<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);

// 初始化,編號(hào),日期

void ini();

void error1(void);

void nop1()

{}

void change(s)

int dealy; // 全局變量

short sh=0; // 商品號(hào)

short dot=0; // 小數(shù)點(diǎn)標(biāo)志

bit list=0;

short qb=0;

char xdata shuju[7]="";

short xdata bcd[5];

char xdata s1[16]=" 單價(jià) : 元 ";

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

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

char xdata s4[16]=" 累計(jì) : 元 ";

char code message0[]=" 信息學(xué)院 山東大學(xué) ";

char code message1[]=" 輸入收銀員代號(hào) :";

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

char code message3[16]=" -- 山東大學(xué) -- ";

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]={{" 單價(jià) "},{" 蘋果 "},{" 梨 "},{" 花生 "},{" 大米 "},

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

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(); // 初始頁(yè)面 , 收銀員編號(hào),日期

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]; // 商品名 單價(jià)

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]); // 以上為第一頁(yè)

EA=0;EX0=0; // 關(guān)鍵盤中斷

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

{while(key7289);

x=qingdan[j][2];

d_change(x); change(s2); // 顯示數(shù)據(jù)

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]; // 數(shù)字濾波

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; // 數(shù)據(jù)轉(zhuǎn)換

x=danjia[sh];

jine1=shizhong*x;

jine=jine1/1000;

d_change(shizhong); change(s2); // 顯示數(shù)據(jù)

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 服務(wù)程序

{char X,i;

long int y;

send7289(0x15); // 接收數(shù)據(jù)

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; // 清單價(jià)

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; // 點(diǎn)

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); // 等待鍵盤松開(kāi)

}

/*

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;

} */

// 初始頁(yè)面

void ini() // 輸入收銀員編號(hào) , 日期

{short i,j;

char X;

lcdi_send(0x80); // 提示輸入收銀員編號(hào)

i=0;

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

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

{

while(key7289);

send7289(0x15); // 接收數(shù)據(jù)

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); // 接收數(shù)據(jù)

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); // 光標(biāo)右移, AC+1

}

void lcdd_send(short X) //LCD 發(fā)送數(shù)據(jù)子程序

{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 發(fā)送指令子程序

{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++); // 延時(shí) 25ms

send7289(0xa4); cs7289=1;

}

void send7289(short X) //7289 發(fā)送數(shù)據(jù)子程序

{short i,j=1;

cs7289=0;

for(dealy=0;dealy<6;dealy++); // 延時(shí) 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++) ; // 延時(shí) 10us

clk7289=0;

for(dealy=0;dealy<1;dealy++) ; // 延時(shí) 10us

}

dio7289=0;

}

short receive() //7289 接收數(shù)據(jù)子程序

{short i,X=0;

dio7289=1;

for(dealy=0;dealy<6;dealy++); // 延時(shí) 50us

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

{clk7289=1;

for(dealy=0;dealy<1;dealy++); // 延時(shí) 10us

X=X<<1;

if(dio7289)X++;

clk7289=0;

for(dealy=0;dealy<1;dealy++); // 延時(shí) 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++);

}

}

參考書目:

《電子電路設(shè)計(jì)與實(shí)踐》 山東科學(xué)技術(shù)出版社 姚福安著

《新型集成電路》 西安電子科技大學(xué)出版社 楊振江著

《 8051 單片機(jī)實(shí)踐與應(yīng)用》 清華大學(xué)出版社 吳金戎著

《積分式 A/D 轉(zhuǎn)換器其他專用集成電路分冊(cè)》

科學(xué)技術(shù)文獻(xiàn)出版社 梁廷貴著

Abstract

T he 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:

microcontroller, meterage, sampling circuit, differential measuring amplifier LCD, weight , bill

  • 上一篇: 一個(gè)非常好的串口程序
  • 下一篇: 實(shí)用電子秤4(第四部分:使用操作說(shuō)明 )
  • 發(fā)表評(píng)論   告訴好友   打印此文  收藏此頁(yè)  關(guān)閉窗口  返回頂部
    熱點(diǎn)文章
     
    推薦文章
     
    相關(guān)文章
    網(wǎng)友評(píng)論:(只顯示最新5條。)
    關(guān)于我們 | 聯(lián)系我們 | 廣告合作 | 付款方式 | 使用幫助 | 機(jī)電之家 | 會(huì)員助手 | 免費(fèi)鏈接

    點(diǎn)擊這里給我發(fā)消息66821730(技術(shù)支持)點(diǎn)擊這里給我發(fā)消息66821730(廣告投放) 點(diǎn)擊這里給我發(fā)消息41031197(編輯) 點(diǎn)擊這里給我發(fā)消息58733127(審核)
    本站提供的機(jī)電設(shè)備,機(jī)電供求等信息由機(jī)電企業(yè)自行提供,該企業(yè)負(fù)責(zé)信息內(nèi)容的真實(shí)性、準(zhǔn)確性和合法性。
    機(jī)電之家對(duì)此不承擔(dān)任何保證責(zé)任,有侵犯您利益的地方請(qǐng)聯(lián)系機(jī)電之家,機(jī)電之家將及時(shí)作出處理。
    Copyright 2007 機(jī)電之家 Inc All Rights Reserved.機(jī)電之家-由機(jī)電一體化網(wǎng)更名-聲明
    電話:0571-87774297 傳真:0571-87774298
    杭州濱興科技有限公司提供技術(shù)支持

    主辦:杭州市高新區(qū)(濱江)機(jī)電一體化學(xué)會(huì)
    中國(guó)行業(yè)電子商務(wù)100強(qiáng)網(wǎng)站

    網(wǎng)站經(jīng)營(yíng)許可證:浙B2-20080178-1