模拟电子秤仿真实验报告.docx

上传人:b****2 文档编号:2483495 上传时间:2023-05-03 格式:DOCX 页数:32 大小:654.64KB
下载 相关 举报
模拟电子秤仿真实验报告.docx_第1页
第1页 / 共32页
模拟电子秤仿真实验报告.docx_第2页
第2页 / 共32页
模拟电子秤仿真实验报告.docx_第3页
第3页 / 共32页
模拟电子秤仿真实验报告.docx_第4页
第4页 / 共32页
模拟电子秤仿真实验报告.docx_第5页
第5页 / 共32页
模拟电子秤仿真实验报告.docx_第6页
第6页 / 共32页
模拟电子秤仿真实验报告.docx_第7页
第7页 / 共32页
模拟电子秤仿真实验报告.docx_第8页
第8页 / 共32页
模拟电子秤仿真实验报告.docx_第9页
第9页 / 共32页
模拟电子秤仿真实验报告.docx_第10页
第10页 / 共32页
模拟电子秤仿真实验报告.docx_第11页
第11页 / 共32页
模拟电子秤仿真实验报告.docx_第12页
第12页 / 共32页
模拟电子秤仿真实验报告.docx_第13页
第13页 / 共32页
模拟电子秤仿真实验报告.docx_第14页
第14页 / 共32页
模拟电子秤仿真实验报告.docx_第15页
第15页 / 共32页
模拟电子秤仿真实验报告.docx_第16页
第16页 / 共32页
模拟电子秤仿真实验报告.docx_第17页
第17页 / 共32页
模拟电子秤仿真实验报告.docx_第18页
第18页 / 共32页
模拟电子秤仿真实验报告.docx_第19页
第19页 / 共32页
模拟电子秤仿真实验报告.docx_第20页
第20页 / 共32页
亲,该文档总共32页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

模拟电子秤仿真实验报告.docx

《模拟电子秤仿真实验报告.docx》由会员分享,可在线阅读,更多相关《模拟电子秤仿真实验报告.docx(32页珍藏版)》请在冰点文库上搜索。

模拟电子秤仿真实验报告.docx

模拟电子秤仿真实验报告

阿坝师范高等专科学校电子信息工程系课程设计

模拟电子秤仿真设计

 

学生姓名

樊益明

专业名称

计算机控制技术

班级

计控班

学号

20113079

 

阿坝师范高等专科学校电子信息工程系

二○一三年四月

模拟电子秤设计报告

1、设计原理及要求

设计原理:

电子秤系统设计框图大致如图1所示:

 

 

 

 

图1系统整体设计框图

设计要求:

1、要求单价由键盘输入;

2、重量的精度能够达到十分之一千克;

3、按键有提示音;

4、有去皮的功能;

2、主要硬件及仿真软件

硬件:

(1)、ADC0832

ADC0832是一种8位分辨率、双通道A/D转换芯片。

由于它体积小,兼容性,性价比高而深受单片机爱好者及企业欢迎。

图2.1为ADC0832在Proteus中的逻辑符号

图2.1ADC0832逻辑符号

芯片接口说明:

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

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

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

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

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

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

CLK芯片时钟输入。

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

单片机对ADC0832的控制原理:

正常情况下ADC0832与单片机的接口应为4条数据线,分别是CS、CLK、DO、DI但由于DO端与DI端在通信时并未同时有效并与单片机的接口是双向的,所以电路设计时可以将DO和DI并联在一根数据线上使用。

(见图3.6)当ADC0832未工作时其CS输入端应为高电平,此时芯片禁用,CLK和DO/DI的电平可任意。

当要进行A/D转换时,须先将CS使能端置于低电平并且保持低电平直到转换完全结束。

此时芯片开始转换工作,同时由处理器向芯片时钟输入端CLK输入时钟脉冲,DO/DI端则使用DI端输入通道功能选择的数据信号。

在第1个时钟脉冲的下沉之前DI端必须是高电平,表示启始信号。

在第2、3个脉冲下沉之前DI端应输入2位数据用于选择通道功能,其功能项见表1。

表1

如表1所示,当此2位数据为“1”、“0”时,只对CH0进行单通道转换。

当2位数据为“1”、“1”时,只对CH1进行单通道转换。

当2位数据为“0”、“0”时,将CH0作为正输入端IN+,CH1作为负输入端IN-进行输入。

当2位数据为“0”、“1”时,将CH0作为负输入端IN-,CH1作为正输入端IN+进行输入。

所以我们利用前1——2个脉冲来设置ADC0832的通道选择,到第3个脉冲的下沉之后DI端的输入电平就失去输入作用,此后DO/DI端则开始利用数据输出DO进行转换数据的读取。

从第4个脉冲下沉开始由DO端输出转换数据最高位DATA7,随后每一个脉冲下沉DO端输出下一位数据。

直到第11个脉冲时发出最低位数据DATA0,一个字节的数据输出完成。

也正是从此位开始输出下一个相反字节的数据,即从第11个字节的下沉输出DATD0。

随后输出8位数据,到第19个脉冲时数据输出完成,也标志着一次A/D转换的结束。

最后将CS置高电平禁用芯片,直接将转换后的数据进行处理就可以了。

更详细的时序说明请见图2.2(图2.2为ADC0832的时序图)。

图2.2ADC0832时序图

(2)、LCD12232

图2.3LCD12232逻辑符号

管脚说明:

VDD:

逻辑电源正

GND(VSS):

逻辑电源地

VO(VEE):

LCD驱动电源

RESET:

复位端。

E1:

读写使能。

E2:

同E1引脚。

/RD:

读允许,低电平有效。

/WR:

写允许,低电平有效。

R/W:

读写选择

A0:

数据/指令选择高电平:

数据D0-D7将送入显示RAM;

低电平:

数据D0-D7将送入指令执行器执行。

D0-D7:

数据输入输出引脚。

图2.4为LCD的时序图

图2.4LCD12232时序图

图2.5为显示存储器(DDRAM)与地址的对应关系

(显示设定为1/32DUTY,显示起始行为10th)

图2.5

(3)、AT89C51

在Protues中AT89C51的逻辑符号如图2.6所示:

图2.6AT89C51逻辑符号

AT89C51是一种带4K字节FLASH存储器(FPEROM—FlashProgrammableandErasableReadOnlyMemory)的低电压、高性能CMOS8位微处理器,俗称单片机。

AT89C2051是一种带2K字节闪存可编程可擦除只读存储器的单片机。

单片机的可擦除只读存储器可以反复擦除1000次。

该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。

由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,AT89C2051是它的一种精简版本。

AT89C51单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。

AT89C51提供以下标准功能:

4k字节Flash闪速存储器,128字节内部RAM,32个I/O口线,两个16位定时/计数器,一个5向量两级中断结构,一个全双工串行通信口,片内振荡器及时钟电路。

同时,AT89C51可降至0Hz的静态逻辑操作,并支持两种软件可选的节电工作模式。

空闲方式停止CPU的工作,但允许RAM,定时/计数器,串行通信口及中断系统继续工作。

掉电方式保存RAM中的内容,但振荡器停止工作并禁止其它所有部件工作直到下一个硬件复位。

仿真软件:

(1)、Proteus

它不仅具有其它EDA工具软件的仿真功能,还能仿真单片机及外围器件。

它是目前最好的仿真单片机及外围器件的工具,在这里完全能够满足我们对电子秤的仿真需要。

(2)、KeilC51

KeilC51是51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。

Keil提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,因为我们在此次模拟仿真中使用C语言编程,所以Keil几乎就是我们的不二之选。

3、设计步骤

(1)、软件设计

1、延时函数delay()的编写(Delay.c):

在这个C文件中,只有一个函数voiddelay(uintx),该函数的作用是,延时100*x(微秒)。

2、ADC0832的驱动代码编写(ADC0832.c):

在这个C文件中,只有一个函数ucharReadADC(),它的返回值为8位2进制数,表示的放大后的电压值。

图3.1为ucharReadADC()的程序设计流程图

 

各种赋值语句,作读取数据时的初始化

dat1=(dat1<<1)|ADC_DIO;读取第4~11,共8个正向数据

dat2=dat2|((uchar)ADC_DIO<

开始

 

 

结束

图3.1程序设计流程图

3、MM74C922的驱动代码编写(MM74C922.c):

在这个C文件中,有三个函数:

、ucharGet_key(),作用是获得MM74C922转化的4位二进制,并转化为十进制;、voidBeep(),是蜂鸣器的驱动程序;、voidJuge_key()判断按键值,并作出相应操作

图3.2为voidJuge_key()的程序设计流程图

 

ucharGet_key()获得MM74C922转化的4位二进制,并转化为十进制b

b=Get_key();switch(b)

开始

 

 

结束

 

图3.2程序设计流程图

4、LCD12232的驱动代码编写(LCD12232.c):

在这个C文件中,主要包含了两个显示函数

、voidLCDshow010(uint*a,uintb)

这个函数主要是实现LCD第一行的显示,显示“P:

0W0.0kg”字样。

、voidLCDshow230(uintc)

这个函数主要是实现LCD第二行的显示,显示“总价:

0.0元”字样。

5、Main文件的编写(Main.c):

在这个C文件中,主要包含了main()函数,它的功能是调用其他C文件中的函数,因此,在写main()函数时,应当先做其他文件的调用声明,如下:

#include"Font.h";//存放取模数据的头文件

#include"Delay.c"//延时函数

#include"LCD12232.c"//LCD12232的驱动程序

#include"ADC0832.c"//ADC0832的驱动程序

#include"MM74C922.c"//MM74C922的驱动程序

图3.3为main()的程序设计流程图

 

LCD的复位操作,为LCD的显示做准备,LCDrst();

 

获得ADC的返回值adcdata=ReadADC();

 

将电压信号与重量建立等式关系weight=2*adcdata*1.960-Levelweight-3;

 

LCD的第一行显示LCDshow010(p,weight);

 

计算出总价Total_price=Price*Weight

 

LCD第二行显示LCDshow230(Total_price);

 

按键扫描函数Juge_key()

 

图3.3程序设计流程图

(2)、硬件电路搭建

1、模拟应变式传感器单臂电桥的搭建:

由于Proteus没有测重量的应变式传感器器件,所以在这里我们用四个电阻和一个电位器来模拟传感器的工作原理。

采用如图3.4所示电路图连接:

图3.4模拟传感器电桥

其中、

;图中所示

为传感器采集到的电压信号,

=1.5Ω,

=348.5Ω,所以

的变化范围为0~~5mV

2、微小电压信号差分放大电路的搭建:

在实际应用中,此种放大电路能够有效的降低噪声对正常信号的影响。

在本次模拟中能够有效的完成1000倍的放大,将最大0~~5mV的电压信号放大为最大0~~5V。

连接电路图如图3.5所示:

具体推套方式如下:

U1

根据以上推套,我们要实现1000倍的放大,则只需确定

四个电阻的阻值即可。

本次设计中我们取

,只需调节

即可达到1000倍,应当注意的是:

的调节幅度应该始终保持一样。

U2

U4

U5

Uo

图3.5

3、ADC0832与51单片机及LCD的连接电路:

关于ADC0832与单片机的连接方法在前面已经提过,在此不赘述了,我们选用CH0作为信号输入通道;

关于AT89C51的:

P1.0——P1.2口分别接ADC0832的片选使能端CS、时钟信号端CLK、数据输出端DIO,其中P1.6接MM74C922的输入提示端DA,P1.7接蜂鸣器;

图3.6ADC0832与51单片机及LCD的连接电路

P0端口接上拉电阻作LCD的D0——D7数据输入端;

P2.0——P2.7依次接LCD的数据指令控制端A0、LCD前半部分使能端E0、LCD后半部分使能端E1、LCD读写控制端RW以及MM74C922的四位数据传输断A、B、C、D。

(具体连接如图3.6)

4、键盘解码器MM74C922以及4*4键盘的连接电路:

关于MM74C922的电路连接如图3.7所示

图3.7MM74C922与矩阵式键盘的连接电路图

4、设计结论

1、单价能够由键盘输入:

当开启仿真时,在没有调节模拟传感器的前提下,LCD的显示如图4.1所示

图4.1

当有重物时,LCD的显示如图4.2所示,重量的显示范围理论上为0.0~~99.9kg

图4.2

这时,我们可以在键盘上按下重物的单价,Price的输入理论范围为0~~99元/kg,例如:

我们输入单价“15”,LCD的显示如图4.3所示:

图4.3

这时,我们只需要按下“确定”键,就可以得到总价了,LCD的显示如图4.4所示:

图4.4

应当注意的是:

、在每次使用前都应当按一下“归零”键,来防止前次使用时使用过去皮功能;、在单价的输入程序中,当你按下了两位数后,数字键就应失效了,不能继续输入,若想重新输入,则按下“归零”键即可,例如:

输入“15”,若我们按下1和5后继续按7,则第三次按键是无效的,不会显示在LCD上;、且,我们在写程序中应当加入防止重键的功能;④、若单价只有一位数,则lCD只显示一位数,不会出现“01”的情况,后面的重量、总价原理相同;

2、重量的精度能够达到十分之一千克:

理论上是达到要求了,但是由于我们用的是一个电位器来模拟传感器的电阻变化,而这个电位器只能1%的增加,而这1%换算到电压的改变就为0.05mV,算上电压与重量的关系1mV对应15kg,则电位器每增加1%重量就应该增加0.75kg左右。

如图4.5a和图4.5b所示

图4.5a为当电位器调节到60%的时候,采集到的重量为48.0kg;

图4.5b为当电位器调节到65%的时候,采集到的重量为51.8kg;

=3.8kg

所以、平均变化为0.76kg

图4.5a

图4.5b

3、去皮的功能:

例,在图4.5b的显示情况下我们使用“去皮”的功能即按下“去皮”键,LCD的显示如图4.6所示:

图4.6

应当注意的是:

在使用了去皮功能后,应当做归零操作。

4、按键有提示音:

此项功能只需要增加一个蜂鸣器(接单片机P1.7脚)在编写按键扫描程序中,在每一个case语句后添加上蜂鸣器的驱动程序即可。

当有按键按下时,就会调用蜂鸣器的驱动序,促使蜂鸣器发出“滴”的一声。

附录Ⅰ:

图一:

所有电路连接的全局图

图一

附录Ⅱ:

附所有程序源代码:

Font.h//存放取模数据的头文件

#defineucharunsignedchar

#defineuintunsignedint

uintcodenumber[][16]={

{0x00,0x00,0xE0,0x0F,0x10,0x10,0x08,0x20,0x08,0x20,0x10,0x10,0xE0,0x0F,0x00,0x00},/*"0",0*/

{0x00,0x00,0x10,0x20,0x10,0x20,0xF8,0x3F,0x00,0x20,0x00,0x20,0x00,0x00,0x00,0x00},/*"1",1*/

{0x00,0x00,0x70,0x30,0x08,0x28,0x08,0x24,0x08,0x22,0x88,0x21,0x70,0x30,0x00,0x00},/*"2",2*/

{0x00,0x00,0x30,0x18,0x08,0x20,0x88,0x20,0x88,0x20,0x48,0x11,0x30,0x0E,0x00,0x00},/*"3",3*/

{0x00,0x00,0x00,0x07,0xC0,0x04,0x20,0x24,0x10,0x24,0xF8,0x3F,0x00,0x24,0x00,0x00},/*"4",4*/

{0x00,0x00,0xF8,0x19,0x08,0x21,0x88,0x20,0x88,0x20,0x08,0x11,0x08,0x0E,0x00,0x00},/*"5",5*/

{0x00,0x00,0xE0,0x0F,0x10,0x11,0x88,0x20,0x88,0x20,0x18,0x11,0x00,0x0E,0x00,0x00},/*"6",6*/

{0x00,0x00,0x38,0x00,0x08,0x00,0x08,0x3F,0xC8,0x00,0x38,0x00,0x08,0x00,0x00,0x00},/*"7",7*/

{0x00,0x00,0x70,0x1C,0x88,0x22,0x08,0x21,0x08,0x21,0x88,0x22,0x70,0x1C,0x00,0x00},/*"8",8*/

{0x00,0x00,0xE0,0x00,0x10,0x31,0x08,0x22,0x08,0x22,0x10,0x11,0xE0,0x0F,0x00,0x00},/*"9",9*/

{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"",10*/

{0x08,0x20,0xF8,0x3F,0x00,0x24,0x00,0x02,0x80,0x2D,0x80,0x30,0x80,0x20,0x00,0x00},/*"k",11*/

{0x00,0x00,0x00,0x6B,0x80,0x94,0x80,0x94,0x80,0x94,0x80,0x93,0x80,0x60,0x00,0x00},/*"g",*/

{0x00,0x00,0x00,0x30,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*".",13*/

{0x20,0x80,0x20,0x40,0x22,0x20,0x22,0x10,0x22,0x0C,0xE2,0x03,0x22,0x00,0x22,0x00},

{0x22,0x00,0xE2,0x3F,0x22,0x40,0x22,0x40,0x22,0x40,0x20,0x40,0x20,0x78,0x00,0x00},/*"元",14*/

};

uintcodetem[][16]={

{0x08,0x20,0xF8,0x3F,0x08,0x21,0x08,0x01,0x08,0x01,0x08,0x01,0xF0,0x00,0x00,0x00},/*"P",0*/

{0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*":

",1*/

{0xF8,0x03,0x08,0x3C,0x00,0x07,0xF8,0x00,0x00,0x07,0x08,0x3C,0xF8,0x03,0x00,0x00},/*"W",2*/

{0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*":

",3*/

{0x00,0x40,0x00,0x30,0x00,0x00,0xF1,0x03,0x12,0x39,0x14,0x41,0x10,0x41,0x10,0x45},

{0x10,0x59,0x14,0x41,0x12,0x41,0xF1,0x73,0x00,0x00,0x00,0x08,0x00,0x30,0x00,0x00},/*"总",4*/

{0x00,0x01,0x80,0x00,0x60,0x00,0xF8,0xFF,0x07,0x00,0x40,0x80,0x20,0x60,0x90,0x1F},

{0x0C,0x00,0x03,0x00,0x0C,0x00,0x90,0xFF,0x20,0x00,0x40,0x00,0x40,0x00,0x00,0x00},/*"价",6*/

{0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*":

",8*/

}Delay.c//延时函数

voiddelay(uintx){/*100us延时函数*/

uinti;

while(x--)

for(i=100;i>0;i--);

}LCD12232.c//LCD12232的使用函数

sfrDATAport=0x80;//定义LCD12232数据口(0x80表示P0口)

sbitlcda0=P2^0;//写(数据/指令)(1/0)选择

sbitlcde1=P2^1;//LCD左边使能

sbitlcde2=P2^2;//LCD右边使能

sbitlcdrw=P2^3;//(读/写)(1/0)状态选择

sbitlcdbusy=P0^7;//忙状态检测位(即数据口最高位)

voidLCDcmd(uchartemp){

delay

(2);

lcde1=0;//禁止控制器

lcde2=0;

lcda0=0;//写指令模式

lcdrw=0;//写使能

lcde1=1;//控制器使能

lcde2=1;

DATAport=temp;//写指令

lcde1=0;//写完后,禁止控制器

lcde2=0;

}

/*写数据*/

voidLCDdata(bitlcde,uchartemp){

delay

(2);

lcde1=0;//禁止控制器

lcde2=0;

lcda0=1;//写数据模式

lcdrw=0;//写使能

lcde1=~lcde;//(lcde=0/1)(左/右)控制器使能

lcde2=lcde;

DATAport=temp;//写数据

lcde1=0;//写完后,禁止主控制器

lcde2=0;

}

/*LCD清屏*/

voidLCDclr(uintPage){

unsignedchari;

LCDcmd(0xB8|Page);//设置主控制器页地址

LCDcmd(0x00);//设置主控制器列地址

for(i=0;i<61;i++){

LCDdata(0,0x00);

}

for(i=0;i<61;i++){

LCDdata(1,0x00);

}

}

/*LCD初始化*/

voidLCDrst(){

LCDcmd(0xE2);//复位

LCDcmd(0xAE);//关显示

LCDcmd(0xA4);//正常驱动模式

LCDcmd(0xA9);//占空比为1/32(即32行液晶显示驱动)

LCDcmd(0xA1);//设定列驱动与液晶列数据口连接方式

LCDcmd(0xEE);//正常读写模式(读/写数据后列地址+1)

LCDclr(0);//擦除0页

LCDclr

(1);//擦除1页

LCDclr

(2);//擦除2页

LCDclr(3);//擦除3页

LCDcmd(0xAF);//开显示

}

/*写LCD字符串*/

/*写指令*/

voidLCDshow010(uint*a,uintb){

uinti,j;

for(j=0;j<2;j++){

LCDcmd(0xB8|j);//第j页显示

LCDcmd(0x00);//设置列开始地址

for(i=0;i<16;i++)//写前半部分,显示“P:

LCDdata(0,tem[0][i*2+j%2]);

if(a[1]==0){

for(

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2