温控检测技术实习报告.docx
《温控检测技术实习报告.docx》由会员分享,可在线阅读,更多相关《温控检测技术实习报告.docx(21页珍藏版)》请在冰豆网上搜索。
温控检测技术实习报告
一、实验目的
1、对工程实际中的测试系统有整体认识,可以自己设计简单的测控系统,提高实践能力;
2从工程应用实际需要出发,能够认识传感器知识、信号处理电路知识、信号采集及单片机程序设计知识、单片机与计算机串口通信知识、简单的上位机监控软件设计知识等知识;
3能够实际操作测控系统接线,并深刻明白测控电路的工作原理。
二、实验内容
1、根据实验目的,了解PT100、温度变送器、单片机MCS51、A/D转换器、固态继电器、光电耦合器等实验器材的结构及原理;
2、了解温度测控系统原理,设计并绘制整体方案图;
3、了解测控系统中单片机的采集电路原理,并绘制出原理图;
4、对温度测控系统的整体电路进行线路连接,并进行检查;
5、熟悉简单的人机交互软件界面,了解测控系统单片机程序,并将程序通过软件写入单片机中,检测整个系统的测控性能;
6、完成相应的实验报告。
三、实验方案设计
1、方案图
2、方案分析:
该测控系统由温度采集电路、控制电路、加热电路三部分组成。
通过热电阻采集水的温度,然后通过温度变送器将采集到的温度信号转换成模拟电流信号,通过电阻进行I/V转换,得到模拟电压信号,再通过A/D转换器将模拟电压信号转换为数字信号,然后输入单片机中,根据单片机中的程序控制,使输出的电信号发生改变,以控制光电耦合器的闭合,光电耦合器的接通与关闭会使固态继电器发生相应的通闭,而固态继电器直接控制加热电路的通闭,从而控制水的加热,继而影响水的温度。
四、元件工作原理
1、热电阻PT100
该电阻为一种接触电阻式敏感元件,属于铂热电阻,随着水的温度变化,其电阻值也会发生相应的变化。
其电阻和温度变化的关系式为:
Rt=R0[1+AT+BT2+C(t-100)T3]
式中:
R0为0℃下的电阻值,R0=100Ω;T为摄氏温度。
A=3.9X10-3B=-5.8X10-7
T>=0时C=0;T<0时C=-4.183X10-12
电阻与温度呈非线性关系,但当测量精度要求较低时,电阻值与温度的函数关系可以简化为:
Rt=R0(1+AT)
2、温度变送器
其基本工作原理是将热电阻以三线制方式连接在电桥中,其电阻值的改变会改变测量电压,在通过转换将其变为电流信号再输出。
(实验中的温度变送器的输出电流范围为4~20mA)
R1=R2=R3,因此可以求出:
Rt=(2U-E)R/(2U+E)
3、A/D转换器
实验中采用的是TLC2543转换器,它属于11通道的12位串行A/D转换器,采用的是逐次逼近技术。
其内部没有电源,采用的是外部参考电压。
由公式(REF+-REF-)/212得到其参考电压取2.048V,计算出量子化因式为2.048/212=0.5mv。
即若输出电压2.5V,则量子化数为5,换成二进制数为101,据此同理类推。
4、光电耦合器
当输入到发光二极管为低电平时,发光二极管不导通,右侧光敏二极管也因此不通;当输入高电平时,发光二极管导通发亮,光敏二极管因此开通,从而向固态继电器输入电压。
该装置实现了光电之间的转换。
5、固态继电器SSR
是一种全部由固态电子元件组成的新型无触点开关器件,它利用电子元件(如开关三极管、双向可控硅等半导体器件)的开关特性,可达到无触点无火花地接通和断开电路的目的,因此又被称为“无触点开关”。
6、单片机
单片机,是一种微型计算机,能够通过多种形式的借口使其内部程序对外部工作电路进行有效的控制。
四、电气连接图
五、系统连线图
六、程序设计
1#include
2#include
3#include
4
5#define_HI1
6#define_LOW0
7#define_on1
8#define_off0
9
10#defineint_EX00//外部中断0
11#defineint_T01//定时器0中断
12#defineint_EX12//外部中断1
13#defineint_T13//定时器1中断
14#defineint_ES4//串行口可中断
15#defineint_ET25//8052定时器2中断
16
17#defineucharunsignedchar
18#defineuintunsignedint
19
20
21sbitTXC=P3^5;//MAX485
22
23sbitEOC2543=P3^2;//ADC2543
24sbitCLK2543=P1^0;//ADC2543
25sbitDIN2543=P1^1;//ADC2543
26sbitDOUT2543=P1^2;//ADC2543
27sbitCS2543=P1^3;//ADC2543
28
29sbitWDOG=P3^4;//MAX813
30
31sbitADD1=P2^0;
32sbitADD2=P2^1;//ADDRESS
33
34sbitIN1=P0^0;
35sbitIN2=P0^1;
36sbitIN3=P0^2;
37sbitIN4=P0^3;
38
39sbitOUT1=P0^4;
40sbitOUT2=P0^5;
41sbitOUT3=P0^6;
42sbitOUT4=P0^7;
43
44unsignedintoverflow_count=0;
45unsignedintnow_Vco0=0;
46unsignedintnow_Vco1=0;
47unsignedintnow_Vco2=0;
48unsignedintSetP=0;
49ucharT0_INTERVAL;
50ucharbstart=0;
51unsignedintT0_Init;
52
53
54ucharidatarxd232[6];
55ucharidataAddress;
56ucharSendBusy;
57
58voiddelay(ucharxms)//delay1-255ms(22.1184M)
59{
601uchari,j;
611for(j=0;j621{
632for(i=0;i<220;i++)
642{
653_nop_();
663_nop_();
673_nop_();
683_nop_();
693_nop_();
703_nop_();
713
723}
732}
741}
75
76uintpick_ch0(void)//adcCH0
77{
781uchari;//12bits/msb/bin
791uintvol=0;
801CLK2543=_HI;
811DIN2543=_LOW;
821CS2543=_LOW;
831_nop_();
841_nop_();
851_nop_();
861_nop_();
871_nop_();
881CLK2543=_HI;//时钟上升沿写入CH数据"0000"
891_nop_();
901CLK2543=_LOW;
911_nop_();
921CLK2543=_HI;
931_nop_();
941CLK2543=_LOW;
951_nop_();
961CLK2543=_HI;
971_nop_();
981CLK2543=_LOW;
991_nop_();
1001CLK2543=_HI;
1011_nop_();
1021CLK2543=_LOW;
1031for(i=0;i<8;i++)
1041{
1052CLK2543=_HI;//时钟上升沿写入数据"0000_0000"
1062_nop_();
1072CLK2543=_LOW;
1082}
1091CS2543=_HI;
1101for(i=10;i>0;i--)//delay10us
1111while(EOC2543==0);//在EOC=0时等待!
1121CS2543=_LOW;
1131_nop_();
1141_nop_();
1151_nop_();
1161_nop_();
1171_nop_();
1181CLK2543=_LOW;
1191for(i=0;i<11;i++)
1201{if(DOUT2543==_HI){vol|=0x01;}
1212elsevol|=0x00;
1222vol=_irol_(vol,1);
1232CLK2543=_HI;//时钟下升沿读出数据,
1242_nop_();
1252CLK2543=_LOW;}
1261CS2543=_HI;
1271_nop_();
1281_nop_();
1291_nop_();
1301_nop_();
1311returnvol;
1321}
133
134uintpick_ch1(void)//adcCH1
135{uchari;//12bits/msb/bin
1361uintvol=0;
1371CLK2543=_HI;
1381DIN2543=_LOW;
1391CS2543=_LOW;
1401_nop_();
1411_nop_();
1421_nop_();
1431_nop_();
1441_nop_();
1451CLK2543=_HI;//时钟上升沿写入CH数据"0001"
1461_nop_();
1471CLK2543=_LOW;
1481_nop_();
1491CLK2543=_HI;
1501_nop_();
1511CLK2543=_LOW;
1521_nop_();
1531CLK2543=_HI;
1541_nop_();
1551CLK2543=_LOW;
1561_nop_();
1571DIN2543=_HI;
1581CLK2543=_HI;
1591_nop_();
1601CLK2543=_LOW;
1611DIN2543=_LOW;
1621for(i=0;i<8;i++)
1631{CLK2543=_HI;//时钟上升沿写入数据"0000_0000"
1642_nop_();
1652CLK2543=_LOW;};
1661CS2543=_HI;
1671for(i=10;i>0;i--)//delay10us
1681while(EOC2543==0);//在EOC=0时等待!
1691CS2543=_LOW;
1701_nop_();
1711_nop_();
1721_nop_();
1731_nop_();
1741_nop_();
1751CLK2543=_LOW;
1761for(i=0;i<11;i++)
1771{if(DOUT2543==_HI){vol|=0x01;}
1782elsevol|=0x00;
1792vol=_irol_(vol,1);
1802CLK2543=_HI;//时钟下升沿读出数据,
1812_nop_();
1822CLK2543=_LOW;}
1831CS2543=_HI;
1841_nop_();
1851_nop_();
1861_nop_();
1871_nop_();
1881returnvol;
1891}
190
191uintpick_ch2(void)//adcCH2
192{uchari;//12bits/msb/bin
1931uintvol=0;
1941CLK2543=_HI;
1951DIN2543=_LOW;
1961CS2543=_LOW;
1971_nop_();
1981_nop_();
1991_nop_();
2001_nop_();
2011_nop_();
2021CLK2543=_HI;//时钟上升沿写入CH数据"0010",
2031_nop_();
2041CLK2543=_LOW;
2051_nop_();
2061CLK2543=_HI;
2071_nop_();
2081CLK2543=_LOW;
2091_nop_();
2101DIN2543=_HI;
2111CLK2543=_HI;
2121_nop_();
2131CLK2543=_LOW;
2141DIN2543=_LOW;
2151_nop_();
2161CLK2543=_HI;
2171_nop_();
2181CLK2543=_LOW;
2191for(i=0;i<8;i++)
2201{CLK2543=_HI;//时钟上升沿写入数据"0000_0000"
2212_nop_();
2222CLK2543=_LOW;};
2231CS2543=_HI;
2241for(i=10;i>0;i--)//delay10us
2251while(EOC2543==0);//在EOC=0时等待!
2261CS2543=_LOW;
2271_nop_();
2281_nop_();
2291_nop_();
2301_nop_();
2311_nop_();
2321CLK2543=_LOW;
2331for(i=0;i<11;i++)
2341{if(DOUT2543==_HI){vol|=0x01;}
2352elsevol|=0x00;
2362vol=_irol_(vol,1);
2372CLK2543=_HI;//时钟下升沿读出数据,
2382_nop_();
2392CLK2543=_LOW;}
2401CS2543=_HI;
2411_nop_();
2421_nop_();
2431_nop_();
2441_nop_();
2451returnvol;
2461}
247
248voidpick_ch0_16s(void)//采16次取平均值(四舍五入)
249{
2501uintsum_Vco=0;
2511uchari;
2521for(i=0;i<16;i++)
2531{
2542sum_Vco+=pick_ch0();
2552};
2561i=sum_Vco%16;
2571if(i>10)
2581now_Vco0=sum_Vco/16+1;
2591else
2601now_Vco0=sum_Vco/16;
2611}
262
263voidpick_ch1_16s(void)//采16次取平均值(四舍五入)
264{
2651uintsum_Vco=0;
2661uchari;
2671for(i=0;i<16;i++)
2681{
2692sum_Vco+=pick_ch1();
2702};
2711i=sum_Vco%16;
2721if(i>10)
2731now_Vco1=sum_Vco/16+1;
2741else
2751now_Vco1=sum_Vco/16;
2761}
277
278voidpick_ch2_16s(void)//采16次取平均值(四舍五入)
279{
2801uintsum_Vco=0;
2811uchari;
2821for(i=0;i<16;i++)
2831{
2842sum_Vco+=pick_ch2();
2852};
2861i=sum_Vco%16;
2871if(i>10)
2881now_Vco2=sum_Vco/16+1;
2891else
2901now_Vco2=sum_Vco/16;
2911}
292
293
294voidmain(void)
295{
296
297E=0x00;//初始化时禁止所有中断
298TMOD=0x11;//定时器1工作在工作方式2,定时器0工作在方式1,16位定时计数器
299SCON=0x50;//串行口工作在方式1,10位数据收发,1位起始位,8位数据位,1位停止位
300TCON=0x00;//
301
302P1=0xFF;//先写1到各个I/O端口
303P2=0xFF;
304P3=0xFF;
305P0=0xFF;
3061
3071T0_INTERVAL=10;
3081T0_Init=65536-921.6*T0_INTERVAL;
3091
3101if((ADD2==_LOW)&&(ADD1==_LOW))
3111Address=0x03;
3121elseif((ADD2==_LOW)&&(ADD1==_HI))
3131Address=0x02;
3141elseif((ADD2==_HI)&&(ADD1==_LOW))
3151Address=0x01;
3161else
3171Address=0x00;
3181
3191SendBusy=_LOW;
3201TXC=_LOW;//
3211RCAP2H=0xFF;
3221RCAP2L=220;//11.0592M/9600Baud
3231RCLK=_on;//Timer2作为波特率发生器
3241TCLK=_on;
3251TR2=_on;
3261ES=_on;
3271
3281OUT1=0;
3291OUT2=0;
3301OUT3=0;
3311OUT4=0;
3321
3331delay(100);
3341TH0=T0_Init/256;//25ms,fosc=11059200Hz,fosc/12=921600Hz,
3351例如t=25,X=23040,则应从42496开始计数,t=50,X=46080,则应从19456开始计数
3361t=10,X=9216,则应从56320开始计数,t=5,X=4608,则应从60928开始计数
3371TL0=T0_Init%256;
3381ET0=1;//开定时器0中断
3391TR0=1;
3401EA=1;
3411delay(100);
3421
3431do{
3442
3452if(TR0==0)
3462{
3473pick_ch0_16s();//采集
3483if(bstart==1)
3493{
3504if(((int)((now_Vco0*0.5/100.0-4)*18.75*10))3514OUT1=_LOW;
3524else
3534OUT1=_HI;
3544}
3553else
3563OUT1=_HI;
3573if(SendBusy==_LOW)
3583TR0=1;
3593}
3602}while
(1);
3611
3621}
363
364voidTimer0(void)interruptint_T0using1
365{
3661if(overflow_count>=4)
3671{
3682overflow_count=0;
3692TR0=0;
3702}
3711else
3721overflow_count=overflow_count+1;
3731
3741T0_Init=65536-921.6*T0_INTERVAL;
3751TH0=T0_Init/256;
3761TL0=T0_Init%256;
3771
3781}
379
380
381void_RS232()interruptint_ESusing3//RS232接收中断
382{
3831uchari;
3841uchartemp;
3851if(TI==_on)
3861{
3872TI=_off;
3882gotorx_end;
3892}
3901else
3911RI=_off;
3921for(i=1;i<6;i++)//shif