智能电子称设计

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

智能电子秤设计
制作人:肖光敏
【摘要】本系统采用单片机AT89S52 为控制核心,实现电子秤的基本控制功
能。

系统的硬件部分包括最小系统板,数据采集、人机交互界面三大部分。

最小系统部分主要是扩展了外部数据存储器,数据采集部分由压力传感器、信号的前级处理和A/D 转换部分组成。

人机界面部分为键盘输入,12864 点阵式液晶显示,可以直观的显示中文,使用方便。

软件部分应用单片机 C 语言实现了本设计的全部控制功能,包括基本的称重功能,和发挥部分的显示购物清单的功能,可以设置日期和重新设定 10 种商品的单价,具有超重报警功能,由于系统资源丰富,还可以方便的扩展其应用
【关键字】电阻应变式传感器A/D 单片机液晶显示
【Abstrac t】The system uses a single-chip AT89S52 for the control of the core, the realization of electronic scales basic control functions. System hardware, including the minimum system board, data acquisition, three major human-computer interaction interface. Minimum System is part of the expansion of the external data storage, data acquisition in part by the pressure sensors, signal pre-processing and A / D conversion parts. Part of man-machine interface for keyboard input, 12,864 dot-matrix liquid crystal display can show the Chinese intuitive and easy to use. Application software C language realization of single-chip design of all the control functions, including basic weighing functions,And play to display a list of some of the features, you can set the date and re-setting unit 10 kinds of commodities, with overweight alarm function, the system is rich in resources, but also facilitate the expansion of its application
【Keyword】Resistance strain sensor A / D single-chip liquid crystal display
【目录】
1、前言 (3)
2、方案比较及论证 (3)
2.1题目要求 (3)
2.2主要器件的选择 (4)
2.2.1单片机主控制器件的选择 (4)
2.2.2 称重传感器的选择 (4)
2.2.3 放大电路芯片的选择 (4)
2.2.4 A/D转换芯片的选择 (5)
2.2.5 显示器件的选择 (6)
3、硬件系统设计 (6)
3.1系统设计流程图 (6)
3.2、单元电路设计 (7)
3.2、1单片机主控器件电路 (7)
3.2、2 信号采集及放大电路 (7)
3.2、3 A/D转换电路 (9)
3.2、4 按键操作电路 (9)
3.2、5 12864液晶显示电路 (10)
4、软件系统设计 (11)
4.1单元模块设计 (11)
4.1.1 A/D转换软件设计 (11)
4.1.2 按键操作设计 (12)
4.1.3 12864液晶显示 (12)
5、测试结果 (13)
6、总结 (13)
7、参考文献 (13)
8、附录 (14)
1.前言
现代信息技术的三大基础是信息的采集、传输和处理技术,即传感技术、通
信技术和计算机技术,它们分别构成了信息技术系统的“感官”、“神经”和
“大脑”。

信息采集系统的首要部件是传感器,且置于系统的最前端。

在一个现
代自动检测系统中,如果没有传感器.就无法监测与控制表征生产过程中各个环
节的各种参量,也就无法实现自动控制。

在现代技术中,传感器实际上是现代测
试技术和自动化技术的基础
科学技术的飞速发展,由称重传感器制作的电子衡器也已广泛地应用到各行
各业,实现了对物料的快速、准确的称量。

特别是随着微处理机的出现,工业生
产过程自动化程度化的不断提高,称重传感器已成为过程控制中的一种必需的装
置,从以前不能称重的大型罐、料斗等重量计测以及吊车秤、汽车秤等计测控制,
到混合分配多种原料的配料系统、生产工艺中的自动检测和粉粒体进料量控制
等,都应用了称重传感器,目前,称重传感器几乎运用到了所有的称重领域。

为了提高我们对数据采集及数据处理方面知识的处理能力,并且考虑到作品
的实用性和个人兴趣等因数,我们设计了一台基于51单片机的智能电子秤。


系统通过称重传感器采样,A/D转换后输入单片机,通过按键设置单价后,经过
单片机主控制器件的处理后,液晶上就会显示:商品的名称、数量、重量,单价、
本次购物总金额,同时语音播报以上内容,达到了数字化、智能化的要求。

2 方案比较与论证
2.1题目要求
2.1.1 基本要求:
1.采用简易键盘设置单价,对采集到的代表重量的信号能同时显示重量、金额和单价商品名称;
2.显示的单位为公斤,最大称重为80斤;
3.单价的单位为元,最大金额数值为99.9元;
4.总额累加计算功能;
5.自拟4种商品名称,能显示购物清单,清单内容包括:商品名称,
数量,重量,单价、本次购物总金额;
2.1.2 发挥部分:
1.允许用电压值可预置的直流电压代表重量采集信号,可以用代号表
示购物清单的各项信息。

2.具有超重报警功能。

2.2主要器件的选择
2.2.1 单片机主控制器件的选择
本系统基于 51系列单片机来实现,因为系统需要大量的控制液晶显示和键盘。

不宜采用大规模可编程逻辑器件:CPLD、FPGA来实现。

另外系统没有其它高标准的要求,我们最终选择了AT89S52通用的比较普通单片机来实现系统设计。

内部带有8KB的程序存储器,在外面扩展了32K数据存储器,以满足系统要求。

2.2.2 称重传感器的选择
称重传感器按转换方法分为光电式、液压式、电磁力式、电容式、磁极变形式、振动式、陀螺仪式、电阴应变式等8类,以电阻应变式使用最广。

电阻应变式称重传感器是利用电阻应变片变形时其电阻也随之改变的原理工作的,其内部结构如图1所示。

主要由弹性元件、电阻应变片、测量电路和传输电缆4部分组成。

电阻应变片贴在弹性元件上,弹性元件受力变形时,其上的应变片随之变形,并导致电阻改变。

测量电路测出应变片电阻的变化并变换为与外力大小成比例的电信号输出。

电信号经处理后以数字形式显示出被测物的质量。

图1 CZL-108平行梁式称重传感器内部原理图
电阻应变式传感器的称量范围为300g至数千kg,计量准确度达1/1000~1/10000,结构较简单,可靠性较好。

大部分电子衡器均使用此传感器。

2.2.3放大电路芯片的选择
传感器输出信号与作用在传感器上的重力和供桥桥压成正比,而且供桥桥压U的变化直接影响电子秤的测量精度,所以要求桥压很稳定。

毫伏级的传感器输出电压经过放大电路后,要求其输出的信号要能保证A/D转换电路的正常工作。

综合考虑,我们选用精密放大电路或仪用放大电路。

芯片我们选用的是OP07与AD620,具体的电路图及原理我们后面会详细的讲解。

OP07芯片是一种低噪声,非斩波稳零的双极性运算放大器。

由于它具有非常低的输入失调电压(对于OP07A最大为25μV),所以OP07在很多应用场合不需要额外的调零措施。

OP07同时具有输入偏置电流低(OP07A为±2nA)和开环增益高(对于OP07A为300V/mV)的特点,这种低失调、高开环增益的特性使得OP07特别适用于高增益的测量设备和放大传感器的微弱信号等方面。

AD620 为高精密的仪表放大器,所以使用OP07与AD620构成一个两级大电路可以保证A/D正常工作。

2.2.4 A/D转换芯片的选择
称重传感器实质就是压力传感器,其采集的压力信号是模拟量,单片机系统内部运算时用的都是数字量,即0和1,因此对于单片机而言我们无法直接操作模拟量,必须将模拟量转换为数字量。

这就需要在单片机前段加上模拟量/数字量转换器(A/D),所谓 A/D 转换器就是模拟/数字转换器(ADC),是将输入的模拟信号转换成数字信号。

信号输入端可以是传感器或转换器的输出,而 ADC 的数字信号也可能提供给微处理器,以便广泛地应用。

综合考虑各种因素我们选用逐次比较型A/D转换集成芯片ADC0804,它采用CMOS工艺20引脚集成芯片,分辨率为8位,转换时间为100us,输入电压范围为0—5V。

芯片内部具有三态输出数据锁存器,可直接连接在数据
引脚功能介绍:
/CS 芯片选择信号。

/RD 外部读取转换结果的控制输出信号。

/RD 为 HI 时,DB0~DB7 处理高阻抗:/RD 为 LO 时,数字数据才会输出。

/WR:用来启动转换的控制输入,相当于 ADC 的转换开始(/CS=0 时),当/WR 由 HI变为 LO时,转换器被清除:当/WR 回到 HI 时,转换正式
开始。

CLK IN,CLK R:时钟输入或接振荡无件(R,C)频率约限制在
100KHZ~1460KHZ,如果使用 RC 电路则其振荡频率为 1/(1.1RC)/INTR:中断请求信号输出,低地平动作.
VIN(+) VIN(-) :差动模拟电压输入.输入单端正电压时, VIN(-)接地:而差动输入时, 直接加入 VIN(+) VIN(-).
AGND,DGND:模拟信号以及数字信号的接地.
VREF:辅助参考电压.
DB0~DB7:8 位的数字输出.
VCC: 电源供应以及作为电路的参考电压.
2.2.5 显示器件的选择
因为题目要求能显示购物清单,清单内容包括:商品名称,数量,重量,单价、本次购物总金额;考虑到显示直观,电路结构简单,变成容易请偶们考虑选择液晶做显示器件,再从显示内容上考虑我们选用12864液晶。

带中文字库的128X64是一种具有4位/8位并行、2线或3线串行多种接口方式,内部含有国标一级、二级简体中文字库的点阵图形液晶显示模块;
其显示分辨率为128×64, 内置8192个16*16点汉字,和128个16*8点ASCII 字符集.利用该模块灵活的接口方式和简单、方便的操作指令,可构成全中文人机交互图形界面。

可以显示8×4行16×16点阵的汉字. 也可完成图形显示.低电压低功耗是其又一显著特点。

由该模块构成的液晶显示方案与同类型的图形点阵液晶显示模块相比,不论硬件电路结构或显示程序都要简洁得多,且该模块的价格也略低于相同点阵的图形液晶模块。

3.1系统设计流程图
本系统由信号采集及放大、A/D转换、按键操作、单片机、显示电路组成如图5所示
图5 系统设计流程图
3.2 单元电路设计
3.2.1 单片机主控器件电路
单片机最小系统能够运行的必要条件:电源、晶振电路、复位电路。

如图6所示:其中XTAL1(19脚)、 XTAL2(18脚)外接晶振电路,RST(9脚)接复位电路。

P0口控制12864液晶显示电路,P1口控制A/D转换电路,P2口控制键盘操做电路,P3口控制特殊引脚。

图6 单片机控制电路
3.2.2 信号采集及放大电路
电阻应变式称重传感器实物图如图7所示,引出线为四芯,红(输入 +)、白(输出-)、黑(输入-)、绿(输出+)。

接线方法是红黑分别接电源正负端,绿白分别接信号的输出端,为确保精度,一般不要调整线长。

在电阻应变传感器中其作用的是桥式测量电路。

桥式测量电路有四个电阻,电桥的一个对角线接入工作电压E,另一个对角线为输出电压Uo。

其特点是:当四个桥臂电阻达到相应的关系时,电桥输出为零,否则就有电压输出,可利用灵敏检流计来测量,所以电桥能够精确地测量微小的电阻变化。

测量电桥如图8所示:
图8 称重传感器测量电桥 图7 称重传感器实物图 它由箔式电阻应变片电阻R 1、R 2、R 3、R 4组成测量电桥,测量电桥的电
源由稳压电源E 供给。

物体的重量不同,电桥不平衡程度不同,指针式电表指
示的数值也不同。

滑动式线性可变电阻器R P1作为物体重量弹性应变的传感器,
组成零调整电路,当载荷为0时,调节R P1使数码显示屏显示零。

如图9所示:AD620仪表放大器的1、8脚跨接一电阻可以调整放大倍数,
4、7 脚接正常工作所需的电压值相等的正负电压, 2、3 脚接输入电压即可
从6脚输出放大后的电压。

引脚5则是参考基准,如果接地则引脚6的输出即
为与地之间的相对电压。

图 9 AD620引脚图和放大电路 由于称重传感器采集的电压信号为毫伏级,而A/D 转换电路的工作电压为
0-5V,为了保证A/D 正常工作,以及采样信号的稳定性我们采用两级放大。


路图为图10。

图 10 信号采集及放大电路
3.2.3 A/D转换电路
A/D转换电路完成模拟量到数字量之间的变换,把称重传感器采集的模拟信号转换成单片机可以识别的数字信号,经过预设的算法后得到我们想要的结果。

具体连线如图11所示
图11 A/D转换电路
3.2.4 按键操作电路
依照题目要求,为实现单价预设功能我们采用4*4矩阵键盘,由P2口控制。

具体连线图及各按键的功能如图12所示
图12 按键操作及功能介绍
3.2.5 12864液晶显示电路
12864液晶属于图形型液晶,由128列64行组成,即共有128*64 个点来显示各种图形。

12864液晶串行接口与并行接口共用,我们采用
的是并行接口。

12864液晶与单片机连接图如图13所示:
图13 液晶驱动电路
4、软件系统设计
4.1单元模块设计
4.1.1 A/D 转换软件设计
数字芯片在操作时首先要分析它的操作时序图 ,图16ADC0804启
动转换时序图,图17为ADC0804读取数据时序图。

写程序时只需按图14与图15就能准确地操作A/D 转换电路。

图14 ADC0804启动转换时序图
图15为ADC0804读取数据时序图
CS TCLK/2
4.1.2 按键操作设计
按键功能参考图12,软件设计流程图如图16所示:
图16 按键操作流程
4.1.3 12864液晶显示
12864液晶有串行与并行操作方式,我们采用的是并行方式,其并行基本操作时序图为图17,汉字显示坐标为图18。

图17 12864并行操作方式时序图
图18 12864汉字显示坐标图
5、测试结果
经过硬件与软件的综合调试基本完成了设计要求的基本功能及发挥部分的功能。

介于对电子秤应用的分析与展望,其功能我们还将继续开发,尽量将其做得更加完善,以适应科技高速发展的需求。

6、总结
学贵以致用,通过几天的电子秤设计过程,将从书本上学到的知识应用于实践,学会了初步的电子电路仿真设计,虽然过程中遇到了一些困难,但是在解决这些问题的过程无疑也是对自己自身专业知识的一种提高。

当最终调试成功的时候也是对自己的一种肯定。

此次的设计作业不仅增强了自己在专业设计方面的信心,鼓舞了自己,更是一次兴趣的培养,为自己以后的学习方向的明确了重点。

另外在这次实验中我们遇到了不少的问题针对不同的问题我们采取不同的解决方法,遇到不懂的问题时,利用网上的资源,搜索查找得到需要的信息。

最终一一解决设计中遇到的问题。

通过错误排除最终确认是传感器的问题。

我觉得我们能够顺利完成此设计的关键是团队合作,当然知识储备也不能忽略。

7、参考文献
[1]童诗白模拟电子技术基础[]北京:高等教育出版社,2002.78-79. [2]张靖检测技术与系统设计[]北京:中国电力出版社,2001.368-369. [3]何小艇.电子系统设计[第三版][M].杭州:浙江大学出版社,2004
[4]施汉谦.电子秤技术[J]. 北京:中国计量出版社,2001:225-259
[5]薛均义.MCS-51系列单片微型计算机应用[M]. 西安:西安交通大学出版社,2002
[6]谭浩强.C程序设计(第三版).北京:清华大学出版社,2004
8、附录
#include <reg52.h>
#include <stdlib.h>
#include <intrins.h>
#include <keyscan.h>
#define uchar unsigned char
#define uint unsigned int
sbit LCD_RS = P3^0;
sbit LCD_RW = P3^1;
sbit LCD_EN = P3^2;
sbit LCD_PSB = P3^3;
sbit fmq=P3^4;
sbit AD_CS=P3^5;
sbit AD_WR=P3^6;
sbit AD_RD=P3^7;
uchar ad_data; //ad输入 *0.3125就是重量
uchar num,m;
float save=0.0,price;
uchar code data0[]={"商品:"};
uchar code data1[]={"单价:"};
uchar code data2[]={"重量:"};
uchar code data3[]={"总金额:"};
uchar code data4[]={"商品总量:"}; uchar code data0_1[]={"西瓜"};
uchar code data0_2[]={"橘子"};
uchar code data0_3[]={"苹果"};
uchar code data0_4[]={"梨子"};
uchar code data5[]={"谢谢!"};
void total_price();
uint zhishu(uchar x);
void delay(uint z);
uchar keyscan();
void init();
void lcd_address(uchar a , uchar y); void write_lcd(uchar add , uchar rs); void ad();
void main()
{
init();
while(1){
keyscan();
ad();
total_price();
}
}
uint zhishu(uchar x) {
uchar i,a=1;
if (x>=1){
for(i=1;i<=x;i++){
a=10*a;
}
return a;
}
else {
return 1;
}
}
void delay(uint z)
{
uint x,y;
for ( x=0; x<z; x++){
for ( y=0; y<110; y++);
}
}
/*********************读取单价价格**************/ void total_price()
{
uchar i,j=0,n;
uchar total[9];
float danjia;
float k=0;
uchar hc[]={0,0,0,0,0}; //缓存输入键盘单价数据
uchar hc1[]={0,0,0,0,0};
uchar flag=0,a=0;
uint da1[6]={0,0,0,0,0,0};
flag=0;
n=0;
while ( num==1){
write_lcd(0x01,0);
while ( keyscan()!=16 ){
lcd_address(1,0);
while ( data1[n] !='\0' ){ //显示单价二字
write_lcd(data1[n],1);
n++;
}
n=0;
/*************按矩阵键盘设定单价*******/ if ( keyscan()==1 ){
hc[flag]=1;
hc1[flag]=1+0x30;
flag++;
}
if ( keyscan()==2 ){
hc[flag]=2;
hc1[flag]=2+0x30;
flag++;
}
if ( keyscan()==3 ){
hc[flag]=3;
hc1[flag]=3+0x30;
flag++;
}
if ( keyscan()==4 ){ hc[flag]=4;
hc1[flag]=4+0x30;
flag++;
}
if ( keyscan()==5 ){ hc[flag]=5;
hc1[flag]=5+0x30;
flag++;
}
if ( keyscan()==6 ){ hc[flag]=6;
hc1[flag]=6+0x30;
flag++;
}
if ( keyscan()==7 ){ hc[flag]=7;
hc1[flag]=7+0x30;
flag++;
}
if ( keyscan()==8 ){ hc[flag]=8;
hc1[flag]=8+0x30;
flag++;
}
if ( keyscan()==9 ){ hc[flag]=9;
hc1[flag]=9+0x30;
flag++;
}
if ( keyscan()==10 ){
hc[flag]=0;
hc1[flag]=0+0x30;
flag++;
}
if ( keyscan()==11 ){
hc[flag]=0x2e;
hc1[flag]=0x2e;
flag++;
j=flag; //j为点的位数
a=1;
}
if ( keyscan()==12 ){
write_lcd(0x01,0);
lcd_address(1,0);
while(data1[n]!='\0')
{
write_lcd(data1[n],1);
n++;
}
n=0;
for(i=0;i<flag-1;i++)
write_lcd(hc1[i],1);
break;
}
for(i=0;i<flag;i++)
write_lcd(hc1[i],1);
}
/***************显示重量***************/
da1[0]=(int)(ad_data*0.417)/10+0x30; //转换成重量并保存十位
da1[1]=(int)(ad_data*0.417)%10+0x30; // 保存个位da1[2]='.';
da1[3]=(int)(ad_data*4.17)%10+0x30; // 保存十分位
da1[4]=(int)(ad_data*41.7)%10+0x30; // 保存百分位
da1[5]=(int)(ad_data*417)%10+0x30; // 保存千分位
lcd_address(2,0);
while ( data2[n]!='\0'){
write_lcd(data2[n],1); //显示重量
n++;
}
n=0;
lcd_address(2,3);
for (i=0; i<6;i++)
write_lcd(da1[i],1);
/**************测试指数****************/
/* tota2[0]=9*zhishu(2)/100+0x30;
tota2[1]=8*zhishu(1)%100/10+0x30;
tota2[2]=7*zhishu(0)%10+0x30;
for(i=0;i<3;i++)
write_lcd(tota2[i],1);*/
/**************将数字字符串转化十进制数*************************/
if(a==1)
{
for (i=1; i<j; i++){ //计算单价整数部分k = (hc[i-1])*zhishu(j-1-i) + k;
}
for (i=j+1; i<=flag; i++){ //计算小数部分
k = (hc[i-1])*1.0/(zhishu(i-j)) + k;
}
}
else
for(i=1;i<=flag;i++)
k=hc[i-1]*zhishu(flag-i)+k;
danjia = k;
k=0;
flag=0;
/*************计算和显示总金额**********************/ price=danjia*(ad_data*0.417);
total[0] = (int)price/1000+0x30; //取出总金额的各位
total[1] = (int)price%1000/100+0x30;
total[2] = (int)price%100/10+0x30;
total[3] = (int)price%10+0x30;
total[4] = 0x2e;
total[5] = (int)price*10%10+0x30;
total[6] = (int)price*100%10+0x30;
total[7] = (int)price*1000%10+0x30;
total[8] = (int)price*10000%10+0x30;
lcd_address(3,0);
while ( data3[n] !='\0' ){
write_lcd(data3[n],1);
n++;
}
n=0;
for (i=0; i<9; i++)
write_lcd(total[i],1);
/****************************测试单价值*****************************/
/* tota2[0]=(int)danjia/10+0x30;
//write_lcd(tota2[0]+hc1[0],1);
tota2[1]=(int)danjia%10+0x30;
tota2[2]=0x2e;
tota2[3]=(int)(danjia*10)%10+0x30;
for(i=0;i<=3;i++)
write_lcd(tota2[i],1);*/
/******************************************/ while(keyscan()!=13);
}
/***************************************/
while( num==2 ){
write_lcd(0x01,0);
lcd_address(0,0);
while ( keyscan()!=16 ){
switch (keyscan()) {
case 1 : danjia = 10;
while ( data0_1[n]!='\0' ){
write_lcd(data0_1[n],1);
n++;
}
n=0;
write_lcd(0x31,1);
break;
case 2 : danjia = 15;
while ( data0_2[n]!='\0' ){
write_lcd(data0_2[n],1);
n++;
}
n=0;
write_lcd(0x32,1);
break;
case 3 : danjia = 20;
while ( data0_3[n]!='\0' ){
write_lcd(data0_3[n],1);
n++;
}
n=0;
write_lcd(0x33,1);
break;
case 4 : danjia = 25;
while ( data0_4[n]!='\0' ){
write_lcd(data0_4[n],1);
n++;
}
n=0;
write_lcd(0x34,1);
break;
}
}
lcd_address(1,0);
while ( data1[n]!='\0' ){
write_lcd(data1[n],1);
n++;
}
write_lcd((uchar)danjia/10+0x30,1); write_lcd((uchar)danjia%10+0x30,1);
n=0;
da1[0]=(int)(ad_data*0.417)/10+0x30; //转换成重量并保存十位
da1[1]=(int)(ad_data*0.417)%10+0x30; // 保存个位da1[2]='.';
da1[3]=(int)(ad_data*4,17)%10+0x30; // 保存十分位
da1[4]=(int)(ad_data*41.7)%10+0x30; // 保存百分位
da1[5]=(int)(ad_data*417)%10+0x30; // 保存千分位
lcd_address(2,0);
while ( data2[n]!='\0'){
write_lcd(data2[n],1); //显示重量
n++;
}
n=0;
lcd_address(2,3);
for (i=0; i<6;i++)
write_lcd(da1[i],1);
price = danjia*(ad_data*0.417);
total[0] = (int)price/1000+0x30; //取出总金额的各位
total[1] = (int)price%1000/100+0x30;
total[2] = (int)price%100/10+0x30;
total[3] = (int)price%10+0x30;
total[4] = 0x2e;
total[5] = (int)price*10%10+0x30;
total[6] = (int)price*100%10+0x30;
total[7] = (int)price*1000%10+0x30;
total[8] = (int)price*10000%10+0x30;
lcd_address(3,0);
while ( data3[n] != '\0' ){
write_lcd(data3[n],1);
n++;
}
n=0;
for (i=0; i<9; i++)
write_lcd(total[i],1);
while(keyscan()!=13);
}
/********************************************/ while( num==3 ){
write_lcd(0x01,0);
/*************取出总金额的各位并显示**************/
total[0] = (int)save/1000+0x30;
total[1] = (int)save%1000/100+0x30;
total[2] = (int)save%100/10+0x30;
total[3] = (int)save%10+0x30;
total[4] = 0x2e;
total[5] = (int)save*10%10+0x30;
total[6] = (int)save*100%10+0x30;
total[7] = (int)save*1000%10+0x30;
total[8] = (int)save*10000%10+0x30;
lcd_address(2,0);
while ( data3[n] !='\0' ){
write_lcd(data3[n],1);
n++;
}
n=0;
for(i=0;i<9;i++)
write_lcd(total[i],1);
lcd_address(1,0);
while ( data4[n] !='\0' ){ write_lcd(data4[n],1);
n++;
}
n=0;
write_lcd(0x30+m,1);
lcd_address(3,5);
while(data5[n]!='\0')
{
write_lcd(data5[n],1);
n++;
}
n =0;
while(keyscan()!=13);
}
/****************************************/ if (num==4 ){
num=0;
write_lcd(0x01,0);
}
}
uchar keyscan()
{
uchar a;
uchar key;
P2=0xfe;
a=P2&0xf0;
fmq=1; //蜂鸣器
while(a!=0xf0)
{
delay(10);
a=P2&0xf0;
switch(a)
{
case 0xe0: key=1;break;
case 0xd0: key=2;break;
case 0xb0: key=3;break;
case 0x70: key=4;break;
}
fmq=0;
while(a!=0xf0){
a=P2&0xf0;
}
fmq=1;
return key;
}
P2=0xfd;
a=P2&0xf0;
while(a!=0xf0)
{
delay(10);
a=P2&0xf0;
switch(a)
{
case 0xd0: key=6;break;
case 0xb0: key=7;break;
case 0x70: key=8;break;
}
fmq=0;
while(a!=0xf0){
a=P2&0xf0;
}
return key;
}
fmq=1;
P2=0xfb;
a=P2&0xf0;
while(a!=0xf0)
{
delay(10);
a=P2&0xf0;
switch(a)
{
case 0xd0: key=10;break;
case 0xb0: key=11;break;
case 0x70: key=12;break;
}
fmq=0;
while(a!=0xf0){
a=P2&0xf0;
}
return key;
}
fmq=1;
P2=0xf7;
a=P2&0xf0;
while(a!=0xf0)
{
delay(10);
a=P2&0xf0;
switch(a)
{
case 0xe0: key=13;num++;break;
case 0xd0: key=14;m=0;save=0;break;
case 0xb0: key=15;m++;save=save+price;break;
case 0x70: key=16;break;
}
fmq=0;
while(a!=0xf0){
a=P2&0xf0;
}
return key;
}
}
void init()
{
LCD_PSB=1;
write_lcd(0x30,0);
delay(5);
write_lcd(0x0c,0);
delay(5);
write_lcd(0x01,0);
delay(5);
}
void write_lcd(uchar add , uchar rs) {
LCD_RS = rs;
LCD_RW = 0;
LCD_EN = 0;
P0 = add;
delay(5);
LCD_EN = 1;
delay(5);
LCD_EN = 0;
}
void lcd_address(uchar a , uchar y) {
uchar address;
uchar x;
switch (a){
case 0 : x=0x80;break;
case 1 : x=0x90;break;
case 2 : x=0x88;break;
case 3 : x=0x98;break;
}
address=x+y;
write_lcd(address,0);
}
void ad()
{
uint da[6]={0,0,0,0,0,0};
uchar i;
uchar n;
n=0;
AD_CS=0;
AD_WR=1;
_nop_();
AD_WR=0;
_nop_();
AD_WR=1;
delay(10);
P1=0XFF;//读之前p1口先写全1
AD_RD=1;
_nop_();
AD_RD=0;
_nop_();
ad_data=P1;//读取ad送给p1口的数据AD_RD=1;
if(ad_data==255)
ad_data=0;
else
ad_data=ad_data-64;
da[0]=(int)(ad_data*0.417)/10+0x30; da[1]=(int)(ad_data*0.417)%10+0x30; da[2]=0x2e;
da[3]=(int)(ad_data*4.17)%10+0x30; da[4]=(int)(ad_data*41.7)%10+0x30; da[5]=(int)(ad_data*417)%10+0x30;
lcd_address(2,0);
while ( data2[n]!='\0'){
write_lcd(data2[n],1); //显示重量
n++;
}
n=0;
lcd_address(2,3);
for (i=0; i<6;i++)
write_lcd(da[i],1);
}
完整电路图
PCB图
实物图。

相关文档
最新文档