(1)
0≤t<850℃Rt=R0(1+At+Bt2)
(2)
Rt为t℃时的电阻值,R0为0℃时的阻值。
公式中的A,B,系数为实验测定。
这里给出标准的
DINIEC751系数:
A=3.9083E-3、B=-5.775E-7、C=-4.183E-12
根据韦达公式求得阻值大于等于100欧姆的Rt-〉t的换算公式:
0≤t<850℃t=(sqrt((A*R0)^2-4*B*R0*(R0-Rt))-A*R0)/2/B/R0
PT100温度感测器是一种以白金(Pt)作成的电阻式温度检测器,属于正电阻系数,其电阻和温度变化的关系式如下:
R=Ro(1+αT) 其中α=0.00392,Ro为100Ω(在0℃的电阻值),T为摄氏温度
因此白金作成的电阻式温度检测器,又称为PT100。
金属热电阻的电阻值和温度一般可以用以下的近似关系式表示,即
Rt=Rt0[1+α(t-t0)]
式中,Rt为温度t时的阻值;Rt0为温度t0(通常t0=0℃)时对应电阻值;α为温度系数。
半导体热敏电阻的阻值和温度关系为
Rt=AeB/t
中Rt为温度为t时的阻值;A、B取决于半导体材料的结构的常数。
图2热电阻测温电路
3.2运算放大电路
因为通过PT-100热电阻测的温度的信号很小,所以我们采用具有一定抗共模抗干扰能力的减法差动放大器电路,所以我们才有LM244这个四运算放大器。
减法差动放大电路只对U有放大作用。
从图中可以看到U1、U2两个同相运放电路构成输入级,在与差分放大器U3串联组成三运放差分防大电路。
电路中有关电阻保持严格对称,具有以下几个优点:
(1)U1和U2提高了差模信号与共模信号之比,即提高了信噪比;
(2)在保证有关电阻严格对称的条件下,各电阻阻值的误差对该电路的共模抑制比KCMRR没有影响;
(3)电路对共模信号几乎没有放大作用,共模电压增益接近零。
因为电路中R1=R2、R3=R4、R5=R6,放大倍数是:
Avd=U0/Ui1-Ui2=-[(Rp+2R1)/Rp]*(R5/R3)
通常,第一级增益要尽量高,第二级增益一般为1~2倍,这里第一级选择100倍,第二级为1倍。
则取R3=R4=R5=R6=10KΩ,要求匹配性好,一般用金属膜精密电阻,阻值可在10KΩ~几百KΩ间选择。
则Avd=(RP+2R1)/RP
先定RP,通常在1KΩ~10KΩ内,这里取RP=1KΩ,则可由上式求得R1=99RP/2=49.5KΩ取标称值51KΩ。
通常RS1和RS2不要超过RP/2,这里选RS1=RS2=510,用于保护运放输入级。
A1和A2应选用低温飘、高KCMRR的运放,性能一致性要好。
图3运算放大电路
3.3A/D转化
A/D转换的目标是将模拟量转换成数字量,在本次课程设计中,选用ADC0804。
ADC0804是一款8位、单通道、低价格A/D转换器,主要特点是:
模数转换时间大约100us;方便TTL或CMOS标准接口;可以满足差分电压输入;具有参考电压输入端;内含时钟发生器;单电源工作时(0~5)V输入电压范围是0~5V;不需要调零等等。
1.转换时序
ADC0804控制信号的时序图如图所示,由图可见,各控制信号时序关系为:
当CS与WR同为低电平时,A/D转换被启动而在WR上升沿后100μs模数完成转换,转换结果存入数据锁存器,同时INTR自动变为低电平,表示本次转换已结束。
如CS、RD同时来低电平,则数据锁存器三态门打开,数字信号送出,而在RD高电平到来后三态门处于高阻状态。
2.零点和满刻度调节
ADC0804的零点无需调整。
其中Vmax是输入电压的最大值,Vmin是输入电压的最小值。
当输入电压与VIN+值相当时,调整VREF/2端电压值是输出码为FEH或FFH。
3.参考电压的调节
在使用A/D转换器时,为保证其转换精度,要求输入电压满量程使用,如输入电压动态范围较小,则可调节参考电压VREF,以保证小信号输入时ADC0804芯片8位的转换精度。
4.接地
模数、数模转换电路中要特别注意到地线的正确连接,否则干扰很严重,以致影响转换结果的正确性。
A/D、D/A及取样-保持芯片上都提供了独立的模拟地(AGND)和数字地(DGND)的引脚。
在线路设计中,必须将所有的器件的模拟地和数字地分别相连,然后将模拟地与数字地仅在一点上相连接。
地线的正确连接方法。
转换数据的传送A/D转换后得到的数据应及时传送给单片机进行处理。
数据传送的关键问题是如何确认A/D转换的完成,因为只有确认完成后才能传送。
模拟转换电压范围:
0~+5V,即0≤Vin≤+5V。
分辨率:
8位,即分辨率为1/28=1/256,转换值介于0~255之间。
放大倍数在ADC0804的精度之间。
由于设计误差要求为1℃,1℃对应的输入电压为(1/100)*5=0.05V,8位A/D转换芯片的分辨率为1/256*5V=19.53mV
转换精度-它是A/D转换器的最大量化误差和模拟精度的共同体现。
8位转换器的最大量化误差为9.765mV(80mV
0.5=9.765mV,)全量程的相对误差为0.19%(9.765mV/5V
100%)放大倍数满足A/D转换精度。
图4A/D转换电路
3.4单片机
单片机在启动运行时都需要复位,使CPU和系统中的其他部件都处于一个确定的初始状态,并从这个状态开始工作。
MCS-52单片机有一个复位引脚RST,采用施密特触发输入。
单片机的复位方式可由手动复位方式完成。
AT89C52单片机内部有一个高增益反相放大器,用于构成振荡器。
引脚XTAL2和XTAL1分别是此放大器的输出端和输入端。
作为反馈器件的片外晶体谐振器与该放大器一起构成一个自激振荡器。
电容C2和C1和外接晶体谐振器一起构成并联谐振电路,接在放大器的反馈回路中。
虽然对外接电容的值没有非常严格的要求,但震荡器频率的高低、震荡器的稳定性、起振的快速性和温度的稳定性会由电容的大小影响。
所以,此电路系统的晶体振荡器的值为12MHz,电容的种类应尽量选择陶瓷电容,电容值大概30μF。
在电路板焊接时,电容和晶体振荡器应尽可能安装得靠近单片机芯片,这样做是为了减少寄生电容,更好地保证震荡器可靠稳定地工作。
图5单片机晶振电路
3.5数码显示电路
这是显示电路,我们使用的是LM020L这个LED显示管,这个显示管一共是16个引脚。
第1脚:
GND为电源地第2脚:
VCC接5V电源正极第3脚:
V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高(对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度)。
第4脚:
RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。
第5脚:
RW为读写信号线,高电平
(1)时进行读操作,
低电平(0)时进行写操作。
第6脚:
E(或EN)端为使能(enable)端,高电平
(1)时读取信息,负跳变时执行指令。
第7~14脚:
D0~D7为8位双向数据端。
第15~16脚:
空脚或背灯电源。
15脚背光正极,16脚背光负极。
当我们要读数据:
输入RS=1,RW=1,E=高脉冲。
输出:
D0—D7为数据。
通过单片机将数据发送我们通过数码显示管来显示我们此时的温度。
(1)主要性能:
与MCS-52单片机产品兼容、8K字节的在系统可编程Flash存储器、一千次的擦写周期、全静态操作:
0Hz~24MHz、三级加密程序存储器、三十二个可编程I/O口线、三个16位定时器/计数器以及八个中断源、全双工UART串行通道、低功耗空闲和掉电模式、掉电后中断可唤醒、看门狗定时器、双数据指针、掉电标识符。
(2)功能特性:
AT89C52是一种低功率消耗、性能较高CMOS8位微控制器,具备8K在系统可编程Flash存储器。
使用Atmel公司高密度非易失性存储器高技术制作,可以与工业80C51产品指令和引脚全部兼容片上。
Flash能够允许程序存储器在系统可编程执行,亦适合于常规编程器。
在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使得AT89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。
图6数码显示电路
4系统软件设计
4.1主程序设计
主程序既把以上各子程序串连成一个整体,使整个程序循环运行。
主程序一直调用显示电路,若温度改变,则会进入以下的主程序部分执行相应的A/D转换操作并作出相应的处理。
通过转换后,显示的值也会同时发生改变。
之后再返回到程序始端,如此反复运行,就构成了程序的整体。
图图7主程序流程图
4.2A/D转换子程序设计
这次课程设计采用的是ADC0804,每一个时钟信号下降沿开始,输出一位数据,直到8位数据全部输完为止,输出的顺序是从最高位到最低位。
A/D转换子程序的工作原理:
开启A/D转换芯片,将A/D转换结果送进位C,然后左移A寄存器,直到8位数全部送到A寄存器,关闭A/D转换,最后将A/D转换结果存储到30H单元.
图8A/D转化程序流程图
4.2显示子程序的设计
将AD转换的结果送A寄存器,将100送B寄存器,然后A除以B,得到的商存到百位存储单元。
再将B寄存器里的数送A寄存器,把10送B寄存器,再A除以B,得到的商存十位存储单元,余数存个位单元。
图9显示子程序流程图
5课程设计总结
通过此次课程设计,使我更加扎实的掌握了有关单片机方面的知识,在设计过程中虽然遇到了一些问题,但经过一次又一次的思考,一遍又一遍的检查终于找出了原因所在,也暴露出了前期我在这方面的知识欠缺和经验不足。
实践出真知,通过亲自动手制作,使我们掌握的知识不再是纸上谈兵。
过而能改,善莫大焉。
在课程设计过程中,我们不断发现错误,不断改正,不断领悟,不断提高。
最终这次课程设计终于顺利完成了,在设计中遇到了很多问题,最后在老师的指导下,终于游逆而解。
在今后社会的发展和学习实践过程中,一定要不懈努力,不能遇到问题就想到要退缩,一定要不厌其烦的发现问题所在,然后一一进行解决,只有这样,才能成功的做成想做的事,才能在今后的道路上劈荆斩棘,而不是知难而退,那样永远不可能收获成功,收获喜悦,也永远不可能得到社会及他人对你的认可!
回顾起此课程设计,至今我仍感慨颇多,从理论到实践,在这段日子里,可以说得是苦多于甜,但是可以学到很多很多的东西,不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。
通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。
6电路总原理图
图10总电路图
7电路仿真
我们将设计号的程序通过Keli写入,编译,然后通过Proteus这个软件来进行仿真示意。
我们能很清楚的从仿真来看我们的原理图和程序对不对。
图11电路仿真图
8参考文献
[1]张鑫.单片机原理及应用(第2版)[M].电子工业出版社,2010年.
[2]张毅刚.单片机原理与应用设计[M].电子工业出版社,2008年.
[3]胡汉才.单片机原理及其接口技术学习辅导与实践教程[M].清华大学出版社,2010年.
[4]张义和.例说51单片机(C语言版)[M].人民邮电出版社,2008年.
[5]张培仁等.基于C语言编程MCS-51单片机原理与应用[M]
9程序附录
#include"at89X52.h"
sbitLCD_RS=P2^0;
sbitLCD_RW=P2^1;
sbitLCD_E=P2^2;
sbitADC_CS=P2^3;
sbitADC_WR=P3^6;
sbitADC_RD=P3^7;
#defineLCD_DATAP0
unsignedcharLcdBuf1[10]="";
unsignedcharcodeBmp001[][8]=
{
{0x06,0x09,0x09,0x06,0x00,0x00,0x00,0x00},
{0x06,0x09,0x10,0x10,0x10,0x09,0x06,0x00}
};
voiddellay(unsignedinth)
{
while(h--);//0.01MS
}
voidWriteDataLcd(unsignedcharwdata)
{
LCD_DATA=wdata;
LCD_RS=1;
LCD_RW=0;
LCD_E=0;
dellay(1000);
LCD_E=1;
}
voidWriteCommandLcd(unsignedcharwdata)
{
LCD_DATA=wdata;
LCD_RS=0;
LCD_RW=0;
LCD_E=0;
dellay(1000);
LCD_E=1;
}
voidlcd_init(void)
{
LCD_DATA=0;
WriteCommandLcd(0x38);
dellay(1000);
WriteCommandLcd(0x38);
dellay(1000);
WriteCommandLcd(0x01);
WriteCommandLcd(0x0c);
voiddisplay_xy(unsignedcharx,unsignedchary)
{
if(y==1)
x+=0x40;
x+=0x80;
WriteCommandLcd(x);
}
voiddisplay_string(unsignedcharx,unsignedchary,unsignedchar*s)
{
display_xy(x,y);
while(*s)
{
WriteDataLcd(*s);
s++;
}
}
voidWrite_CGRAM(unsignedcharadd,unsignedchar*char_num)
{
unsignedi;
add=add<<3;
WriteCommandLcd(0x40|add+8);
for(i=0;i<8;i++)
{
WriteDataLcd(*char_num++);
}
}
voiddelayms()
{
inti;
for(i=110;i>0;i--);
}
voiddelay1s()
{
inti,j;
for(i=1000;i>0;i--);
for(j=110;j>0;j--);
}
voidconvert()
{
unsignedlongvalue;
chari;
unsignedlongres;
inttemp,temp2;
intw;
P1=0xff;
ADC_RD=0;
for(i=0;i<10;i++);
value=P1;
res=(float)(2550000+110000*value/30)/(2550-11*value/30);
temp=(float)(res*10000-10000000)/3851-545;
temp2=temp;
if(temp>=0)
{
for(i=6;temp>0;i--)
{
LcdBuf1[i]=temp%10+48;
temp/=10;
}
}
if(temp<0)
{
w=-temp;
for(i=6;w>0;i--)
{
LcdBuf1[i]=w%10+48;
w/=10;
}
}
if(i>=0&&temp<0)
{
if(temp>-10)
{
LcdBuf1[i]='0';
i--;
}
LcdBuf1[i]='-';
i--;
/*if(i==5)
{
LcdBuf1[5]='0';
i--;
}
LcdBuf1[4]='-';
i--;*/
}
for(;i>=0;i--)
LcdBuf1[i]='';
for(i=0;i<5;i++)
LcdBuf1[i]=LcdBuf1[i+1];
if(LcdBuf1[4]=='')LcdBuf1[4]='0';
LcdBuf1[5]='.';
LcdBuf1[7]=1;
LcdBuf1[8]='C';
WriteCommandLcd(0x84);
display_string(3,0,LcdBuf1);
ADC_RD=1;
ADC_WR=0;
for(i=0;i<10;i++)
ADC_WR=1;
delayms();
}
main()
{
unsignedchari;
lcd_init();
for(i=0;i<2;i++)
Write_CGRAM(i,Bmp001[i]);
ADC_CS=0;
ADC_WR=0;
for(i=0;i<10;i++);
ADC_WR=1;
while
(1)
{
convert();
delay1s();
}
}