《匠人手记》推荐网上购书渠道:
互动出版网(china-pub)购书入口   >>>
当当网(dangdang)购书入口   >>>
卓越亚马逊网 购书入口   >>>
淘宝网(taobao)购书入口   >>>
更多购书渠道……   >>> 

设为首页加入收藏联系匠人管理入口21IC首页21IC博客21IC社区侃单片机回复的贴参与的贴

天气预报
百宝日历
载入中...

百宝专栏

载入中...
最新货色

载入中...

粉丝评论

载入中...

载入中...



百宝信息

载入中...

百宝流量

(2006-07-01开始)


匠人手记

 匠人观点: 好记性不如烂笔头  
 黑色幽默:三鹿门——后世畅想

实用电子秤5(第五部分:附录 源程序)
程序匠人 发表于 2006-3-7 22:13:00  阅读全文 | 回复(0) | 引用通告 | 编辑

第五部分:附录

电子秤的信号采集、处理、显示的程序 .

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

// 初始化,编号,日期

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

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

看《匠人手记》,与匠人同行!北航出版,正在热卖!

发表评论:
载入中...

芯片专题

器件专题

软件专题

硬件专题

综合专题

项目专题

原创专题

器件检测
LCD LED
按键 触摸键
E2PROM
电池 电机
电阻 电容 电感

指令系统
软件算法
编程规范
滤波算法
串行通讯

PCB设计
I2C PWM
红外遥控
充电技术
中断 ADC 

匠人手记
匠人夜话
网络心路
一周热点串烧
从零开始玩PIC
DIY旋转时钟

广告5号位 [投放]


学习板、开发板、编程器、下载器、仿真器(查看详情……)

广告3号位 [投放]

站内搜索


站外搜索


百度  google
mp3  歌词 
图片  FLASH 
知道  文档
新闻  词典 
地图  mp3 
软件  天网 
雅虎  爱问 
搜狗  讯雷 
网讯  华军 
天空 

21IC器件搜索
百宝箱分站
  • 《匠人的百宝箱》21IC站
  • 《匠人的百宝箱》21IC笔记团队
  • 《匠人手记》21IC书友会
  • 《匠人的百宝箱》MCUBLOG站
  • 《匠人的百宝箱》MCUBLOG笔记团队
  • 《匠人的百宝箱》EDN站
  • 《匠人手记》EDN书友会
  • 《匠人的百宝箱》与非网站
  • 《匠人的百宝箱》新浪站
  • 《匠人的百宝箱》百度站
  • 《匠人的百宝箱》网易126站
  • 《匠人的百宝箱》网易163站
  • 《匠人的百宝箱》互动出版网站
  • 广告4号位 [投放]

     
     

    匠人原创

    往日酷贴

     
     
     

    大千八卦

    友情连接

    新浪新闻:
    新浪财经:
    AK58新闻:
    新浪股票:
    新浪股票:
    证券之星:

     [更多酷站连接]

     

     

    [欢迎交换连接]

    [百宝箱之与非门分舵]

    [电脑圈圈的家当]

    [IC921的博客]

    [柔月阁]

    [八楼的呼吸]

    [hotpower 的水潭]

    [xwj的文君阁]

    [所长的BLOG]

    [阿摆手记]

    [电子伙伴]

    [unaided的笔记]

    [小飞的笔记]

    [单片机开发联盟]

    [网址之家]

    [好东西网址大全]

    [美萍中文精选]

    [数字电视之家]

    [SMARTCODE电子书斋]

    [软件开发之窗]

    [Armoric]

    [我爱研发网]

    [infernal的笔记]

    [雄鹰的空中加油站]

    [SunK]

    [逍遥电子]

    [ningpanda的博客]

    [C-Design]

    [一网见天下]

    [海边淘沙]

    [嵌入式365]

    [水牛的仓库]

    [股剩是怎样炼成的]

    [PIC论坛]

    [ICC AVR开发网]

    [中国高校自动化网]

     

     

     

    MCU博客-中国电子工程师博客网 

    大学生电子网 

     

     

     

     

     

    !!! 《匠人的百宝箱》 !!!