课程设计报告题目:压力测量系统的设计院系:信息与电气工程学院姓名:王彩红学号:专业:电气工程及其自动化指导老师:王桂英目录1设计内容及要求…………………………………………………………………………2智能电子天平的总体设计分析………………………………………………………………2.1 智能电子天平的基本结构2.2智能电子天平系统的工作原理2.3 智能电子天平设计的基本思路3硬件设计…………………………………………………………………..3.1 总体规划3.2 主控制器电路3.3 电源变换电路3.4 信号放大电路3.5信号变换电路3.6 显示电路4软件设计…………………………………………………………………4.1 系统应用程序组成4.2 主程序流程图4.3 AD采样程序块4.4 液晶显示程序块5心得体会………………………………………………………………………………1设计内容及要求设计一个智能电子天平,可以同时测量两个物体的重量并进行比较。
该系统应具有数码管显示、键盘设定、数据存储等功能。
设计要求:①测量范围:0~5kg②测量精度:正负0.1kg③测量通道:2通道(被测物体重量1通道,参照物体重量1通道)④供电电源:220V AC2 、智能电子天平设计总体分析2.1智能电子天平的基本结构所谓智能电子天平,即可以同时测量两个物体的重量并进行比较的装置。
它和电子称的原理类似,都是是利用物体的重力作用来确定物体质量(重量)。
智能电子天平可以说是电子称的改进装置,把原有的电子称压力传感器测量端换成两个,相继的数据处理等后续装置做一定的改进即可。
2.2 系统的工作原理电子天平称重系统的工作原理。
首先是通过两个压力传感器分别采集到两个被测物体的重量并将其转换成电压信号。
输出电压信号通常很小,需要通过前端信号处理电路进行准确的线性放大。
放大后的模拟电压信号分别经A/D转换电路转换成数字量通过两个通道被送入到主控电路的单片机中,单片机通过程序结合按键控制译码显示器,从而显示出某个被测物体的重量或是比较结果。
在实际应用中,为提高数据采集的精度并尽量减少外界电气干扰,还需要在传感器与A/D芯片之间加上信号调整电路。
2.3 系统设计基本思路按照设计的基本要求,系统可分为四大模块,电源转换模块、数据采集模块、控制器模块、显示器模块。
其中数据采集模块由压力传感器、信号的前级处理和A/D转换部分组成。
转换后的数字信号送给控制器处理,由控制器完成对该数字量的处理,驱动显示模块完成人机间的信息交换。
此部分对软件的设计要求比较高,系统的大部分功能都需要软件来控制。
3、硬件电路设计3.1 总体规划按照本设计功能的要求,系统由5个部分组成:控制器部分、两个相同的测量部分、数据显示部分、键盘部分和电路电源部分,系统设计总体方案框图如图1所示。
图一:系统总体框图其中,本设计采用SP20C-G501电阻应变式传感器,其最大量程为5Kg.称重传感器由组合式S型梁结构及金属箔式应变计构成,具有过载保护装置。
由于惠斯登电桥具诸如抑制温度变化的影响,抑制干扰,补偿方便等优点,所以该传感器测量精度高、温度特性好、工作稳定等优点,广泛用于各种结构的动、静态测量及各种电子秆的一次仪表。
该称重传感器主要由弹性体、电阻应变片电缆线等组成,其工作原理如图3所示。
图3 称重传感器原理图本设计的测量电路采用最常见的桥式测量电路,用到的是电阻应变传感器半桥式测量电路。
它的两只应变片和两只电阻贴在弹性梁上,测量电阻随重力变化导致弹性梁应变而产生的变化。
其测量原理:用应变片测量时,将其粘贴在弹性体上。
当弹性体受力变形时,应变片的敏感栅也随同变形,其电阻值发生相应变化,通过转换电路转换为电压或电流的变化。
由于内部线路采用惠更斯电桥,当弹性体承受载荷产生变形时,输出信号电压可由下式给出:上式说明电桥的输出电压V和四个桥臂的应变片感受的应变量的代数和成正比。
3.2主控器电路本设计中主控制器采用AT89C51单片机,AT89C51是一种带4K字节闪烁可编程可擦除只读存储器(FPEROM—Falsh Programmable and Erasable Read Only Memory)的低电压,高性能CMOS8位微处理器,俗称单片机。
该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
由于将多功能8位CPU 和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
此外,AT89C51设有稳态逻辑,可以在低到零频率的条件下静态逻辑,支持两种软件可选的掉电模式。
在闲置模式下,CPU停止工作。
但RAM,定时器,计数器,串口和中断系统仍在工作。
在掉电模式下,保存RAM的内容并且冻结振荡器,禁止所用其他芯片功能,直到下一个硬件复位为止。
其中主控电路图如下:3.3 电源转换电路设计:由于本设计中要求用220V电源供电,而设计中用到的芯片大多工作电压为5V,因此需要将220V交流电变换为5V直流电。
具体实现电路如下:220V交流电变换成5V直流电电路图3.4 信号放大电路由于称重传感器输出电压振幅范围0~20mV。
而A/D转换的输入电压要求为0~2V,因此需要一定的放大环节,且增益为100倍左右。
这里采用专用仪表放大器,如:AD620,INA126等。
此类芯片内部采用差动输入,共模抑制比高,差模输入阻抗大,增益高,精度也非常好,且外部接口简单。
以 INA126为例,接口如下图所示:图2.7 INA126仪表放大结构图3.5 信号转换电路要想利用单片机进行数据处理进而达到各种控制功能,必须先把传感器测得的模拟信号通过INA126芯片放大后,再通过A/D芯片进行转换,得到数字信号才能够送达单片机进行处理。
本设计中利A/D0805进行数据转换,具体电路如下:图8 1602液晶模块的读操作时序4 软件设计图10 程序结构4.2 主程序流程图系统程序固化在STC12C5A60S2内部的flash存储器中,分为主程序和若干子程序。
主程序的功能是系统初始化,管理和调用各个子程序。
本设计的程序流程图如图11所示。
图11 程序流程图4.3 AD采样程序块本文设计的STC12C5A60S2片内AD程序如下:#include "config.h"//---------------------------------------------------------------------// SPEED1 SPEED0 A/D转换所需时间#define AD_SPEED 0x60 // 0110,0000 1 1 90 个时钟周期转换一次,// CPU工作频率21MHz时 A/D转换速度约 300KHz//#define AD_SPEED 0x40 //0100,0000 1 0 140 个时钟周期转换一次//#define AD_SPEED 0x20 //0010,0000 0 1 280 个时钟周期转换一次//#define AD_SPEED 0x00 //0000,0000 0 0 420 个时钟周期转换一次//---------------------------------------------------------------------unsigned int get_AD_result(unsigned char channel){unsigned char AD_finished=0; //存储 A/D 转换标志ADC_RES = 0; //A/D 转换结果高8位ADC_RESL = 0; //A/D 转换结果低2位channel &= 0x07; //0000,0111 清0高5位ADC_CONTR = AD_SPEED;_nop_();ADC_CONTR|=0xE0; //1110,0000清ADC_FLAG,ADC_START位和低三位ADC_CONTR |= channel; //选择 A/D 当前通道_nop_();ADC_CONTR |= 0x80; //启动 A/D 电源delay(1); //使输入电压达到稳定ADC_CONTR |= 0x08; //0000,1000 令 ADCS = 1, 启动A/D转换AD_finished = 0;while (AD_finished == 0 ) //等待A/D转换结束{AD_finished = (ADC_CONTR & 0x10); //0001,0000 测试A/D转换结束否}ADC_CONTR &= 0xE7; //1111,0111 清 ADC_FLAG 位, 关闭A/D转换return (ADC_RES<<2|ADC_RESL);//返回转换后的结果}4.4 液晶显示程序块本文设计的1602液晶操作程序如下:/*****************************************************函数名:WriteDataLCD()功能:向1602写数据说明:入口参数:WDLCD返回值:无*****************************************************/void WriteDataLCD(unsigned char WDLCD){ReadStatusLCD(); //检测忙LCD_Data = WDLCD;LCD_RS = 1;LCD_RW = 0;LCD_E = 0; //若晶振速度太高可以在这后加小的延时LCD_E = 0;LCD_E = 0; //延时LCD_E = 1;}/*****************************************************函数名:WriteCommandLCD()功能:向1602写指令说明:入口参数:WDLCD,BuysC返回值:无*****************************************************/void WriteCommandLCD(unsigned char WCLCD,BuysC) //BuysC为0时忽略忙检测{if (BuysC) ReadStatusLCD(); //根据需要检测忙LCD_Data = WCLCD;LCD_RS = 0;LCD_RW = 0;LCD_E = 0;LCD_E = 0;LCD_E = 0;LCD_E = 1;}/*****************************************************函数名:ReadDataLCD()功能:从1602读数据说明:入口参数:无返回值:LCD_Data*****************************************************/unsigned char ReadDataLCD(void){LCD_RS = 1;LCD_RW = 1;LCD_E = 0;LCD_E = 0;LCD_E = 0;LCD_E = 1;return(LCD_Data);}/*****************************************************函数名:ReadStatusLCD()功能:读取1602状态说明:如果为忙,则一直等到非忙为止入口参数:无返回值:LCD_Data*****************************************************/unsigned char ReadStatusLCD(void){LCD_Data = 0xFF;LCD_RS = 0;LCD_RW = 1;LCD_E = 0;LCD_E = 0;LCD_E = 0;LCD_E = 1;delay_18B20(200);// Delay5Ms(); //检测忙信号 proteus仿真时,延迟5MS,关闭while循环while (LCD_Data&Busy) //硬件使用时,不延迟,打开while循环return(LCD_Data);}/*****************************************************函数名:LCDInit()功能:1602初始化说明:入口参数:无返回值:无*****************************************************/void LCDInit(void){LCD_Data = 0;WriteCommandLCD(0x38,0); //三次显示模式设置,不检测忙信号Delay5Ms();WriteCommandLCD(0x38,0);Delay5Ms();WriteCommandLCD(0x38,0);Delay5Ms();WriteCommandLCD(0x38,1); //显示模式设置,开始要求每次检测忙信号WriteCommandLCD(0x08,1); //关闭显示WriteCommandLCD(0x01,1); //显示清屏WriteCommandLCD(0x06,1); // 显示光标移动设置WriteCommandLCD(0x0C,1); // 显示开及光标设置}/*****************************************************函数名:DisplayOneChar()功能:按指定位置在1602显示一个字符说明:X为列,Y为行,DData为字符入口参数:X,Y,DData返回值:无*****************************************************///按指定位置显示一个字符void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData) {Y &= 0x1;X &= 0xF; //限制X不能大于15,Y不能大于1if (Y) X |= 0x40; //当要显示第二行时地址码+0x40;X |= 0x80; //算出指令码WriteCommandLCD(X, 0); //这里不检测忙信号,发送地址码WriteDataLCD(DData);}/*****************************************************函数名:DisplayListChar()功能:按指定位置在1602显示一串字符说明:X为列,Y为行,*DData为字符串入口参数:X,Y,DData返回值:无*****************************************************/void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData) {unsigned char ListLength;ListLength = 0;Y &= 0x1;X &= 0xF; //限制X不能大于15,Y不能大于1while (DData[ListLength]!='\0') //若到达字串尾则退出{if (X <= 0xF) //X坐标应小于0xF{DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符ListLength++;X++;}}}/*****************************************************函数名:Delay5Ms()功能:5ms延时说明:入口参数:无返回值:无*****************************************************/void Delay5Ms(void){unsigned int TempCyc = 5552;while(TempCyc--);}/*****************************************************函数名:Delay400Ms()功能:400ms延时说明:入口参数:无返回值:无*****************************************************/void Delay400Ms(void){unsigned char TempCycA = 5;unsigned int TempCycB;while(TempCycA--){TempCycB=7269;while(TempCycB--);}}4 心得体会首先,这篇课程设计就我而言还是有很大难度的。