基于AT89C52的电子秤proteus仿真+keil代码+报告+演示视频

摘要

电子秤是平常生活中常用的测量工具,在市面上有相应的需求, 本设计从市 面需求出发设计了一种智能电子秤, 该电子秤的主要功能有称重、去皮、计价、

单价设定和过载报警等,由 A/D 转换器、单片机、 按键、LCD 显示等部分组成。

本设计以嵌入式芯片 AT89C52 作为主控系统, 使用 8 位 AD 转换芯片 ADC083 对采集到的模拟量进行 AD 转换,转换后的数据送到单片机进行处理显示,数据

显示由 LCD12864 液晶实现,显示效果稳定,操作简单,使用方便。

关键词: 电子秤、AT89C52、AD 转换

目 录第一章 绪论 1第二章 电子秤系统设计 22.1 设计思路 22.2 设计架构图 2第三章 系统硬件电路分析 33.1 系统总体电路 33.2 AT89C52 33.3 ADC0832 43.4 LCD12864 6第四章 系统软件设计与分析 74.1 程序设计流程 74.2 主要源程序代码 7第五章 仿真 125.1 仿真电路图 125.2 Proteus 仿真 12第六章 总结 15参考文献 16

1 绪论

上个世纪五十年代, 电子技术得以产生并被用于多个领域, 部分研究人员将 电子技术应用到称重器械中, 进一步促进了称重器械的发展。此后, 电子秤的发

展得到加速。我国的电子秤发展较快,并在较短时间内达到国际先进水平。

作为最常见的称重工具, 传统的机械秤逐渐被更加便捷的电子秤取代, 这是 因为电子秤功能更多, 使用更加方便, 而且其准确性更高。在电子秤的称重过程 中, 需要综合应用单片机、传感器、转换器、显示器等元件, 从而达到准确的称 重效果。电子秤在使用过程中, 误差较小, 而且操作简单, 极具实用性, 因此得 到大范围使用, 并得到人们的喜爱。基于此, 功能多样、使用便捷、成本较低的

电子秤将得到进一步发展和应用,具有良好发展前景。

随着我国经济飞速发展, 百姓生活质量也迅速提升, 特别是国内消费能力变 得越来越强。在消费中使用的计量工具呈现出多样化形态, 特别是称重工具, 如 杆秤、弹簧盘秤、台式电子秤。虽然这些称重工具被广泛使用在日常贸易, 但依

然存在很大局限,如成本高、体积大、 需要交流供电等。

随着微处理和传感技术发展, 为适应更高要求的称重技术, 设计一款具有轻 便、操作简单、功耗低、成本低的多功能便携式电子秤, 其价值十分明显。本次 专业实践设计基于 51 单片机的电子秤,这种电子秤具有多种功能,除了最基本 的称重, 还能够实现去皮、计价、设定称重物品单价、计算货物总价、物品过载

报警等功能。

2 电子秤系统设计

2.1 设计思路

智能电子秤主要工作原理: 称盘上放有物品时, 会对传感器形成一压力, 使 得传感器随之产生力-电效应, 将物体的重量转换成与被称物体重量成一定函数 关系的模拟电信号,经电路放大,模数(A/D)转换, 送处理器处理得到对应的

物品重量。

本系统采用 AT8952 单片机作为核心控制硬件,由称重传感器、A/D 转换芯 片、处理器芯片、 LCD 显示器和蜂鸣报警器等组成。通过称重传感器实现数据的 采集转化为电压值传递给 A/D 转换器进一步传递给具有计算处理功能的 AT8952 单片机, 单片机扫描按键状态和引脚电平, 判断按键输入信息、功能按键开关状 态, 同时将收到的信息进行运算后,通过蜂鸣报警器和显示器传递给外界, 以达

到控制高精度的测量、报警、单价调节和去皮重等功能。

2.2 设计架构图

本系统以称重传感器和 8 位分辨率、双通道 A/D 转换芯片 ADC0832 作为数据 采集部分, 以 AT89C52 单片机作为数据处理部分, 以蜂鸣器、按键和 LCD 屏幕作

为人机交互部分,实现了智能电子秤的设计,系统框图如图 2.1 所示。

图 2.1 设计结构图

3 系统硬件电路分析

3.1 系统总体电路

电子秤系统总体电路图如下所示。

图 3.1 电子秤电路图

3.2 AT89C52

AT89C52 是一个低电压,高性能 CMOS8 位单片机,片内含 8k bytes 的可反 复擦写的 Flash 只读程序存储器和 256bytes 的随机存取数据存储器(RAM),器 件采用 ATMEL 公司的高密度、非易失性存储技术生产,兼容标准 MCS-51 指令系

统,片内置通用 8 位中央处理器和 Flash 存储单元。

AT89C52 有 40 个引脚,32 个外部双向输入/输出(I/O)端口,同时内含 2 个外中断口, 3 个 16 位可编程定时计数器,2 个全双工串行通信口, 2 个读写口 线, AT89C52 可以按照常规方法进行编程,但不可以在线编程(S 系列的才支持在 线编程)。其将通用的微处理器和 Flash 存储器结合在一起,特别是可反复擦写 的 Flash 存储器可有效地降低开发成本。

AT89C52 单片机最小系统主要有晶振电路、复位电路、和电源电路等组成,

如图 3.2 所示。

图 3.2 单片机最小系统

3.3 ADC0832

ADC0832 是 8 脚双列直插式双通道 A/D 转换器, 能分别对两路模拟信号实现 模—数转换, 可以用在单端输入方式和差分方式下工作。ADC0832 采用串行通信 方式,通过 DI 数据输入端进行通道选择、数据采集及数据传送。 8 位的分辨率 (较高分辨可达 256 级),可以适应一般的模拟量转换要求。其内部电源输入与 参考电压的复用,使得芯片的模拟电压输入在 0~5V 之间。具有双数据输出可作 为数据校验, 以减少数据误差, 转换速度快且稳定性能强。独立的芯片使能输入, 使多器件挂接和处理器控制变的更加方便, 芯片接口如图 3.3 所示。

图 3.3 ADC0832 接口示意图

接口说明如下:

CS 片选使能,低电平芯片使能;

CH0 模拟输入通道 0,或作为 IN+/-使用;

CH1 模拟输入通道 1,或作为 IN+/-使用;

GND 芯片参考 0 电位(地) ;

DI 数据信号输入,选择通道控制;

DO 数据信号输出,转换数据输出;

CLK 芯片时钟输入;

Vcc/REF 电源输入及参考电压输入(复用)。

正常情况下 ADC0832 与单片机的接口应为 4 条数据线, 分别是 CS、CLK、DO、 DI。但由于 DO 端与 DI 端在通信时并未同时有效并与单片机的接口是双向的, 所

以电路设计时可以将 DO 和 DI 并联在一根数据线上使用。

ADC0832 时序图如下所示。

图 3.4 ADC0832 时序图

在时序图中可以看到, CS 作为选通信号, 从 CS 置为低电平开始, 一直到置 为高电平结束。 CLK 提供时钟信号。当 ADC0832 未工作时其 CS 输入端应为高电 平, 此时芯片禁用, CLK 和 DO/DI 的电平可任意。当要进行 A/D 转换时, 须先将 CS 使能端置于低电平并且保持低电平直到转换完全结束。此时芯片开始转换工 作,同时由处理器向芯片时钟输入端 CLK 输入时钟脉冲, DO/DI 端则使用 DI 端 输入通道功能选择的数据信号。在第 1 个时钟脉冲的下沉之前 DI 端必须是高电 平,表示启始信号。在第 2、3 个脉冲下沉之前 DI 端应输入 2 位数据(SGL、Odd) 用于选择通道功能,当此 2 位数据为 “1”、 “0”时,只对 CH0 进行单通道转 换。当 2 位数据为 “1”、 “1”时,只对 CH1 进行单通道转换。当 2 位数据为 “0”、 “0”时,将 CH0 作为正输入端 IN+,CH1 作为负输入端 IN-进行输入。 当 2 位数据为 “0”、“1”时,将 CH0 作为负输入端 IN-,CH1 作为正输入端 IN+ 进行输入。在完成输入启动位、通道选择之后,到第 3 个脉冲的下沉之后 DI 端 的输入电平就失去输入作用,此后 DO/DI 端则开始利用数据输出 DO 进行转换数 据的读取。从第 4 个脉冲下沉开始由 DO 端输出转换数据最高位 DATA7,随后每 一个脉冲下沉 DO 端输出下一位数据。直到第 11 个脉冲时发出最低位数据 DATA0, 一个字节的数据输出完成。也正是从此位开始输出下一个相反字节的数据, 即从 第 11 个字节的下沉输出 DATA0。随后输出 8 位数据, 到第 19 个脉冲时数据输出 完成,也标志着一次 A/D 转换的结束。最后将 CS 置高电平禁用芯片,此时就可 以开始读出数据, 转换得到的数据会被送出二次, 一次高位在前传送, 一次低位

在前传送,连续送出。

3.4 LCD12864

LCD12864 是显示分辨率为 128×64, 内置 128 个 16*8 点 ASCII 字符集的点 阵图形液晶显示模块。利用该模块灵活的接口方式和简单、方便的操作指令, 可 构成全中文人机交互图形界面。可以显示 8×4 行 16×16 点阵的汉字。也可完 成图形显示。低电压低功耗是其又一显著特点。由该模块构成的液晶显示方案与

同类型的图形点阵液晶。显示模块相比, 硬件电路结构或显示程序都要简洁得多。

LCD12864 在显示字母和数字时,是 4*16 的显示字符模块,即可以显示 4 行, 每行可以显示 16 个字母或数字;在显示汉字时,是 4*8 的汉字显示模块,即可

以显示 4 行,每行可以显示 8 个汉字。下面介绍并行通信的显示方式。

表 3.1 LCD12864 引脚功能表

LCD12864 共有 20 个引脚,其引脚具体功能如表 3.1 所示,由表可得 LCD12864 引脚组成为 8 位数据传输端口(DB0-DB7);两个电源引脚(VCC,GND);两个 电源背光引脚(BLK,BLA),控制 LCD 的背景亮度; 一个 VO 引脚, 外接一个上拉 电阻(控制 LCD12864 的字符对比度, 让字符更加的清晰可见) ;RST 复位引脚, 低电平有效, 此处直接接高电平; 第 16、17 位空引脚, 不用管; 剩下的 RS,RW, EN 和 PSB 四个引脚则跟 LCD12864 的写入息息相关, 通过 PSB 可以控制 LCD12864 跟单片机的通信方式,输入高电平,则 LCD12864 跟单片机的通信模式为并行通 信,低电平则为串行通信。单片机对 RS,RW,EN 端口的写入控制,则可以控制 LCD12864 的数据传输模式,决定单片机写入 LCD12864 数据端口 DB 的是命令还 是数据。写入命令可以控制 LCD 的模式和工作状态, 然后写入数据, 让 LCD 显示

需要的界面。

读取ADC0832数据
进入按键 中断程序
蜂鸣器响 报警
调节单价、 报警重量等
根据单价 计算总价
LCD屏幕显示重量单价、总价、报警重量

4 系统软件设计与分析

4.1 程序设计流程

程序包括主程序模块、 ADC0832 处理子程序模块、 LCD 驱动子程序模块和按 键中断子程序模块。主程序循环读取 ADC0832 的数据并控制 LCD 屏幕的显示, ADC0832 处理子程序模块实现 ADC 芯片的初始化和读取操作并封装成函数, 方便 主函数直接调用, LCD 驱动子程序初始化所需的 GPIO 及其时钟,按键中断子程

序中处理按键按下事件。主程序流程如图 4.1。

硬件初始化

图 4.1 主程序流程图

4.2 主要源程序代码

#include<reg51.h>

#include<intrins.h>

#include <ZM.h>

#define LCD P0

sbit price_add1=P1^0;

sbit price_reduce1=P1^1;

sbit price_add2=P1^2;

sbit price_reduce2=P1^3;

sbit weight_reduce=P1^4;

sbit weigth_clear=P1^5;

sbit warning_add=P1^6;

sbit warning_reduce=P1^7;

sbit EN=P2^0;

sbit RW=P2^1;

sbit RS=P2^2;

sbit CS1=P2^3;

sbit CS2=P2^4;

sbit BUSY=P0^0;

sbit beep=P2^7;

sbit ADCS =P3^5;

sbit ADDI =P3^7;

sbit ADDO =P3^7;

sbit ADCLK =P3^6;

float press=0.0,press_r=0.0;

float warning=2.5;

int b;

int num=1,num_t=0;

float sum=0;

float price1=10;

float weight_temp=0;

void delay(unsigned char a)//延时函数

{

unsigned char i,j;

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

for(j=0;j<100;j++)

{

;

}

}

//按键中断

void temer1() interrupt 2

{

EX1=0;

if(price_add1==0)//涨价按键 1 按下,单价增长 0.5

{

while(!price_add1);

price1=price1+0.5;

}

else if(price_add2==0)//涨价按键 2 按下, 单价增长 1

{

while(!price_add2);

price1=price1+1;

}

else if(price_reduce1==0)//降价按键 1 按下,单价下降 0.5

{

while(!price_reduce1);

price1=price1-0.5;

}

else if(price_reduce2==0)//降价按键 2 按下,单价下降 1

{

while(!price_reduce2);

price1=price1-1;

}

else if(weight_reduce==0)//去皮按键按下,去除皮重

{

while(!weight_reduce);

weight_temp=press;

}

else if(weigth_clear==0)//去皮清零按键按下, 清除皮重

{

while(!weigth_clear);

weight_temp=0;

}

else if(warning_add==0)//报警值增加按键按下, 报警值增加 0.5 {

while(!warning_add);

warning+=0.5;

}

else if(warning_reduce==0)//报警值减少按键按下, 报警值减少 0.5 {

while(!warning_reduce);

warning-=0.5;

}

delay(100);

EX1=1;

}

void weight_alarm(void)

{

if(press_r>warning)

{

beep=0; //则启动报警

}

else

beep=1; //取消报警

}

void main()

{

unsigned char t[3]={'/','K','G'};

char m=':';

EA=1;

EX1=1;

lcdinti();//LCD 初始化

/*LCD 清屏*/

clear(0XB8,0X40,16,&table2);

clear(0XBa,0X40,16,&table2);

clear(0XBc,0X40,16,&table2);

clear(0XBe,0X40,16,&table2);

displayhanzi(0XB8,0X40,8,&TITLE);

/*显示报警值*/

turn(warning);

displayzifu(0XB8,0X78,5,&t1[1]);

displayzifu(0XB8,0xB0,2,&t[1]);

displayhanzi(0XBa,0X40,4,&WEIGHT);

displayzifu(0XBa,0X60,1,&m);

displayhanzi(0XBc,0X40,4,&PRICE);

displayzifu(0XBc,0X60,1,&m);

displayhanzi(0XBE,0X40,4,&TOTAL);

displayzifu(0XBe,0X60,1,&m);

while(1)

{

/*读取 ADC,并显示*/

ad_data =Adc0832(0); data_pro();

//采样值存储单元初始化为 0

press_r=press-weight_temp;

/*根据 ADC 数据,判断是否报警*/

weight_alarm();

turn(warning);

displayzifu(0XB8,0X78,5,&t1[1]);

delay(100);

turn(press_r);

displayzifu(0XBa,0X68,5,&t1[1]);

displayzifu(0xba,0xB0,2,&t[1]);

delay(100);

/*显示单价*/

turn(price1);

displayzifu(0XBc,0X68,6,&t1[0]);

displayhanzi(0xbc,0x98,2,&YUAN);

displayzifu(0XBc,0XA8,3,&t);

delay(100);

/*计算总价, 并显示*/

total(press_r,price1);

turn(sum);

displayzifu(0XBe,0X68,6,&t1);

displayhanzi(0xbe,0xB0,2,&YUAN);

delay(100);

}

}

主程序中, 循环读取 ADC0832 的数据,计算总价,动态刷新 LCD 屏幕,并 判断是否报警,按键的处理则在按键中断的回调函数中实现。

5 仿真

5.1 仿真电路图

如图 5.1,参照原理图在 Proteus 仿真软件中画出仿真电路图,电路图中

按功能进行布局布线,方便仿真时操作。

图 5.1 仿真电路图

5.2 Proteus 仿真

仿真开始运行, AT89C52 单片机可以读取到 ADC0832 的数据,并在 LCD 屏

幕上显示出重量、单价、报警值和总价,如图 5.2 所示。

图 5.2 重量显示

点击单价调节对应的按键可以调节物品的单价, 单片机计算出的总价也会随 着实时改变,如图 5.3 所示。

图 5.3 单价调节

点击报警调节对应的按键可以调节报警值, 物体重量超出报警值时, 报警电

路会开始工作,如图 5.4 所示。

图 5.4 报警调节

点击去皮操作对应的按键可以将当时的物体重量算作皮重去除, 之后再增加 的重量为净重,如图 5.5 所示。

图 5.5 去皮操作

6 总结

本次专业实践完成了智能电子秤设计,使用 Keil 软件进行软件编写,使用

Proteus 软件进行仿真, 是嵌入式知识与软件应用相结合的一次训练。

本次专业实践内容丰富, 涉及的知识面较广。在实践中, 通过查找资料为设 计准备, 使我对所学专业方面的许多知识又温习了一遍, 许多以前很模糊、很孤 立的部分知识通过这次设计得以贯穿, 而且掌握得更加地稳固了。通过这次课程 设计, 我不仅加深了对嵌入式理论的理解, 而且我还学会了如何理论很好地应用 到实际当中去。

专业实践对我实际动手操作能力是一次锻炼,尽管现在我的设计结构并不复 杂, 但相比过去的嵌入式实验内容, 对我的操作能力有着更高的要求。整个课程 设计过程,应该说是对我专业综合素质的培养和一次锻炼,使我增强自学能力, 懂得解决问题的方法, 以及做事更加有条不紊。这些都将对我日后在学习和实际

工作中完成各种任务起到很多帮助。

最后, 专业实践虽然已经结束了, 但我发现嵌入式应用设计所涵盖的知识面 是十分广泛的, 对这一领域的学习和理解仅凭这几天的了解是远远不够的, 这仅 仅是为我进入这一领域开启了一扇门,距离真正的实际应用和进行相关的项目开 发还有很多的东西需要我更深入的学习和掌握。

参考文献

[1] 赵云,李振,李海枫,马强,刘欢.基于 51 单片机电子秤重量报警系统[J].软 件,2020,41(04):88-92.

[2] 杨社鼎.51 单片机下的数字电子秤设计[J].电子技术与软件工 程,2019(22):245+254.

[3] 张祥豫,鲁西坤,侯凡博,张涛.基于 51 单片机的电子秤设计[J].电子测 试,2019(21):32-34.

[4] 田祎.基于 51 单片机的数字电子秤设计[J].计算机产品与流

通,2019(09):123.

[5] 周琳海,留黎钦.基于 51 单片机的电子秤设计[J].广东通信技 术,2018,38(11):59-63.

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值