avr 编写电子秤实验报告 - 图文

更新时间:2023-11-01 12:55:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

电子称设计报告

摘要 本设计系统以单片机Atmega16为控制核心,实现电子秤的基本控制功

能。在设计系统时,为了更好地采用模块化设计法,分步设计了各个单元功能模块。

系统的硬件部分包括最小系统部分、数据采集部分、人机交互界面三大部分。最小系统是Atmega16的最小系统;数据采集部分由称重传感器czl-a和A/D转换部分hx711模块组成;人机界面部分为键盘输入,1602液晶显示器,可以直观的显示重量的具体数字以及方便的输入数据以设定单价和预定重量,使用方便。

系统的软件部分应用单片机C语言进行编程,实现了该设计的全部控制功能。该电子秤可以实现基本的称重功能(称重范围为0~1Kg,重量误差不大于±0.005Kg),可以设定商品的单价和想要的重量, 当超重时,相应的灯会亮起以警示。

本系统设计结构简单,使用方便,功能齐全,精度高,具有一定的开发价值。

1. 电子秤概述

称重技术自古以来就被人们所重视,作为一种计量手段,广泛应用于工农业、科研、交通、内外贸易等各个领域,与人民的生活紧密相连。电子秤是电子衡器中的一种,衡器是国家法定计量器具,是国计民生、国防建设、科学研究、内外贸易不可缺少的计量设备,衡器产品技术水平的高低,将直接影响各行各业的现代化水平和社会经济效益的提高。因此,称重技术的研究和衡器工业的发展各国都非常重视。

我国电子衡器从最初的机电结合型发展到现在的全电子型和数字智能型。我国电子衡器的技术装备和检测试验手段基本达到国际水平。电子衡器制造技术及应用得到了新发展。电子称重技术从静态称重向动态称重发展;计量方法从模拟测量向数字测量发展;测量特点从单参数测量向多参数测量发展,特别是对快速称重和动态称重的研究与应用。

电子秤属于电子衡器的一种,它的发展也遵循这一趋势。随着时代科技的迅猛发展,微电子学和计算机等现代电子技术的成就给传统的电子测量与仪器带来了巨大的冲击和革命性的影响。常规的测试仪器仪表和控制装置被更先进的智能仪器所取代,使得传统的电子测量仪器在远距离、功能、精度及自动化水平定方

面发生了巨大变化,并相应的出现了各种各样的智能仪器控制系统,使得科学实验和应用工程的自动化程度得以显著提高。

做为重量测量仪器,智能电子秤在各行各业开始显现其测量准确,测量速度快,易于实时测量和监控的巨大优点,并开始逐渐取代传统型的机械杠杆测量称,成为测量领域的主流产品。

接下来让大家了解更多有关于智能电子秤的相关知识。

2.课题的意义

电子秤的发展过程与其它事物一样,也经历了由简单到复杂、由粗糙到精密、由机械到机电结合再到全电子化、由单一功能到多功能的过程。近年来,电子秤已愈来愈多地参与到数据处理和过程控制中。现代称重技术和数据系统已经成为工艺技术、储运技术、预包装技术、收货业务及商业销售领域中不可缺少的组成部分。随着称重传感器各项性能的不断突破,为电子秤的发展奠定了其础,国外如美国、西欧等一些国家在20世纪60年代就出现了0 .1 %称量准确度的电子秤,并在70年代中期约对75 %的机械秤进行了机电结合式的电子化改造。

电子秤是日常生活中常用的电子衡器,广泛应用于超市、大中型商场、物流配送中心。电子秤在结构和原理上取代了以杠杆平衡为原理的传统机械式称量工具。相比传统的机械式称量工具,电子秤具有称量精度高、装机体积小、应用范围广、易于操作使用等优点,在外形布局、工作原理、结构和材料上都是全新的计量衡器。电子秤的设计首先是通过压力传感器采集到被测物体的重量并将其转换成电压信号。输出电压信号通常很小,需要通过前端信号处理电路进行准确的线性放大。放大后的模拟电压信号经A/D转换电路转换成数字量被送入到主控电路的单片机中,再经过单片机控制译码显示器,从而显示出被测物体的重量。

目前市场上使用的称量工具,或者是结构复杂,或者运行不可靠,且成本高,精度稳定性不好,调正时间长,易损件多,维修困难,装机容量大,能源消耗大,生产成本高。而且目前市场上电子秤产品的整体水平不高,部分小型企业产品质量差且技术力量薄弱,设备不全,缺乏产品的开发能力,产品质量在低水平徘徊。因此,有针对性地开发出一套有实用价值的电子秤系统,从技术上克服上述诸多缺点,改善电子秤系统在应用中的不足之处,具有现实意义。

3.相关器件介绍:

本设计系统以单片机Atmega16为控制核心,实现电子秤的基本控制功能。在设计系统时,为了更好地采用模块化设计法,分步设计了各个单元功能模块。

系统的硬件部分包括最小系统部分、数据采集部分、人机交互界面三大部分。最小系统是Atmega16的最小系统;数据采集部分由称重传感器czl-a和A/D转换部分hx711模块组成;人机界面部分为键盘输入,1602液晶显示器,可以直观的显示重量的具体数字以及方便的输入数据以设定单价和预定重量,使用方便。 功能:

系统的软件部分应用单片机C语言进行编程,实现了该设计的全部控制功能。该电子秤可以实现基本的称重功能(称重范围为0~1Kg,重量误差不大于±0.005Kg),可以设定商品的单价和想要的重量,并计算总价,同时相应结果均显示在1602上。此外, 当超重时,相应的灯会亮起以警示。

称重硬件结构框图: 结构图: czl-a10KG压力传感器 A/D转换 hx711模块 Atmega16

键盘 1602液晶显示相应数值 Atmega16:

选择了ATmega16通用的比较普通单片机来实现系统设计。ATmega16是基于增强

的AVR RISC结构的低功耗8 位CMOS微控制器。由于其先进的指令集以及单时钟周期指令执行时间,ATmega16 的数据吞吐率高达1 MIPS/MHz,从而可以减缓系统在功耗和处理速度之间的矛盾。

ATmega16 AVR 内核具有丰富的指令集和32 个通用工作寄存器。所有的寄存器都直接与运算逻单元(ALU) 相连接,使得一条指令可以在一个时钟周期内同时访问两个独立的寄存器。这种结构大大提高了代码效率,并且具有比普通的CISC 微控制器最高至10 倍的数据吞吐率。

ATmega16 有如下特点:16K字节的系统内可编程Flash(具有同时读写的能力,即RWW),512 字节EEPROM,1K 字节SRAM,32 个通用I/O 口线,32 个通用工作寄存器,用于边界扫描的JTAG 接口,支持片内调试与编程,三个具有比较模式的灵活的定时器/ 计数器(T/C),片内/外中断,可编程串行USART,有起始条件检测器的通用串行接口,8路10位具有可选差分输入级可编程增益(TQFP 封装) 的ADC ,具有片内振荡器的可编程看门狗定时器,一个SPI 串行端口,以及六个可以通过软件进行选择的省电模式。

工作于空闲模式时CPU 停止工作,而USART、两线接口、A/D 转换器、SRAM、T/C、SPI 端口以及中断系统继续工作;掉电模式时晶体振荡器停止振荡,所有功能除了中断和硬件复位之外都停止工作;在省电模式下,异步定时器继续运行,允许用户保持一个时间基准,而其余功能模块处于休眠状态; ADC 噪声抑制模式时终止CPU 和除了异步定时器与ADC 以外所有I/O 模块的工作,以降低ADC 转换时的开关噪声; Standby 模式下只有晶体或谐振振荡器运行,其余功能模块处于休眠状态,使得器件只消耗极少的电流,同时具有快速启动能力;扩展Standby 模式下则允许振荡器和异步定时器继续工作。

本芯片是以Atmel 高密度非易失性存储器技术生产的。片内ISP Flash 允许程序存储器通过ISP 串行接口,或者通用编程器进行编程,也可以通过运行于AVR 内核之中的引导程序进行编程。引导程序可以使用任意接口将应用程序下载到应用Flash存储区

(ApplicationFlash Memory)。在更新应用Flash存储区时引导Flash区(Boot Flash Memory)的程序继续运行,实现了RWW 操作。 通过将8 位RISC CPU 与系统内可编程的Flash 集成在一个芯片内, ATmega16 成为一个功能强大的单片机,为许多嵌入式控制应用提供了灵活而低成本的解决方案。

ATmega16 具有一整套的编程与系统开发工具,包括:C 语言 编译器、宏汇编、 程序调试器/ 软件仿真器、仿真器及评估板。 czl-a10KG压力传感器:

czl-a是压力传感器的一种。压力传感器是工业实践中最为常用的一种传感器。一般普通压力传感器的输出为模拟信号,模拟信号是指信息参数在给定范围内表现为连续的信号。 或在一段连续的时间间隔内,其代表信息的特征量可以在任意瞬间呈现为任意数值的信号。而我们通常使用的压力传感器主要是利用压电效应制造而成的,这样的传感器也称为压电传感器。

压力传感器是使用最为广泛的一种传感器。传统的压力传感器以机械结构型的器件为主,

以弹性元件的形变指示压力,但这种结构尺寸大、质量轻,不能提供电学输出。随着半导体技术的发展,半导体压力传感器也应运而生。其特点是体积小、质量轻、准确度高、温度特性好。特别是随着MEMS技术的发展,半导体传感器向着微型化发展,而且其功耗小、可靠性高。

hx711:

HX711是一款专为高精度电子秤而设计的24位A/D转换器芯片。与同类型其它芯片相比,该芯片集成了包括稳压电源、片内时钟振荡器等其它同类型芯片所需要的外围电路,具有集成度高、响应速度快、抗干扰性强等优点。降低了电子秤的整机成本,提高了整机的性能和可靠性。该芯片与后端MCU 芯片的接口和编程非常简单,所有控制信号由管脚驱动,无需对芯片内部的寄存器编程。输入选择开关可任意选取通道A 或通道B,与其内部的低噪声可编程放大器相连。通道A 的可编程增益为128 或64,对应的满额度差分输入信号幅值分别为±20mV或±40mV。通道B 则为固定的64 增益,用于系统参数检测。芯片内提供的稳压电源可以直接向外部传感器和芯片内的A/D 转换器提供电源,系统板上无需另外的模拟电源。芯片内的时钟振荡器不需要任何外接器件。上电自动复位功能简化了开机的初始化过程。

1602液晶显示屏:

工业字符型液晶,能够同时显示16x02即32个字符。(16列2行)

1602液晶也叫1602字符型液晶,它是一种专门用来显示字母、数字、符号等的点阵型液晶模块。它由若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用,正因为如此所以它不能很好地显示图形(用自定义CGRAM,显示效果也不好)。

1602LCD是指显示的内容为16X2,即可以显示两行,每行16个字符液晶模块(显示字符和数字)。

市面上字符液晶大多数是基于HD44780液晶芯片的,控制原理是完全相同的,因此基于HD44780写的控制程序可以很方便地应用于市面上大部分的字符型液晶。

4.要流程图如下:

开始

系统初始化

设置单价与预定重量

读取重量并计算总价 读取的重量比较预定重量 大于 红灯亮 小于 显示相应数值

以压力传感器为核心的智能监测及控制来实现单片机智能控制电子秤的称重目标。

5.protel dxp 设计的相应原理图和pcb图

6.相应代码: /*

* AVRGCC1.c *

* Created: 2013/5 * Author: wangjinxin */

#include

#include

#define BIT(X) (1<

uchar press_test() {

if((PINA&0XF0)!=0XF0) return 1;

else return 0; }

void setup() {

uchar i=0,key_value; //_delay_ms(2); if (press_test()) { for (i=0;i<4;i++) { PORTA=~BIT(i); //将第i位输出低电平 _delay_us(3); //使输出电平稳定 if ((PINA&0xf0)!=0xf0) { break; } } key_value=PINA; while(press_test()); switch(key_value) { case 0x7E :setup1=~setup1;uporew=0;break; case 0x7D :setup1=~setup1;uporew=1;break; case 0x7B :up1=0;ew1=0;wei=1000;break;

default: break; } }

PORTA=0xf0; //端口复位,保证正常进入下一次检测 _delay_us(5); }

void press_show() //按键执行函数 {

uchar i=0,key_value; //_delay_ms(2); if (press_test()) { for (i=0;i<4;i++) { PORTA=~BIT(i); //将第i位输出低电平 _delay_us(3); //使输出电平稳定 if ((PINA&0xf0)!=0xf0) { break; } } key_value=PINA; while(press_test()); switch(key_value) { case 0x7E :setup1=~setup1;uporew=0; break; case 0xBE : if(uporew==0)up1+=1*wei;else ew1+=1*wei; break; case 0xDE : if(uporew==0)up1+=2*wei;else ew1+=2*wei; break; case 0xEE :if(uporew==0)up1+=3*wei;else ew1+=3*wei; break; case 0x7D :setup1=~setup1;uporew=1; break; case 0xBD : if(uporew==0)up1+=4*wei;else ew1+=4*wei; break; case 0xDD : if(uporew==0)up1+=5*wei;else ew1+=5*wei; break; case 0xED : if(uporew==0)up1+=6*wei;else ew1+=6*wei; break; case

0x7B :ew1=0;up1=0;wei=1000;/*if(uporew==0)up1=(up1/100/wei)*100*wei;else ew1=(ew1/100/wei)*100*wei; wei=100*wei;if(wei>10000)wei=10000;*/break;

case 0xBB : if(uporew==0)up1+=7*wei;else ew1+=7*wei; break; case 0xDB : if(uporew==0)up1+=8*wei;else ew1+=8*wei; break; case 0xEB :if(uporew==0)up1+=9*wei;else ew1+=9*wei; break; case 0x77 :if(uporew==0){up1=0;wei=1;} break; case 0xB7 :if(uporew==1){ ew1=0;wei=1;} break; case 0xD7 : if(uporew==0)up1+=0*wei;else ew1+=0*wei;break; case 0xE7 :break; default: break; } wei=wei/10; if(wei==0.1) wei=1000; }

PORTA=0xf0; //端口复位,保证正常进入下一次检测 _delay_us(5); }

void write_com(uchar com) {

PORTB&=~BIT(4); PORTB&=~BIT(5); PORTD=com; PORTB|=BIT(6); _delay_ms(1);

PORTB&=~BIT(6); }

void write_dat(uchar dat) {

PORTB|=BIT(4); PORTB&=~BIT(5); PORTD=dat; PORTB|=BIT(6); _delay_ms(1);

PORTB&=~BIT(6); }

void write(uchar t,uchar a[]) {

uchar j; uchar i=0;

for (j=t;i<3;j++,i++)

{

write_com(j); write_dat(a[i]); } }

void writedate(uchar t,unsigned long da) {

uchar j; uchar i=0; uchar c[4];

c[0]=da000/1000; c[1]=da00/100; c[2]=da0/10;

c[3]=da;//(da-(uchar)da)*10;//da000/1000;//(da-(uchar)da)*10; for (j=t;i<4;j++,i++) {

if(i==3)

{write_com(j); write_dat('.'); write_com(j+1); write_dat(c[i]+48);} else

{write_com(j);

write_dat(c[i]+48);} } }

unsigned long readweight() {

unsigned long count;//,c; //int cc; //c=0; uchar i; uchar j=23; DDRC|=0x01; PORTC|=0x01; _delay_us(2); PORTC&=~0x02; count=0;

DDRC&=~0x01; PORTC|=0x01;

while(PINC&0x01==0x01); for(i=0;i<24;i++) {

PORTC|=0x02;

count=count<<1; PORTC&=~0x02;

if(PINC&0x01==0x01) count++; // c+=(count%2)*(2^j); // count=count^0x800000; j--; }

PORTC|=0x02;

count=count^0x800000; _delay_us(2);

PORTC&=~0x02; return count; }

int main() {

unsigned long wt2; uchar i=0; DDRA=0x0f; 出,高四位设置为输入 PORTA=0Xf0; 出低电平,高四位端口设置为输带上拉的输入 DDRC|=0x02;

DDRC|=0X08|0X10; PORTC&=~0X10; PORTC&=~0x08; DDRD=0XFF;

DDRB|=BIT(4)|BIT(5)|BIT(6); //PORTB&=~BIT(6); write_com(0X38); _delay_ms(15); write_com(0X01); _delay_ms(15); write_com(0X0F); _delay_ms(15); write_com(0X06); _delay_ms(15); write_com(0X80); _delay_ms(15); //初始化 while(1) {

setup();

while(setup1) {

//将PD口低四位设置为输//将PD口低四位设置为输

if(uporew==0) {if(wei==1000)

{write_com(0x80+3); write_com(0x0f);} else if(wei==100)

{write_com(0x80+4);write_com(0x0f);} else if(wei==10) {write_com(0x80+5);write_com(0x0f);} else {write_com(0x80+7);write_com(0x0f);}} else {if(wei==1000)

{write_com(0x80+11);write_com(0x0f);} else if(wei==100)

{write_com(0x80+12);write_com(0x0f);} else if(wei==10) { write_com(0x80+13);write_com(0x0f);} else {write_com(0x80+15);write_com(0x0f);}} press_show(); if(uporew==0)

writedate(0x83,up1); else

writedate(0x83+0x08,ew1); //////////// if(uporew==0) {if(wei==1000)

{write_com(0x80+3); write_com(0x0f);} else if(wei==100)

{write_com(0x80+4);write_com(0x0f);} else if(wei==10) {write_com(0x80+5);write_com(0x0f);} else {write_com(0x80+7);write_com(0x0f);}} else {if(wei==1000)

{write_com(0x80+11);write_com(0x0f);} else if(wei==100)

{write_com(0x80+12);write_com(0x0f);} else if(wei==10) { write_com(0x80+13);write_com(0x0f);} else {write_com(0x80+15);write_com(0x0f);}}

// setup(); }

wei=1000;

wt2=readweight(); wt1=wt2/1000;

wt1=(unsigned long)((float)wt1/4.3-1976); wt1=(unsigned long)(float)wt1*89.75; if(wt1>9999) wt1=0; if (wt1>ew1) { PORTC|=0x08;PORTC&=~0X10;} else PORTC&=~0x08;

tp1=up1*wt1/5000; write(0x80,up);

writedate(0x83,up1); write(0x80+0x08,ew);

writedate(0x83+0x08,ew1); write(0x80+0x40,wt);

writedate(0x83+0x40,wt1); write(0x88+0x40,tp);

writedate(0x88+0x43,tp1); //write_com(0x80+3); _delay_ms(6); } }

7.实验小结:

本文来源:https://www.bwwdw.com/article/tv22.html

Top