智能仪器设计.docx
《智能仪器设计.docx》由会员分享,可在线阅读,更多相关《智能仪器设计.docx(24页珍藏版)》请在冰点文库上搜索。
智能仪器设计
智能仪器课程设计
报告书
题目号:
22
题目:
智能数字显示仪表设计
班级:
自动化XXX
学号:
XXX
姓名:
XX
2012年12月
摘要
智能仪表是含有微型计算机或者微型处理器的测量仪器,拥有对数据的存储运算逻辑判断及自动化操作等功能。
它的出现,极大的扩充了传统仪器的应用范围。
智能仪器凭借其体积小、功能强、低功耗等优势,迅速的在家用电器、科研单位和工业企业中得到了广泛的使用。
智能电子系统,其单片机硬件部分都是相似的,一般是由如下硬件电路组成:
单片机最小系统(单片机、电源、晶振、复位、编程调试接口等)。
开关量输入与输出电路。
模数与数模转换电路。
通信接口(UART(SCI)、SPI、I2C(SMBus)、CAN、USB、TCP/IP、ZigBee等)。
显示电路(LED数码管、LCD等)。
控制电路(继电器、晶闸管等功率输出电路)。
而软件部分就是使单片机中运行的程序(算法),程序通过单片机与单片机的引脚指挥各个硬件电路部分,进而控制各种各样的对象,实现对象控制的自动化与智能化。
单片机技术的落脚点就是实现电子系统智能化,换句话说,就是开发控制各种对象的智能电子产品。
本课程设计以工业控制中使用的温度监测智能仪表为例,介绍单片机在电子系统智能化方面的应用。
一、设计的目的和原理
设计题目:
实现智能数字显示仪表。
要求8位数码管显示(4位显示测量值,4位显示设定值),4输入按钮(功能选择、数码管选择、数字增加、数字减少),可设定上下限报警(蜂鸣器报警)。
适配E型(镍铬-铜镍)热电偶,测温范围为0℃~700℃。
采用比例控制、并用晶闸管移相驱动1000W电加热器(电源电压为AC220V)。
设计目的:
单片机综合练习是一项综合性的专业实践,目的是让学生在所学知识的基础上,结合工程实际,加以消化和巩固,培养学生的综合运用知识的能力、动手实际的能力和工程实践能力,为以后的工作实践打好良好的基础。
设计原理:
由热电偶送来的电信号一方面通过AD转换成数字信号供单片机处理后进行数字显示,另一方面传输到调节器比较运算,输出一个需要的控制信号与给定匹配。
二、硬件设计
本设计采用STC89C51单片机实现智能测温仪表。
由题目可知,该测温仪表需要如下电路模块:
(1)单片机电路(包括单片机最小系统、ADC、数码显示、按键、LED灯、电源等)。
(2)E型(镍铬-铜镍)热电偶信号调理电路
(3)加热功率驱动电路。
原理框图:
智能仪表单片机电路由STC89C51单片机电路、按钮、数码管、LED显示、串行通讯口、电源、ADC、DAC、E2PROM、热电偶、功率输出等电路组成。
控制板面图:
上排数码管显示设定值,下排数码管显示测量值。
第一个按钮选择功能设置,第二个数码管选择,第三个数值加,第四个数值减。
四个LED显示灯显示系统的各个运行状态。
基本电路模块:
总框图
单片机最小系统:
STC89C51单片机最小系统包含51单片机、晶振电路、复位电路、电源电路。
单片机可采用11.0592MHz或12MHz的晶振,外置电源可以采用市售开关电源12V直流,稳压模块采用7805芯片,采用单片机上电复位的方式,还有上电指示灯。
蜂鸣器电路:
NPN型三极管驱动蜂鸣器产生报警提示,单片机P1.6口控制
串行存储器电路:
串行存储器芯片24C02用于保存设定值。
该芯片具有I2C接口,连接单片机P0.0与P0.1引脚,采用软件方法模拟I2C接口。
数码管电路:
具有两排各四个数码管显示,采用四位一体数码管,分别显示测量值和设定值,数码管由2块74HC595串入并出锁存器驱动,因此只需要3个单片机引脚,采用动态扫描数码管驱动法。
按键电路:
根据需要接按键于单片机相关引脚上,低电平有效。
可用作功能选择按钮、数值加一按钮、数值减一按钮等。
LED电路:
LED显示灯用于显示报警、动作等,直接连接到单片机相关引脚,低电平有效。
ADC电路:
由于51单片机内部没有AD资源,因此扩展了10位ADC芯片TLC1549,TLC1549与单片机的P1.0、P1.1、P1.2引脚连接,连接器J1用于模拟信号的输入。
DAC电路:
同样,系统扩展了DAC芯片TLC5615,该芯片采用+5V模拟电压分压作为参考电压,DAC输出范围可达0.25~4.75V,单片机采用3个引脚与该芯片连接,软件模拟芯片时序,将数据输出到TLC5615.
通讯电路:
使用MAX232组成电平变换电路,可以实现在系统编程(ISP)或实现单片机与PC机之间的通讯。
P3.0与P3.1连接有交叉开关,可以实现端口复用。
热电偶调理电路:
E型热电偶信号调理电路如上图所示。
镍铬—铜镍热电偶、压簧固定式热电偶,工业用装配式热电偶作为测量温度的传感器,通常和显示仪表、记录仪表和电子调节器配套使用。
它可以直接测量各种生产过程中从0℃~1800℃范围内的液体、蒸汽和气体介质以及固体的表面温度。
分度表:
该电路利用1N4148的负温度系数实现热电偶冷端补偿。
为保证0℃时输出电压为0V,电路中采用了负电源。
第一个运放组成的电路实现冷端温度补偿,其中RP0调节电路零点,由于二极管在反馈通路中,运放输出电压随温度升高而上升,温度系数为2mV/℃,经过R5与R6分压后的温度系数为0.017mV/℃,正好与R13热电偶温度系数近似。
第二个运放用于信号方法,发达倍数约为160。
74HC14组成的多谐振荡器、二极管和电容构成负电源电路,该电路向LM258提供负电源。
0℃~700℃对应线性输出0~1.9V。
电加热器电路:
单片机引脚为低电平时,在交流220V电压移相时,MOC3022触发双向晶闸管接通1000W电加热电源。
控制器方案:
比例控制(P)是一种控制算法,其输出量out与温度偏差e=SV-PV成比例关系,写成数学公式是:
out=kp*e+out0
式中,e是测量温度值PV与设定温度值SV之间的偏差,Kp是比例系数。
out是输出量。
out0是对应e=0时的控制量,可由人工确定,通常取输出控制量的1/2。
三、软件设计及注释
软件流程图:
描述了软件算法的执行过程。
有开始、有结束,有条件分支选择,有正常判断。
下图只是列出执行的整体框架:
程序详单:
#include
#defineucharunsignedchar
#defineuintunsignedint
#defineWDA0x00//定义器件在IIC总线中的地址
ucharduan[]=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,
0x83,0xc6,0xa1,0x86,0x8e};
//段码
ucharwei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//位码
uintcodevalue[]={32,64,128,256,384,512,640,768,896,1023};//数字量
sbitDOUT=P2^5;//数码管引脚定义
sbitCLK=P2^7;
sbitLATCH=P2^6;
sbitAD_CS=P1^2;//TLC1549的引脚
sbitAD_CLK=P1^1;
sbitAD_DAT=P1^0;
sbitfunction=P3^4;//功能选择按钮
sbitshuma=P3^5;//数码管选择按钮
sbitplus=P3^6;//数值增加按钮
sbitsubs=P3^7;//数值减少按钮
sbitled0=P0^2;//LED
sbitled1=P0^3;
sbitled2=P0^4;
sbitled3=P0^5;
sbitbeep=P1^6;//蜂鸣器
sbitcs=P1^5;//TLC5615引脚
sbitdin=P1^3;
sbitclk=P1^4;
sbitSCL=P0^0;//24c02引脚
sbitSDA=P0^1;
ucharxs[8];//数码管显示缓存区
uchardisplay_time;//相关控制变量
ucharsample_time;
ucharsample_time;
ucharcontrol_time;
ucharDAC_time;
uchardisplay_time0=5;
ucharsample_time0=5;
ucharcontrol_time0=5;
ucharDAC_time0=5;
ucharhigh;//定义其它变量
ucharlow;
uchargiven;
ucharK;
voidLED(ucharX);//数码管函数声明
voiddelay()//延时函数
{
uchari=4,j=0;
for(i=10;i>0;i--)
for(j=248;j>0;j--);
}
voidset()
{
uinti,j;
if(shuma==0)//数码管选择按钮按下
delay();
if(shuma==0)
{
LED(wei[i++]);
if(i==8)
i=4;
}
if(plus==0)//增加按钮按下
delay();
if(plus==0)
{
LED(duan[j++]);
if(j==10)
j=0;
}
if(subs==0)//减小按钮按下
delay();
if(subs==0)
{
LED(duan[j--]);
if(j==-1)
j=9;
}
}
voidset_high()
{
set();
}
voidset_low()
{
set();
}
voidset_given()
{
set();
}
voidset_K()
{
set();
}
voidLED(ucharX)//数码管显示函数
{
uchari;
for(i=8;i>=1;i--)
{
//if(X&0x80)P2_5=1;elseP2_5=0;//先输出高位
//X<<=1;
if(X&0x01)DOUT=1;elseDOUT=0;//先输出低位
X>>=1;
CLK=0;
CLK=1;
}}
adc()//读取ADC数据的函数
{
uintu=0;
uchari;
cs=1;
delay();
cs=0;
for(i=0;i<10;i++)
{clk=0;
u=(u<<1)|DOUT;
clk=1;
delay();
}
cs=1;
}
voiddac(uintda)//写入DAC数据的函数
{
uchari;
da<<=6;
cs=0;
clk=0;
for(i=0;i<12;i++)
{
din=(bit)(da&0x80000);
clk=1;
da<<=1;
clk=0;
}
cs=1;
clk=0;
}
voidstart()//启用总线
{
SDA=1;
SCL=1;
SDA=0;
SCL=0;
}
voidstop()//停用总线
{
SCL=0;
SDA=0;
SCL=1;
SDA=1;
}
voidNoAck()//发送应答信号ACK
{
SDA=1;
SCL=1;
SCL=0;
}
bitTestAck()//测试应答信号ACK
{
bitEB;
SDA=1;
SCL=1;
EB=SDA;
SCL=0;
return(EB);
}
write8Bit(ucharinput)//写入8个二进制位到24C02
{uchartemp;
for(temp=8;temp!
=0;temp--)
{SDA=(bit)(input&0x80);
SCL=1;
SCL=0;
input=input<<1;
}
}
voidwrite24c02(ucharch,ucharaddress)//写入一个字节到24C02中字节地址的函数
{
start();
write8Bit(WDA);//发送器件地址的函数
TestAck();
write8Bit(address);//发送写入字节地址到24C02的函数
TestAck();
write8Bit(ch);//发送写入数据到24C02的函数
TestAck();
stop();
delay();
}
voidmain()
{
uintcount,adc_value,error,lasterror,out,gg=0;
TMOD=0x01;//定时器初始化
TH0=0x3C;
TL0=0xB0;
ET0=1;
EA=0;
TR0=1;
while
(1)
{
//按键处理语句
if(function==0)//功能选择按钮按下
delay();
if(function==0)
{
gg++;
if(gg==5)
gg=0;
switch(gg)
{
case0:
EA=1;break;//正常运行
case1:
EA=0;set_high();break;//设置上限值
case2:
EA=0;set_low();break;//设置下限值
case3:
EA=0;set_given();break;//设置给定值
case4:
EA=0;set_K();break;//设置比例系数值
}
}
set();
write24c02(value[0],0x01);
//数码管显示语句
if(display_time==1)
{
adc_value=adc();
xs[0]=adc_value%10;
xs[1]=adc_value/10%10;
xs[2]=adc_value/100%10;
xs[3]=adc_value/1000;//右面4位显示ADC输出值测量值
xs[4]=5;//左面4位备用设定值
xs[5]=6;
xs[6]=7;
xs[7]=8;
LED(wei[count]);//发送位码
LED(duan[xs[count]]);//发送段码
LATCH=0;//HC595锁存数据
LATCH=1;
count++;
if(count==8)
count=0;
display_time=0;
}
//ADC转换与数字滤波语句
if(sample_time==1)
{
adc();
sample_time==0;
}
//ADC输出数值判断、报警、比例算法与控制量输出
if(control_time==1)
{
if(adc_value>high||adc_value{
beep=0;
}
error=given-adc_value;
lasterror=error;
out=K*error;
control_time==0;
}
//DAC转换语句
if(DAC_time==1)
{
dac();
DAC_time==0;
}
}
}
voidtimer0()interrupt1
{
staticucharn,m,k,h;
n++;m++;k++;h++;
if(n==display_time0)//display_time0为显示周期
{
n=0;
display_time=1;
}
if(m==sample_time0)//sample_time0为ADC转换周期
{
m=0;
sample_time=1;
}
if(k==control_time0)//control_time0为控制周期T
{
k=0;
control_time=1;
}
if(h==DAC_time0)//DAC_time0为控制周期T
{
h=0;
DAC_time=1;
}
}
四、设计总结
这次课程设计用了好长时间,经过这次设计,使我认识到了设计中的细节问题对整体的影响。
从中我学到了很多,首先同学间以及老师的帮助使我增进不少,查阅资料使我视野开阔了。
并且我从中认识到了自己的弱点,细节问题不够清晰。
这次制作的成功经历,我收获不小,使我掌握了单片机的开发流程,明白了单片机的工作过程,在实际硬件中是怎样读取指令,提取数据的。
也提高了我软硬件调试的能力。
再加上主任看了我的作品后的一番鼓励,越发激起了我的自信心!
五、参考资料
1、《单片机原理及应用——基于51与高速SoC51》夏路易主编电子工业出版社
2、《微型计算机控制技术》潘新民王燕主编清华大学出版社
3、《传感器与检测技术》徐科军主编电子工业出版社