基于51单片机电子秤设计

摘要

电子秤是日常生活中常用的称重设备,广泛应用于超市、大中型商场、物流配送中心。电子秤在结构和原理上取代了以杠杆平衡为原理的传统机械式称量工具。相比传统的机械式称量工具,电子秤具有称量精度高、装机体积小、应用范围广、易于操作使用等优点,在外形布局、工作原理、结构和材料上都是全新的计量衡器。

微电子技术的发展为电子秤提出了改进的空间。电子秤向着简单、便宜发展,智能化、精确的电子秤成为了人们的追求。本简易电子秤以常见的AT89C51为核心,以电阻应变片采集应变数据,通过HX711放大并进行AD转换供单片机处理,用LCD1602显示所测量的重量,同时本电子秤系统还提供单价设置进行求价格的计算以及去皮功能,通过一些简单低成本的元器件就完成了一个功能齐全的电子秤的制作,将传统电子秤的成本进行了缩减。

关键词:电阻应变片 AT89C51 HX711 电子秤

第一章 方案与论证

一、方案类型

(一)方案一

通过单片机为主控芯片,用应变片采集应变数据,通过专用仪表放大器INA128对采集到的信号进行放大,在配上模数转换芯片对放大了的模拟信号转化为数字信号,传入单片机中进行数据处理,找出函数关系并转化关系。通过数字信号转化为重量值显示在LDC1602上,同时通过键盘进行数据输入,输入单价、去皮等功能。通过蜂鸣器和二极管实现超额报警功能。

(二)方案二

以单片机为主控芯片,应变片采集应变数据,将放大和模数转换用HX711芯片来同时进行实现,将模拟量传入主控芯片单片机中进行数据转换,通过函数关系转换为重量显示到LED上或者LCD1602上,同时通过键盘按键进行数据输入,输入单价、去皮等功能,并通过蜂鸣器进行数据处理。

(三)方案三

运用PLC作为主控制器,PLC运用广泛,它具有接线简单,通用性好,编程简单,使用方便,可连接为控制网络系统,易于安装,便于维护等优点。

二、方案论证与选定

运用51单片机作为主控芯片,AT89C51是一种高效微控制器。它为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。但方案一中,放大和AD转换模块为独立模块,它们的独立设计费事费力且还会存在误差较大的情况。相比于方案一,方案二一HX711作为放大和AD转换芯片,简化了电路结构。HX711是一款专为高精度电子秤设计的24位AD转换器芯片。与同类型其他芯片相比,该芯片集成了包括文雅电源、片内时钟振荡器等其它同类型芯片所需要的外围电路,具有集成度高、响应速度快、抗干扰性强等优点。精度方面很好的满足了题目中的要求,相比于方案一,方案二根据可行性。

方案三采用PLC作为主控芯片,但其价格昂贵,违背了我们制作电子秤的简单、便捷、便宜的原则,所以我们并没考虑选用PLC作为主控芯片。

综合考虑后,我们决定选择方案二来进行本简易电子秤系统的设计与制作。通过精度、价格、简单程度出发考虑,方案二是最合适的。

第二章 设计方案

一、 设计思路

图2-1总体思路图

图2-2 具体思路

二、 各部分设计

(一)传感器部分设计

传感器应题目要求选用电阻应变片,是用于测量应变的元件。它能将机械构件上应变的变化转换为电阻变化。为了减少测量误差,本简易电子秤系统采用全桥差动形式,全桥差动测量电路不仅没有非线性测量误差,且电压灵敏度是单臂电阻应变片工作时的四倍,运用全桥差动[1]使得本电子秤系统更加稳定和可靠。

图2-3 全桥差动电路

(二)主控芯片

主控芯片是电子秤的核心部分,它能接受转换后的传感器信号,同时也能扫描接受到键盘的输入信号,计算价格后控制显示器的输出,能够实现去皮功能,当超过称重量量程时还要控制报警装置报警。

本简易电子秤选用AT89C51作为主控芯片,AT89C51是一种带4K字节 FLASH存储器的低电压、高性能CMOS 8位微处理器,俗称单片机。AT89C2051是一种带2K字节闪存可编程可擦除只读存储器的单片机。单片机的可擦除只读存储器可以反复擦除1000次。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪速存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,AT89C051是它的一种精简版本。AT89C51单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。

51单片机的操作简单,功能强大,价格便宜。运用51单片机作为主控芯片可以减少成本,而且制作简便,能够实现本系统的所有功能,是一个不错的选择。

(三)放大与AD转换模块

在系统总体设计时,我们考虑到了将放大与AD转换作为单独的模块进行设计,但是思考后发现这其中还有更好的选择。HX711是一款专为高精度电子秤而设计的24位A/D转换器芯片。与同类型其它芯片相比,该芯片集成了包括稳压电源、片内时钟振荡器等其它同类型芯片所需要的外围电路,具有集成度高、响应速度快、抗干扰性强等优点。同时HX711还自带放大功能,可选增益为64和128两种。运用HX711保证了题目要求的高精度,可实现精度误差控制在01g以内,保证了我们完成题目的要求。

(四)键盘方案

针对题目要求,需要我们输入单间进行计算,单价包含0-9十个数字,数字键占用十个,确定和清除占用两个,去皮占用一个,复位占用一个。去皮键、复位键、清除键单独用一个IO口引出;将十个数字键、确定键、计算总价键十二个键制成3x4的矩阵键盘[2]。通过设计成矩阵键盘的模式而减少单片机IO口的占用,为其他功能腾出空间。

图2-4 3x4矩阵键盘

第三章 电路设计

一、单片机最小系统电路

AT89C51是片内有ROM/EPROM的单片机,其最小系统简单、可靠,仅由时钟电路、复位电路、电源电路构成。

(一)时钟电路

AT89C51虽然有内部振荡电路,但要形成时钟,必须外部附加电路。AT89C51单片机的时钟产生方法有两种。内部时钟方式和外部时钟方式。

本设计采用最常用的内部时钟方式,即用外接晶体和电容组成的并联谐振回路。振荡晶体可在1.2MHZ到12MHZ之间选择。电容取值对振荡频率输出的稳定性、大小、振荡电路起振速度有少许影响,可在20pF到100pF之间取值。所以本设计中,振荡晶体选择12MHZ,电容选择22pF。

(二)复位电路

AT89C51的复位电路是由外部的复位电路来实现的。只需给复位引脚RST加上大于2个机器周期的高电平就可使其复位。复位电路通常采用上电自动复位和按键复位两种方式。本设计就是用的按键手动复位。其中电平复位是通过RST端经电阻与电源Vcc接通而实现的。

(三)电源电路

AT89C51的电源脚分别为20脚Vss和40脚Vcc。这两个脚分别接地和+5V直流电源,31脚EA为内外存储器的控制端,接+5V允许访问外部存储器。

图3-1 晶振电路和复位电路

二、AD转换电路

HX711是一款专为高精度称重传感器而设计的24位A/D转换器芯片。与同类型其它芯片相比,该芯片集成了包括稳压电源、片内时钟振荡器等其它同类型芯片所需要的外围电路,具有集成度高、响应速度快、抗干扰性强等优点、降低了电子秤的整机成本,提高了整机的

性能和可靠性。该芯片与后端MCU芯片的接口和编程非常简单,所有控制信号由管脚驱动,无需对芯片内部的寄存器编程。输入选择开关可任意选取通道A或通道B,与其内部的低噪声可编程放大器相连。通道A的可编程增益为128或64,对应的满额度差分输入信号幅值分别为±20mV或±40mV。通道B则为固定的64增益,用于系统参数检测。芯片内提供的稳压电源可以直接向外部传感器和芯片内的A/D转换器提供电源,系统板上无需另外的模拟电源。芯片内的时钟振荡器不需要任何外接部件。上电自动复位功能简化了开机的初始化过程。

图3-2 HX711模块电路

三、LCD1602显示电路

本设计采用的是LCD1602显示,LCD1602液晶也叫1602字符型液晶它是一种专门用来显示字母、数字、符号等的点阵型液晶模块它有若干个5×7或者5×11等点阵字符位组成,每个点阵字符位都可以显示一个字符。每位之间有一个点距的间隔每行之间也有间隔起到了字符间距和行间距的作用,正因为如此所以他不能显示图形。1602LCD是指显示的内容为16×2,即可以显示两行,每行16个字符液晶模块。

图3-3 LCD1602电路

四、总设计电路

图3-4 系统总电路

第四章 测试方法与测试结果

一、测试方法

由于本系统是一个简易电子秤系统,所以最好的测量方法就是通过测量标准砝码的质量来比对本电子秤系统的测量显示值。以测量结果显示值减去砝码质量再除以砝码质量得出误差百分比,同时也得出精确程度。

(一)键盘测量与LCD1602测量

键盘与LCD1602的测量我们放在一起进行,编写按键与LCD1602显示函数,将对应按键编码成0-9,按下按键通过LCD1602来进行显示所按下键盘的数值,通过这种方法我们同时测量了键盘与LCD1602的功能,保证了电路焊接的正确性。

(二)模数转换对应数值测量

将HX711连接到电路中,通过LCD1602来显示转换后的数值信号,依次将10g、20g、30g、40g到500g的砝码放到秤盘上,依次独处LCD1602的显示数值,将这五十组数据放入到Excel表格中,通过Excel绘制线性图形。通过线性图形拟合出线性函数关系。

(三)测量质量检测

分别用10g、20g、50g、100g、200g、500g的砝码放到本简易电子系统的秤盘上,比对测量显示值,求出误差百分比和测量精度。

除此之外,我们还用一个10克、两个2克砝码组成一个五十克砝码;一个10克砝码、两个20克砝码和一个50克砝码组成一个100克方法等组合放在秤盘中心进行测量,以此来确定本简易电子秤系统的精确度。

二、测量结果

(一)AD转换后数值信号值与砝码质量的对应关系

表4-1 AD值与砝码质量(g)的对应关系

通过表中的数据,通过Excel折线图进行拟合,拟合出的结果为数据呈现线性关系,这满足应变片的性质,得出的转换函数为:y=0.1185x+1085.8145。

图4-1 折线图

(二)简易电子秤测量结果与标准砝码比对关系

在确定了函数转换关系之后,电子秤的制作基本快要完成,将函数关系编写到程序中就实现电子秤的制作。将10g-500g依次增长10g的砝码放入到秤盘中,比对标准砝码值与测量显示值之间的关系发现误差基本控制在1g之内,0-50g期间大致控制在了0.5g的范围内,基本完成了题目所给要求。

三、测量结论

本简易电子秤系统达到了题目要求,拥有输入单价求价格的功能,同时还能满足价格的叠加在单片机芯片中计算而不用,输入一个记录一个值那么麻烦。同时本电子称系统也完成了去皮功能,清除,复位功能,甚至还设置了超上限报警装置报警值上限为550g。

参考文献

[1]胡向东,李锐,耿道渠等[M].传感器与检测技术第2版.北京.机械工业出版社.2013.37-38

[2]郭天祥.51单片机C语言教程[M].北京.电子工业出版社.2009.86

附录

一、HX711代码

#include "lcd1602.h"

#include

#include "hx711.h"

#include

sbit ADDO = P2^4;

sbit ADSK = P2^3;

/************************************************************** extern unsigned long ReadAD(void);

.

.

unsigned long data;

data=ReadAD();

.

-------------------------------------------------------------*/ ulong ReadCount(void)

{

ulong Count;

uchar i;

ADSK=0; //使能AD(PD_SCK 置低)

Count=0;

while(ADDO); //AD转换未结束则等待,否则开始读取

for (i=0;i

{

ADSK=1; //PD_SCK 置高(发送脉冲)

Count=Count

if(ADDO) Count++;

}

ADSK=1;

Count=Count^0x800000; //第25个脉冲下降沿来时,转换数据

ADSK=0;

return(Count);

}

二、键盘代码

#include

#include "lcd1602.h"

#include "key.h"

uchar num,s = 5;

uchar price = 0;

uchar code table1[] = {"0123456789"};

str2[] = {"Price: "};

uchar code str3[] = {"Total: "};

void display_cost(uchar price) //

{

uchar w[5],i = 5;

w[0] = price/10000;

w[1] = price%10000/1000;

w[2] = price%1000/100;

w[3] = price%100/10;

w[4] = price%10;

while(i != 10)

{

DisplayOneChar(i,1,w[i-5]);

i++;

}

}

/**********键盘扫描子程序************/

//void temer1() interrupt 3

void keyscan(void)

{

uchar temp;

P1 = 0XFE;

temp = P1;

temp = temp&0xf0;

if(temp != 0xf0) 显示单项称量价格

} P1 = 0XFd; temp = P1; temp = temp&0xf0; if(temp != 0xf0) { delay(5); temp = P1; temp = temp&0xf0; temp = P1; temp = temp&0xf0; while(temp != 0xf0) { } temp = P1; switch(temp) { } while(temp!=0xf0) { } price = price*10+num; DisplayOneChar(s,1,table1[num]); temp=P1; temp=temp&0xf0; case 0xbe:num=1;s++;break; case 0xde:num=2;s++;break; case 0xee:num=3;s++;break; //case 0x7e:num=4;k='/';s++;break;

} } temp = P1; switch(temp) { } while(temp!=0xf0) { } price = price*10+num; DisplayOneChar(s,1,table1[num]); temp=P1; temp=temp&0xf0; case 0xbd:num=4;s++;break; case 0xdd:num=5;s++;break; case 0xed:num=6;s++;break; //case 0x7d:num=8;k='*';s++;break; P1 = 0XFb; temp = P1; temp = temp&0xf0; if(temp != 0xf0) { delay(5); temp = P1; temp = temp&0xf0; while(temp != 0xf0) { temp = P1; switch(temp)

} } } while(temp!=0xf0) { } DisplayOneChar(s,1,table1[num]); temp=P1; temp=temp&0xf0; case 0xdb:num=8;s++;break; case 0xeb:num=9;s++;break; //case 0x7b:num=12;k='-';s++;break; P1 = 0XF7; temp = P1; temp = temp&0xf0; if(temp != 0xf0) { delay(5); temp = P1; temp = temp&0xf0; while(temp != 0xf0) { temp = P1; switch(temp) { case 0xb7:num='-';s++;break; case 0xd7:num=0;s++;break; case 0xe7:num='=';s++;break;

} } } while(temp!=0xf0) { } if(num == 0) { } else if(num == '-') { } else { } DisplayListChar(0, 1, 16,str3); display_cost(price); s = 5; price = 0; DisplayListChar(0, 1, 16,str2); price = price*10+num; DisplayOneChar(s,1,table1[num]); temp=P1; temp=temp&0xf0;

三、LCD1602

#include

#include

#include "lcd1602.h"

sbit rs = P2^0;

sbit LCM_RW = P2^1;

sbit lcden = P2^2;

/********延时程序K*1ms,12000mhz****************/

void delay(uint k)

{

uint i,j;

for(i = 0; i

for(j = 0; j

}

/*********写指令到LCM子函数****************/

void WriteCommandLCM(uchar com)

{

P0=com;

rs=0;

lcden=0;

delay(1);

lcden=1;

delay(1);

lcden=0;

}

/************写数据到LCM子函数****************/

void WriteDataLCM(uchar date)

{

P0=date;

rs=1;

lcden=0;

delay(1);

lcden=1;

delay(1);

lcden=0;

}

/*************LCM初始化子函数****************/

void initLCM()

{

WriteCommandLCM(0x38);

delay(10);

WriteCommandLCM(0x0f);

delay(10);

WriteCommandLCM(0x06);

delay(10);

WriteCommandLCM(0x01);

delay(10);

}

/************显示指定坐标的一个字符子函数********/

void DisplayOneChar(uchar X, uchar Y, uchar DData)

{

Y &= 0x01;

X &= 0x0f;

if(Y)

X |= 0x40; //若y为1(显示第二行),地址码加0x40

X |= 0x80; //指令码为地址码+0x80

WriteCommandLCM(X);

WriteDataLCM(DData);

}

/********显示指定坐标的一串字符子函数********/

void DisplayListChar(uchar X, uchar Y, uchar length,uchar code *DData) {

uchar ListLength = 0;

Y &= 0x01;

X &= 0x0f;

while(X

{

DisplayOneChar(X,Y,DData[ListLength]);

ListLength++;

X++;

}

}

四、主函数

#include

#include

#include

#include

#include "lcd1602.h"

#include "hx711.h"

sbit speaker = P2^7;

sbit qupi = P3^7;

sbit qingling = P3^6;

int weight;

uchar num,s = 5;

ulong ad_data = 0;

ulong cost = 0,total = 0;

ulong price = 0;

uchar flag_ok = 0; //ok键的按键次数

uchar pi = 0;

uchar flag_dian = 0,dian = 1; //小数点的位数,和小数点标志 uchar flag_dian_all = 0;

uchar dian_max = 1; //最大的点的位数

uchar flag_jian = 0;

uchar cha=0,flag_jia=0,flag_jian;

uchar code str0[] = {"Weight: g "};

uchar code str1[] = {"cost: "};

uchar code str2[] = {"Price: "};

uchar code str3[] = {"Total: "};

uchar code table1[] = {"0123456789"};

void alarm(void);

void keyscan(void); //键盘扫描函数

void display_cost(ulong price) //显示单项称量价格 {

uchar w[5],i,j,wei;

w[0] = price/10000;

w[1] = price%10000/1000;

w[2] = price%1000/100;

w[3] = price%100/10;

w[4] = price%10;

if(flag_ok == 1)

{

wei = 5; i = 5;

// if(flag_dian == 1)

// j = 11;

// else

// j = 10;

while(wei != 11)

{

// if(flag_dian==1&&wei == 10-dian)

if(wei == 10-dian)

DisplayOneChar(wei,1,'.');

else

{

DisplayOneChar(wei,1,table1[w[i-5]]);

i++;

}

wei++;

}

}

else

{

wei = 6; i = 6;

// if(flag_dian_all==1)

// j = 12;

// else

// j = 11;

while(wei != 12)

{

// if(flag_dian_all==1&&wei == 11-dian_max) if(wei == 11-dian_max)

DisplayOneChar(wei,1,'.');

else

{

DisplayOneChar(wei,1,table1[w[i-6]]); i++;

}

wei++;

}

}

}

void ad_change(ulong price)

{

uchar w[5],i;

uchar ge,bai,shi,qian;

int aver = 0;

double z = 0;

w[0] = price/10000000;

w[1] = price%10000000/1000000;

w[2] = price%1000000/100000;

w[3] = price%100000/10000;

w[4] = price%10000/1000;

// DisplayOneChar(0,1,table1[w[0]]);

// DisplayOneChar(1,1,table1[w[1]]);

// DisplayOneChar(2,1,table1[w[2]]);

// DisplayOneChar(3,1,table1[w[3]]);

// DisplayOneChar(4,1,table1[w[4]]);

for(i = 0; i

{

z = z*10+w[i];

}

// weight = (1093.8-0.1196*z)*10.0; //初始 // aver += weight;

weight = (1085.8-0.1185*z)*10.0; //第二次 aver += weight;

weight = (1082.6-0.1182*z)*10.0; //第三次 aver += weight;

/***********第三次,,分段*******************/ if(z > 8700)

weight = (1079.6-0.1177*z)*10.0;

else if(z > 8290)

weight = (1087.5-0.1186*z)*10.0;

else if(z > 7850)

weight = (1077-0.1174*z)*10.0;

else if(z > 7410)

weight = (1068.3-0.1163*z)*10.0;

else if(z > 7000)

weight = (1080.8-0.1179*z)*10.0;

else if(z > 6590)

weight = (1086.1-0.1187*z)*10.0;

else if(z > 6170)

weight = (1100.4-0.1209*z)*10.0;

else if(z > 5730)

weight = (1080.8-0.1177*z)*10.0; else if(z > 5330)

weight = (1114.9-0.1238*z)*10.0;

else

weight = (1114-0.1236*z)*10.0;

aver += weight;

weight = aver/3;

// if(weight

// {

// cha = -weight;

// flag_jia = 1;

// flag_jian = 0;

// weight = 0;

// }

// else if(weight

// {

// cha = weight;

// flag_jian = 1;

// flag_jia = 0;

// weight = 0;

// }

// else

// {

// if(flag_jia == 1)

// weight = weight+cha;

// if(flag_jian == 1)

// weight -= cha;

// }

qian = weight/1000;

bai = weight%1000/100;

shi = weight%100/10;

ge = weight%10;

DisplayOneChar(7,0,table1[qian]);

DisplayOneChar(8,0,table1[bai]);

DisplayOneChar(9,0,table1[shi]);

DisplayOneChar(10,0,'.');

DisplayOneChar(11,0,table1[ge]);

DisplayOneChar(12,0,'g');

}

/*************主程序***************/

void main()

{

delay(500); //系统延时500ms启动 initLCM();

WriteCommandLCM(0x01); //清屏显示

DisplayListChar(0,0,16,str0);

DisplayListChar(0,1,16,str2);

while(1)

{

ad_data = ReadCount();

ad_change(ad_data);

keyscan();

alarm();

}

}

/*************报警值函数******************/ void alarm(void)

{

if(weight>5500)

speaker = 0; //则启动报警

else

speaker = 1;

}

/**********键盘扫描子程序************/

//void temer1() interrupt 3

void keyscan(void)

{

uchar temp;

P1 = 0XFE;

if(temp != 0xf0) { delay(5); temp = P1; temp = temp&0xf0; while(temp != 0xf0) { temp = P1; switch(temp) { case 0xbe:num=1;s++;break; case 0xde:num=2;s++;break; case 0xee:num=3;s++;break; //case 0x7e:num=4;k='/';s++;break; } while(temp!=0xf0) { temp=P1; temp=temp&0xf0; } if(flag_jian == 0) { if(flag_dian == 1) dian++; price = price*10+num; DisplayOneChar(s,1,table1[num]); } } } P1 = 0XFd; temp = P1; temp = temp&0xf0; if(temp != 0xf0) { delay(5); temp = P1; temp = temp&0xf0; while(temp != 0xf0) { temp = P1; switch(temp) { case 0xbd:num=4;s++;break; case 0xdd:num=5;s++;break;

} while(temp!=0xf0) { temp=P1; temp=temp&0xf0; } if(flag_jian == 0) { if(flag_dian == 1) dian++; price = price*10+num; DisplayOneChar(s,1,table1[num]); } } } P1 = 0XFb; temp = P1; temp = temp&0xf0; if(temp != 0xf0) { delay(5); temp = P1; temp = temp&0xf0; while(temp != 0xf0) { temp = P1; switch(temp) { case 0xbb:num=7;s++;break; case 0xdb:num=8;s++;break; case 0xeb:num=9;s++;break; //case 0x7b:num=12;k='-';s++;break; } while(temp!=0xf0) { temp=P1; temp=temp&0xf0; } if(flag_jian == 0) { if(flag_dian == 1) dian++; price = price*10+num; DisplayOneChar(s,1,table1[num]);

} P1 = 0XF7; temp = P1; temp = temp&0xf0; if(temp != 0xf0) { delay(5); temp = P1; temp = temp&0xf0; while(temp != 0xf0) { temp = P1; switch(temp) { case 0xb7:num='.';s++;break; case 0xd7:num=0;s++;break; case 0xe7:num='=';s++;flag_ok++;break; //case 0x77:num=16;k='+';s++;break; } while(temp!=0xf0) { temp=P1; temp=temp&0xf0; } if(flag_jian == 0) { if(num == 0) { if(flag_dian == 1) dian++; price = price*10+num; DisplayOneChar(s,1,table1[num]); } else if(num == '.') { flag_dian_all = 1; flag_dian = 1; DisplayOneChar(s,1,'.'); } } if(num == '=') { flag_jian = 1; if(flag_ok == 1)

if(flag_dian != 1) total += cost*10; else total += cost; if(dian > dian_max) dian_max = dian; DisplayListChar(0, 1, 16,str1); display_cost(cost); } else { DisplayListChar(0, 1, 16,str3); if(flag_dian_all != 1) display_cost(total/10); else display_cost(total); } } } } if(qingling == 0) //单次清零,不会清除总的累加金额 { delay(5); if(qingling == 0) { s = 5; pi = 0; dian = 1; flag_jian = 0; flag_dian = 0; flag_ok = 0; price = 0; cost = 0; DisplayListChar(0, 1, 16,str2); while(!qingling); } } if(qupi == 0) //去皮功能 { delay(5); if(qupi == 0) { pi = weight; while(!qupi);

} } }

摘要

电子秤是日常生活中常用的称重设备,广泛应用于超市、大中型商场、物流配送中心。电子秤在结构和原理上取代了以杠杆平衡为原理的传统机械式称量工具。相比传统的机械式称量工具,电子秤具有称量精度高、装机体积小、应用范围广、易于操作使用等优点,在外形布局、工作原理、结构和材料上都是全新的计量衡器。

微电子技术的发展为电子秤提出了改进的空间。电子秤向着简单、便宜发展,智能化、精确的电子秤成为了人们的追求。本简易电子秤以常见的AT89C51为核心,以电阻应变片采集应变数据,通过HX711放大并进行AD转换供单片机处理,用LCD1602显示所测量的重量,同时本电子秤系统还提供单价设置进行求价格的计算以及去皮功能,通过一些简单低成本的元器件就完成了一个功能齐全的电子秤的制作,将传统电子秤的成本进行了缩减。

关键词:电阻应变片 AT89C51 HX711 电子秤

第一章 方案与论证

一、方案类型

(一)方案一

通过单片机为主控芯片,用应变片采集应变数据,通过专用仪表放大器INA128对采集到的信号进行放大,在配上模数转换芯片对放大了的模拟信号转化为数字信号,传入单片机中进行数据处理,找出函数关系并转化关系。通过数字信号转化为重量值显示在LDC1602上,同时通过键盘进行数据输入,输入单价、去皮等功能。通过蜂鸣器和二极管实现超额报警功能。

(二)方案二

以单片机为主控芯片,应变片采集应变数据,将放大和模数转换用HX711芯片来同时进行实现,将模拟量传入主控芯片单片机中进行数据转换,通过函数关系转换为重量显示到LED上或者LCD1602上,同时通过键盘按键进行数据输入,输入单价、去皮等功能,并通过蜂鸣器进行数据处理。

(三)方案三

运用PLC作为主控制器,PLC运用广泛,它具有接线简单,通用性好,编程简单,使用方便,可连接为控制网络系统,易于安装,便于维护等优点。

二、方案论证与选定

运用51单片机作为主控芯片,AT89C51是一种高效微控制器。它为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。但方案一中,放大和AD转换模块为独立模块,它们的独立设计费事费力且还会存在误差较大的情况。相比于方案一,方案二一HX711作为放大和AD转换芯片,简化了电路结构。HX711是一款专为高精度电子秤设计的24位AD转换器芯片。与同类型其他芯片相比,该芯片集成了包括文雅电源、片内时钟振荡器等其它同类型芯片所需要的外围电路,具有集成度高、响应速度快、抗干扰性强等优点。精度方面很好的满足了题目中的要求,相比于方案一,方案二根据可行性。

方案三采用PLC作为主控芯片,但其价格昂贵,违背了我们制作电子秤的简单、便捷、便宜的原则,所以我们并没考虑选用PLC作为主控芯片。

综合考虑后,我们决定选择方案二来进行本简易电子秤系统的设计与制作。通过精度、价格、简单程度出发考虑,方案二是最合适的。

第二章 设计方案

一、 设计思路

图2-1总体思路图

图2-2 具体思路

二、 各部分设计

(一)传感器部分设计

传感器应题目要求选用电阻应变片,是用于测量应变的元件。它能将机械构件上应变的变化转换为电阻变化。为了减少测量误差,本简易电子秤系统采用全桥差动形式,全桥差动测量电路不仅没有非线性测量误差,且电压灵敏度是单臂电阻应变片工作时的四倍,运用全桥差动[1]使得本电子秤系统更加稳定和可靠。

图2-3 全桥差动电路

(二)主控芯片

主控芯片是电子秤的核心部分,它能接受转换后的传感器信号,同时也能扫描接受到键盘的输入信号,计算价格后控制显示器的输出,能够实现去皮功能,当超过称重量量程时还要控制报警装置报警。

本简易电子秤选用AT89C51作为主控芯片,AT89C51是一种带4K字节 FLASH存储器的低电压、高性能CMOS 8位微处理器,俗称单片机。AT89C2051是一种带2K字节闪存可编程可擦除只读存储器的单片机。单片机的可擦除只读存储器可以反复擦除1000次。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪速存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,AT89C051是它的一种精简版本。AT89C51单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。

51单片机的操作简单,功能强大,价格便宜。运用51单片机作为主控芯片可以减少成本,而且制作简便,能够实现本系统的所有功能,是一个不错的选择。

(三)放大与AD转换模块

在系统总体设计时,我们考虑到了将放大与AD转换作为单独的模块进行设计,但是思考后发现这其中还有更好的选择。HX711是一款专为高精度电子秤而设计的24位A/D转换器芯片。与同类型其它芯片相比,该芯片集成了包括稳压电源、片内时钟振荡器等其它同类型芯片所需要的外围电路,具有集成度高、响应速度快、抗干扰性强等优点。同时HX711还自带放大功能,可选增益为64和128两种。运用HX711保证了题目要求的高精度,可实现精度误差控制在01g以内,保证了我们完成题目的要求。

(四)键盘方案

针对题目要求,需要我们输入单间进行计算,单价包含0-9十个数字,数字键占用十个,确定和清除占用两个,去皮占用一个,复位占用一个。去皮键、复位键、清除键单独用一个IO口引出;将十个数字键、确定键、计算总价键十二个键制成3x4的矩阵键盘[2]。通过设计成矩阵键盘的模式而减少单片机IO口的占用,为其他功能腾出空间。

图2-4 3x4矩阵键盘

第三章 电路设计

一、单片机最小系统电路

AT89C51是片内有ROM/EPROM的单片机,其最小系统简单、可靠,仅由时钟电路、复位电路、电源电路构成。

(一)时钟电路

AT89C51虽然有内部振荡电路,但要形成时钟,必须外部附加电路。AT89C51单片机的时钟产生方法有两种。内部时钟方式和外部时钟方式。

本设计采用最常用的内部时钟方式,即用外接晶体和电容组成的并联谐振回路。振荡晶体可在1.2MHZ到12MHZ之间选择。电容取值对振荡频率输出的稳定性、大小、振荡电路起振速度有少许影响,可在20pF到100pF之间取值。所以本设计中,振荡晶体选择12MHZ,电容选择22pF。

(二)复位电路

AT89C51的复位电路是由外部的复位电路来实现的。只需给复位引脚RST加上大于2个机器周期的高电平就可使其复位。复位电路通常采用上电自动复位和按键复位两种方式。本设计就是用的按键手动复位。其中电平复位是通过RST端经电阻与电源Vcc接通而实现的。

(三)电源电路

AT89C51的电源脚分别为20脚Vss和40脚Vcc。这两个脚分别接地和+5V直流电源,31脚EA为内外存储器的控制端,接+5V允许访问外部存储器。

图3-1 晶振电路和复位电路

二、AD转换电路

HX711是一款专为高精度称重传感器而设计的24位A/D转换器芯片。与同类型其它芯片相比,该芯片集成了包括稳压电源、片内时钟振荡器等其它同类型芯片所需要的外围电路,具有集成度高、响应速度快、抗干扰性强等优点、降低了电子秤的整机成本,提高了整机的

性能和可靠性。该芯片与后端MCU芯片的接口和编程非常简单,所有控制信号由管脚驱动,无需对芯片内部的寄存器编程。输入选择开关可任意选取通道A或通道B,与其内部的低噪声可编程放大器相连。通道A的可编程增益为128或64,对应的满额度差分输入信号幅值分别为±20mV或±40mV。通道B则为固定的64增益,用于系统参数检测。芯片内提供的稳压电源可以直接向外部传感器和芯片内的A/D转换器提供电源,系统板上无需另外的模拟电源。芯片内的时钟振荡器不需要任何外接部件。上电自动复位功能简化了开机的初始化过程。

图3-2 HX711模块电路

三、LCD1602显示电路

本设计采用的是LCD1602显示,LCD1602液晶也叫1602字符型液晶它是一种专门用来显示字母、数字、符号等的点阵型液晶模块它有若干个5×7或者5×11等点阵字符位组成,每个点阵字符位都可以显示一个字符。每位之间有一个点距的间隔每行之间也有间隔起到了字符间距和行间距的作用,正因为如此所以他不能显示图形。1602LCD是指显示的内容为16×2,即可以显示两行,每行16个字符液晶模块。

图3-3 LCD1602电路

四、总设计电路

图3-4 系统总电路

第四章 测试方法与测试结果

一、测试方法

由于本系统是一个简易电子秤系统,所以最好的测量方法就是通过测量标准砝码的质量来比对本电子秤系统的测量显示值。以测量结果显示值减去砝码质量再除以砝码质量得出误差百分比,同时也得出精确程度。

(一)键盘测量与LCD1602测量

键盘与LCD1602的测量我们放在一起进行,编写按键与LCD1602显示函数,将对应按键编码成0-9,按下按键通过LCD1602来进行显示所按下键盘的数值,通过这种方法我们同时测量了键盘与LCD1602的功能,保证了电路焊接的正确性。

(二)模数转换对应数值测量

将HX711连接到电路中,通过LCD1602来显示转换后的数值信号,依次将10g、20g、30g、40g到500g的砝码放到秤盘上,依次独处LCD1602的显示数值,将这五十组数据放入到Excel表格中,通过Excel绘制线性图形。通过线性图形拟合出线性函数关系。

(三)测量质量检测

分别用10g、20g、50g、100g、200g、500g的砝码放到本简易电子系统的秤盘上,比对测量显示值,求出误差百分比和测量精度。

除此之外,我们还用一个10克、两个2克砝码组成一个五十克砝码;一个10克砝码、两个20克砝码和一个50克砝码组成一个100克方法等组合放在秤盘中心进行测量,以此来确定本简易电子秤系统的精确度。

二、测量结果

(一)AD转换后数值信号值与砝码质量的对应关系

表4-1 AD值与砝码质量(g)的对应关系

通过表中的数据,通过Excel折线图进行拟合,拟合出的结果为数据呈现线性关系,这满足应变片的性质,得出的转换函数为:y=0.1185x+1085.8145。

图4-1 折线图

(二)简易电子秤测量结果与标准砝码比对关系

在确定了函数转换关系之后,电子秤的制作基本快要完成,将函数关系编写到程序中就实现电子秤的制作。将10g-500g依次增长10g的砝码放入到秤盘中,比对标准砝码值与测量显示值之间的关系发现误差基本控制在1g之内,0-50g期间大致控制在了0.5g的范围内,基本完成了题目所给要求。

三、测量结论

本简易电子秤系统达到了题目要求,拥有输入单价求价格的功能,同时还能满足价格的叠加在单片机芯片中计算而不用,输入一个记录一个值那么麻烦。同时本电子称系统也完成了去皮功能,清除,复位功能,甚至还设置了超上限报警装置报警值上限为550g。

参考文献

[1]胡向东,李锐,耿道渠等[M].传感器与检测技术第2版.北京.机械工业出版社.2013.37-38

[2]郭天祥.51单片机C语言教程[M].北京.电子工业出版社.2009.86

附录

一、HX711代码

#include "lcd1602.h"

#include

#include "hx711.h"

#include

sbit ADDO = P2^4;

sbit ADSK = P2^3;

/************************************************************** extern unsigned long ReadAD(void);

.

.

unsigned long data;

data=ReadAD();

.

-------------------------------------------------------------*/ ulong ReadCount(void)

{

ulong Count;

uchar i;

ADSK=0; //使能AD(PD_SCK 置低)

Count=0;

while(ADDO); //AD转换未结束则等待,否则开始读取

for (i=0;i

{

ADSK=1; //PD_SCK 置高(发送脉冲)

Count=Count

if(ADDO) Count++;

}

ADSK=1;

Count=Count^0x800000; //第25个脉冲下降沿来时,转换数据

ADSK=0;

return(Count);

}

二、键盘代码

#include

#include "lcd1602.h"

#include "key.h"

uchar num,s = 5;

uchar price = 0;

uchar code table1[] = {"0123456789"};

str2[] = {"Price: "};

uchar code str3[] = {"Total: "};

void display_cost(uchar price) //

{

uchar w[5],i = 5;

w[0] = price/10000;

w[1] = price%10000/1000;

w[2] = price%1000/100;

w[3] = price%100/10;

w[4] = price%10;

while(i != 10)

{

DisplayOneChar(i,1,w[i-5]);

i++;

}

}

/**********键盘扫描子程序************/

//void temer1() interrupt 3

void keyscan(void)

{

uchar temp;

P1 = 0XFE;

temp = P1;

temp = temp&0xf0;

if(temp != 0xf0) 显示单项称量价格

} P1 = 0XFd; temp = P1; temp = temp&0xf0; if(temp != 0xf0) { delay(5); temp = P1; temp = temp&0xf0; temp = P1; temp = temp&0xf0; while(temp != 0xf0) { } temp = P1; switch(temp) { } while(temp!=0xf0) { } price = price*10+num; DisplayOneChar(s,1,table1[num]); temp=P1; temp=temp&0xf0; case 0xbe:num=1;s++;break; case 0xde:num=2;s++;break; case 0xee:num=3;s++;break; //case 0x7e:num=4;k='/';s++;break;

} } temp = P1; switch(temp) { } while(temp!=0xf0) { } price = price*10+num; DisplayOneChar(s,1,table1[num]); temp=P1; temp=temp&0xf0; case 0xbd:num=4;s++;break; case 0xdd:num=5;s++;break; case 0xed:num=6;s++;break; //case 0x7d:num=8;k='*';s++;break; P1 = 0XFb; temp = P1; temp = temp&0xf0; if(temp != 0xf0) { delay(5); temp = P1; temp = temp&0xf0; while(temp != 0xf0) { temp = P1; switch(temp)

} } } while(temp!=0xf0) { } DisplayOneChar(s,1,table1[num]); temp=P1; temp=temp&0xf0; case 0xdb:num=8;s++;break; case 0xeb:num=9;s++;break; //case 0x7b:num=12;k='-';s++;break; P1 = 0XF7; temp = P1; temp = temp&0xf0; if(temp != 0xf0) { delay(5); temp = P1; temp = temp&0xf0; while(temp != 0xf0) { temp = P1; switch(temp) { case 0xb7:num='-';s++;break; case 0xd7:num=0;s++;break; case 0xe7:num='=';s++;break;

} } } while(temp!=0xf0) { } if(num == 0) { } else if(num == '-') { } else { } DisplayListChar(0, 1, 16,str3); display_cost(price); s = 5; price = 0; DisplayListChar(0, 1, 16,str2); price = price*10+num; DisplayOneChar(s,1,table1[num]); temp=P1; temp=temp&0xf0;

三、LCD1602

#include

#include

#include "lcd1602.h"

sbit rs = P2^0;

sbit LCM_RW = P2^1;

sbit lcden = P2^2;

/********延时程序K*1ms,12000mhz****************/

void delay(uint k)

{

uint i,j;

for(i = 0; i

for(j = 0; j

}

/*********写指令到LCM子函数****************/

void WriteCommandLCM(uchar com)

{

P0=com;

rs=0;

lcden=0;

delay(1);

lcden=1;

delay(1);

lcden=0;

}

/************写数据到LCM子函数****************/

void WriteDataLCM(uchar date)

{

P0=date;

rs=1;

lcden=0;

delay(1);

lcden=1;

delay(1);

lcden=0;

}

/*************LCM初始化子函数****************/

void initLCM()

{

WriteCommandLCM(0x38);

delay(10);

WriteCommandLCM(0x0f);

delay(10);

WriteCommandLCM(0x06);

delay(10);

WriteCommandLCM(0x01);

delay(10);

}

/************显示指定坐标的一个字符子函数********/

void DisplayOneChar(uchar X, uchar Y, uchar DData)

{

Y &= 0x01;

X &= 0x0f;

if(Y)

X |= 0x40; //若y为1(显示第二行),地址码加0x40

X |= 0x80; //指令码为地址码+0x80

WriteCommandLCM(X);

WriteDataLCM(DData);

}

/********显示指定坐标的一串字符子函数********/

void DisplayListChar(uchar X, uchar Y, uchar length,uchar code *DData) {

uchar ListLength = 0;

Y &= 0x01;

X &= 0x0f;

while(X

{

DisplayOneChar(X,Y,DData[ListLength]);

ListLength++;

X++;

}

}

四、主函数

#include

#include

#include

#include

#include "lcd1602.h"

#include "hx711.h"

sbit speaker = P2^7;

sbit qupi = P3^7;

sbit qingling = P3^6;

int weight;

uchar num,s = 5;

ulong ad_data = 0;

ulong cost = 0,total = 0;

ulong price = 0;

uchar flag_ok = 0; //ok键的按键次数

uchar pi = 0;

uchar flag_dian = 0,dian = 1; //小数点的位数,和小数点标志 uchar flag_dian_all = 0;

uchar dian_max = 1; //最大的点的位数

uchar flag_jian = 0;

uchar cha=0,flag_jia=0,flag_jian;

uchar code str0[] = {"Weight: g "};

uchar code str1[] = {"cost: "};

uchar code str2[] = {"Price: "};

uchar code str3[] = {"Total: "};

uchar code table1[] = {"0123456789"};

void alarm(void);

void keyscan(void); //键盘扫描函数

void display_cost(ulong price) //显示单项称量价格 {

uchar w[5],i,j,wei;

w[0] = price/10000;

w[1] = price%10000/1000;

w[2] = price%1000/100;

w[3] = price%100/10;

w[4] = price%10;

if(flag_ok == 1)

{

wei = 5; i = 5;

// if(flag_dian == 1)

// j = 11;

// else

// j = 10;

while(wei != 11)

{

// if(flag_dian==1&&wei == 10-dian)

if(wei == 10-dian)

DisplayOneChar(wei,1,'.');

else

{

DisplayOneChar(wei,1,table1[w[i-5]]);

i++;

}

wei++;

}

}

else

{

wei = 6; i = 6;

// if(flag_dian_all==1)

// j = 12;

// else

// j = 11;

while(wei != 12)

{

// if(flag_dian_all==1&&wei == 11-dian_max) if(wei == 11-dian_max)

DisplayOneChar(wei,1,'.');

else

{

DisplayOneChar(wei,1,table1[w[i-6]]); i++;

}

wei++;

}

}

}

void ad_change(ulong price)

{

uchar w[5],i;

uchar ge,bai,shi,qian;

int aver = 0;

double z = 0;

w[0] = price/10000000;

w[1] = price%10000000/1000000;

w[2] = price%1000000/100000;

w[3] = price%100000/10000;

w[4] = price%10000/1000;

// DisplayOneChar(0,1,table1[w[0]]);

// DisplayOneChar(1,1,table1[w[1]]);

// DisplayOneChar(2,1,table1[w[2]]);

// DisplayOneChar(3,1,table1[w[3]]);

// DisplayOneChar(4,1,table1[w[4]]);

for(i = 0; i

{

z = z*10+w[i];

}

// weight = (1093.8-0.1196*z)*10.0; //初始 // aver += weight;

weight = (1085.8-0.1185*z)*10.0; //第二次 aver += weight;

weight = (1082.6-0.1182*z)*10.0; //第三次 aver += weight;

/***********第三次,,分段*******************/ if(z > 8700)

weight = (1079.6-0.1177*z)*10.0;

else if(z > 8290)

weight = (1087.5-0.1186*z)*10.0;

else if(z > 7850)

weight = (1077-0.1174*z)*10.0;

else if(z > 7410)

weight = (1068.3-0.1163*z)*10.0;

else if(z > 7000)

weight = (1080.8-0.1179*z)*10.0;

else if(z > 6590)

weight = (1086.1-0.1187*z)*10.0;

else if(z > 6170)

weight = (1100.4-0.1209*z)*10.0;

else if(z > 5730)

weight = (1080.8-0.1177*z)*10.0; else if(z > 5330)

weight = (1114.9-0.1238*z)*10.0;

else

weight = (1114-0.1236*z)*10.0;

aver += weight;

weight = aver/3;

// if(weight

// {

// cha = -weight;

// flag_jia = 1;

// flag_jian = 0;

// weight = 0;

// }

// else if(weight

// {

// cha = weight;

// flag_jian = 1;

// flag_jia = 0;

// weight = 0;

// }

// else

// {

// if(flag_jia == 1)

// weight = weight+cha;

// if(flag_jian == 1)

// weight -= cha;

// }

qian = weight/1000;

bai = weight%1000/100;

shi = weight%100/10;

ge = weight%10;

DisplayOneChar(7,0,table1[qian]);

DisplayOneChar(8,0,table1[bai]);

DisplayOneChar(9,0,table1[shi]);

DisplayOneChar(10,0,'.');

DisplayOneChar(11,0,table1[ge]);

DisplayOneChar(12,0,'g');

}

/*************主程序***************/

void main()

{

delay(500); //系统延时500ms启动 initLCM();

WriteCommandLCM(0x01); //清屏显示

DisplayListChar(0,0,16,str0);

DisplayListChar(0,1,16,str2);

while(1)

{

ad_data = ReadCount();

ad_change(ad_data);

keyscan();

alarm();

}

}

/*************报警值函数******************/ void alarm(void)

{

if(weight>5500)

speaker = 0; //则启动报警

else

speaker = 1;

}

/**********键盘扫描子程序************/

//void temer1() interrupt 3

void keyscan(void)

{

uchar temp;

P1 = 0XFE;

if(temp != 0xf0) { delay(5); temp = P1; temp = temp&0xf0; while(temp != 0xf0) { temp = P1; switch(temp) { case 0xbe:num=1;s++;break; case 0xde:num=2;s++;break; case 0xee:num=3;s++;break; //case 0x7e:num=4;k='/';s++;break; } while(temp!=0xf0) { temp=P1; temp=temp&0xf0; } if(flag_jian == 0) { if(flag_dian == 1) dian++; price = price*10+num; DisplayOneChar(s,1,table1[num]); } } } P1 = 0XFd; temp = P1; temp = temp&0xf0; if(temp != 0xf0) { delay(5); temp = P1; temp = temp&0xf0; while(temp != 0xf0) { temp = P1; switch(temp) { case 0xbd:num=4;s++;break; case 0xdd:num=5;s++;break;

} while(temp!=0xf0) { temp=P1; temp=temp&0xf0; } if(flag_jian == 0) { if(flag_dian == 1) dian++; price = price*10+num; DisplayOneChar(s,1,table1[num]); } } } P1 = 0XFb; temp = P1; temp = temp&0xf0; if(temp != 0xf0) { delay(5); temp = P1; temp = temp&0xf0; while(temp != 0xf0) { temp = P1; switch(temp) { case 0xbb:num=7;s++;break; case 0xdb:num=8;s++;break; case 0xeb:num=9;s++;break; //case 0x7b:num=12;k='-';s++;break; } while(temp!=0xf0) { temp=P1; temp=temp&0xf0; } if(flag_jian == 0) { if(flag_dian == 1) dian++; price = price*10+num; DisplayOneChar(s,1,table1[num]);

} P1 = 0XF7; temp = P1; temp = temp&0xf0; if(temp != 0xf0) { delay(5); temp = P1; temp = temp&0xf0; while(temp != 0xf0) { temp = P1; switch(temp) { case 0xb7:num='.';s++;break; case 0xd7:num=0;s++;break; case 0xe7:num='=';s++;flag_ok++;break; //case 0x77:num=16;k='+';s++;break; } while(temp!=0xf0) { temp=P1; temp=temp&0xf0; } if(flag_jian == 0) { if(num == 0) { if(flag_dian == 1) dian++; price = price*10+num; DisplayOneChar(s,1,table1[num]); } else if(num == '.') { flag_dian_all = 1; flag_dian = 1; DisplayOneChar(s,1,'.'); } } if(num == '=') { flag_jian = 1; if(flag_ok == 1)

if(flag_dian != 1) total += cost*10; else total += cost; if(dian > dian_max) dian_max = dian; DisplayListChar(0, 1, 16,str1); display_cost(cost); } else { DisplayListChar(0, 1, 16,str3); if(flag_dian_all != 1) display_cost(total/10); else display_cost(total); } } } } if(qingling == 0) //单次清零,不会清除总的累加金额 { delay(5); if(qingling == 0) { s = 5; pi = 0; dian = 1; flag_jian = 0; flag_dian = 0; flag_ok = 0; price = 0; cost = 0; DisplayListChar(0, 1, 16,str2); while(!qingling); } } if(qupi == 0) //去皮功能 { delay(5); if(qupi == 0) { pi = weight; while(!qupi);

} } }


相关文章

  • 电子信息工程毕业设计题目大全
  • 1 压力容器液位测量 2 多功能遥控小车 3基于RS232的仓库多点温度.湿度.气 4压检测系统 5自动控制升降旗系统 6基于RS485的温度报警系统 7基于模糊算法的水温控制系统的设计 8多分机电话交换机 9简易火灾自动报警系统 10基于 ...查看


  • 最新电子信息工程毕业论文题目参考
  • 1. 家庭防盗报警系统 2. 单片机实现单步进电机及8位流水灯控制的设计 3. 篮球竞赛计时系统 4. 单片机89C51在直流调速控制系统中的应用 5. 八路数字抢答器 6. 基于51机的直流电机设计 7. 基于51单片机的步进电机控制系统 ...查看


  • 电子信息类毕业设计课题
  • 电子信息类毕业设计课题 [电子通讯] 出租车计价系统 [过程控制] 基于单片机实现单回路智能调节.. [电子通讯] 脉冲数字频率计 [机床仪表] 仪表机床数控系统的设计(论文.. 磁流体发电论文 [电子通讯] 基于VC++6.0的PC 机与 ...查看


  • 广东海洋大学本科生毕业论文(设计)一览表
  • 广东海洋大学本科生毕业论文(设计)一览表 学院 :信息学院 专业:电子信息工程专业 班级:1031-1036 本班第 页共9页 序号 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 学 ...查看


  • 600个毕业设计题目
  • 1 实验室排课系统 2 电子技术题库系统升级设计及打包发布 3 电子技术基础辅助学习系统设计 4 电子技术基础辅助学习系统功能实现 5 检察院语音门户网站设计 6 185邮政客户服务中心构架分析 7 无纸水文信息记录仪研究与设计 8 中文语 ...查看


  • 基于单片机控制的智能小车设计开题报告
  • 广 西 科 技 大 学 普通本科毕业设计(论文)开题报告 课题名称 基于单片机控制的智能小车设计 学 院 电气与信息工程学院 专 业 电子信息科学与技术 年 月 日 一.毕业设计(论文)选题的目的和意义 随着科技的不断发展,智能小车的研究越 ...查看


  • 基于单片机的电子秤设计论文报告
  • 基于单片机的电子秤设计 论 文 报 告 系 别: 机电工程系 专业名称: 自动化 学 号: 201X 学生姓名: XXX 指导教师: XX 完成时间: 20XX年X月 目录 一.阐述论文的主要内容 ..................... ...查看


  • 基于zigbee电子听诊器翻译搞
  • 基于ZigBee的无线电子听诊器的设计 Ms. Kadam Patil D. D. and Mr. Shastri R. K. Department of E&TC Vidya Pratishthan's CoE, Baramati ...查看


  • 通信工程毕业设计题目精选
  • 我7岁1就始做做开发的推批销,就更加员会到挣体的不轻钱.易活生的艰了.人家做辛个小8时我就做1,6小时. 个为失败少理找由 多成为找功法 大多方数想要改革这人世界个 不晓得即时却小事做从起 信工程通毕业计题设精选目 . 1智压力能传感系统器 ...查看


  • 基于单片机的各种制作的毕业论文
  • 以下是相应的题目供大家参考:(大家也可以提供题目) ·基于51单片机的多路温度采集控制系统 ­ .基于单片机的万年历(及电子闹钟) .基于单片机的自动寻迹小车 .基于的单片机的GPS 全球定位系统 .基于单片机的16*16点阵屏汉字显示系统 ...查看


热门内容