pt100接一个tl431恒流源再接2个运放加调零出来就是电压的变化再接个tl1543AD转换接到单片机里计算电阻值在计算温度temp_r=((float)temp)*5000/(1024*20)+100; //计算电阻值。[img]C:\Users\asus\Desktop\E13DA9FA454BBB6930F3639E5E9D33EE.pngC:\Users\asus\Desktop\4700A418B4F82E4F6F6DE1ED1AB49134.png[/img] |
這個電路不妨用麵包板,試做看看(或是用仿真軟體模擬看看)...例如測試範圍從 0到 100度 輸出Vo從0到4.92 這個電路就可以用 |
pingguotu 发表于 2016-10-29 15:26 热敏电阻3950的测温单片机里程序 code uint VOL[]和code uint Temper[]中的数据是怎么计算查表得到的。 result=(uint)((res/2048.0-1.0)*500.0); temp1=abs(result-VOL[0]); for(i=1;i<150;i++) { temp2=abs(result-VOL); if(temp1>=temp2) { temp1=temp2; flag=i; } 这一段程序是什么意思呢? :#include <reg52.h> #include <intrins.h> #include <math.h> typedef unsigned char uchar; typedef unsigned int uint; code uint VOL[]={ 343, 339, 339, 335, 332, 332, 328, 324, 320, 320, 316, 312, 312, 308, 304, 300, 300, 296, 292, 292, 289, 285, 285, 281, 277, 273, 273, 269, 265, 265, 261, 257, 257, 253, 250, 250, 246, 242, 242, 238, 234, 234, 230, 230, 226, 222, 222, 218, 218, 214, 210, 210, 207, 207, 203, 199, 199, 195, 195, 191, 191, 187, 187, 183, 179, 179, 175, 175, 171, 171, 167, 167, 164, 164, 160, 160, 160, 156, 156, 152, 152, 148, 148, 144, 144, 140, 140, 140, 136, 136, 132, 132, 132, 128, 128, 125, 125, 125, 121, 121, 121, 117, 113, 109, 109, 105, 101, 101, 97, 97, 93, 89, 89, 85, 85, 82, 82, 78, 78, 74, 74, 70, 70, 66, 66, 66, 62, 62, 58, 58, 58, 54, 54, 54, 50, 50, 50, 46, 46, 46, 42, 42, 42, 42, 39, 39, 39, 39, 35, 35}; code uint Temper[]={ 100, 150, 200, 250, 300, 350, 400, 450, 500, 550, 600, 650, 700, 750, 800, 850, 900, 950, 1000, 1050, 1100, 1150, 1200, 1250, 1300, 1350, 1400, 1450, 1500, 1550 1600, 1650, 1700, 1750, 1800, 1850, 1900, 1950, 2000, 2050, 2100, 2150, 2200, 2250, 2300, 2350, 2400, 2450, 2500, 2550, 2600, 2650, 2700, 2750, 2800, 2850, 2900, 2950, 3000, 3050, 3100, 3150, 3200, 3250, 3300, 3350, 3400, 3450, 3500, 3550, 3600, 3650, 3700, 3750, 3800, 3850, 3900, 3950, 4000, 4050, 4100, 4150, 4200, 4250, 4300, 4350, 4400, 4450, 4500, 4550, 4600, 4650, 4700, 4750, 4800, 4850, 4900, 4950, 5000, 5050, 5100, 5200, 5300, 5400, 5500, 5600, 5700, 5800, 5900, 6000, 6100, 6200, 6300, 6400, 6500, 6600, 6700, 6800, 6900, 7000, 7100, 7200, 7300, 7400, 7500, 7600, 7700, 7800, 7900, 8000, 8100, 8200, 8300, 8400, 8500, 8600, 8700, 8800, 8900, 9000, 9100, 9200, 9300, 9400, 9500, 9600, 9700, 9800, 9900, 10000}; sbit STS=P1^0; sbit CE = P1^1; sbit CS=P1^2; sbit A0=P1^3; sbit RC=P1^4; sbit RS=P1^5 ; sbit RW=P1^6 ; sbit EN=P1^7 ; void delay_ms(uint z) { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } uint AD1674_Read(void) { uint temp; uchar temp1,temp2; CS=1; //片选信号 CE=0; //初始化,关闭数据采集 CS=0; A0=0; RC=0; CE=1;//CE=1,CS=0,RC=0,A0=0启动12位温度转换 _nop_(); while(STS==1); //等待数据采集结束 CE=0; //芯片使能关闭 RC=1; A0=0; CE=1;//CE=1,CS=0,RC=1,12/8=1,A0=0 允许高八位数据并行输出 _nop_(); temp1=P0; //读取转换结果的高八位 CE=0; //芯片使能关闭 RC=1; A0=1; CE=1;//CE=1,CS=0,RC=1,12/8=0,A0=1 允许低四位数据 并行输出 _nop_(); temp2=P0; //读取转换结果的第四位 temp=((temp1<<4)|(temp2&0X0F)); //高位和低位合成实际温度,temp2为PO口的高四位 return (temp); //还回转换结果,右移四位是因为temp2为P0口的高四位 } /*** 写数据***/ void w_dat(unsigned char dat) { RS = 1; //EN = 0; P2 = dat; delay_ms(5); RW = 0; EN = 1; EN = 0; } /*** 写命令***/ void w_cmd(unsigned char cmd) { RS = 0; // EN = 0; P2 = cmd; delay_ms(5); RW = 0; EN = 1; EN = 0; } /*** 发送字符串到LCD***/ void w_string(unsigned char addr_start, unsigned char *p) { unsigned char *pp; pp = p; w_cmd(addr_start); while (*pp != '\0') { w_dat(*pp++); } } /*** 初始化1602****/ void Init_LCD1602(void) { EN = 0; w_cmd(0x38); // 16*2显示,5*7点阵,8位数据接口 w_cmd(0x0C); // 显示器开、光标开、光标允许闪烁 w_cmd(0x06); // 文字不动,光标自动右移 w_cmd(0x01); // 清屏 } void process(uint date,uchar add) { uchar A[7]; A[0]=date/1000%10+'0'; A[1]=date/100%10+'0'; A[2]='.'; A[3]=date/10%10+'0'; A[4]=date%10+'0'; A[5]='C'; w_string(add,A); } void main() { uchar i,flag=0; uint result,temp1,temp2; float res; Init_LCD1602(); w_string(0x80,"Temper:"); while (1) { res=(float)(AD1674_Read()); result=(uint)((res/2048.0-1.0)*500.0); temp1=abs(result-VOL[0]); for(i=1;i<150;i++) { temp2=abs(result-VOL); if(temp1>=temp2) { temp1=temp2; flag=i; } } process(Temper[flag],0x80+7); } |
通过热敏电阻的阻值变化,通过MCU的ADC获取热敏电阻的两端电压变化,计算出相应的电阻值,根据组织查边获取温度值,首先热敏电阻便宜,电阻简单,查表方便,相应的江都不高一般是0.1摄氏度吧! |
yzwzfyz 发表于 2016-10-26 00:06 我昨天认真的看了你给我的那个图,看分析不是很明白,我又不敢问你了,你说你说的已经够多了,哎,人傻了,不过还是很谢谢你给我的指点啦^_^ |
刘海龙 发表于 2016-10-26 22:47 刚刚老师又回复我了说A/D转换电路不一定用0809,看自己的需求 |
刘海龙 发表于 2016-10-26 22:47 (⊙o⊙)哦,是这样啊,不过我刚刚问了老师,他老古董,只准用89C51单片机,可能A/D 0809转换电路还要重新单独做,我们最后得仿真然后焊接出来,所以现在正在确定电路,因为老是被打下来,说太简单,不准用模块,心塞 |
七颗星星 发表于 2016-10-26 21:58 stc单片机就是51单片机,只不过是增强型51单片机(把ADC转换器PWM模块等集成到了单片机内部) 我写的NTC10k测温系统的程序其实就是利用单片机内部的ADC转换器将模拟信号转化为数字信号显示出来的,完全符合你们老师的要求。 |
刘海龙 发表于 2016-10-25 21:35 我看了大神的,那个单片机可不可以用51单片机呀?还有我觉得老师的意思好像是还要我利用A/D转换器然后将模拟信号变成数字信号,然后显示出来 |
刘海龙 发表于 2016-10-25 21:35 哇噻噻~真的是大神呐~崇拜,星星眼(☆_☆) |
谢谢分享 |
“二极管测温范围有限,0~60“? 理论上,二极管特性与温度有关,并不受温度限制,只要二极管不坏(超高温引起的物理损坏)。 所以低于0.高于60都能用于测温! |
顺便提一下,二极管测温范围有限,0~60。太高了,不好。 |
实例67 LCD1602显示屏显示 先Proteus仿真一下,确认有效。 ![]() ![]() 以上摘自张志良编著《80C51单片机仿真设计实例教程——基于Keil C和Proteus》清华大学出版社ISBN 978-7-302-41682-1 书中电路和程序设计有详细说明,程序语句条条有注解。 |
本帖最后由 zl2168 于 2016-10-25 09:53 编辑 实例84 ADC0832串行A-D(虚拟CLK) 先Proteus仿真一下,确认有效。 ![]() ![]() 以上摘自张志良编著《80C51单片机仿真设计实例教程——基于Keil C和Proteus》清华大学出版社ISBN 978-7-302-41682-1 书中电路和程序设计有详细说明,程序语句条条有注解。 |
本帖最后由 zl2168 于 2016-10-25 09:54 编辑 给你提供几个参考案例 实例83 ADC0832串行A-D(TXD输出CLK) 先Proteus仿真一下,确认有效。 ![]() ![]() 以上摘自张志良编著《80C51单片机仿真设计实例教程——基于Keil C和Proteus》清华大学出版社ISBN 978-7-302-41682-1 书中电路和程序设计有详细说明,程序语句条条有注解。 |
本帖最后由 zl2168 于 2016-10-25 09:41 编辑 楼主选择测温元件可以选二极管,也可选择热敏电阻抑或其他测温元件。但桥式取样电路是经典的,其连接方式应根据测温元件属正温度系数还是负温度系数。正温度系数测温元件可按我上传的电路形式连接,若是负温度系数测温元件,与运放连接应交换输入端,否则输出电压为负极性。 |
本帖最后由 zl2168 于 2016-10-25 09:31 编辑 测温元件的非线性几乎是不可避免的,无论是二极管、热敏电阻抑或其他元件,修正的简单方法就是查表,预先测得真实温度与非线性测温元件的一一对应数表,然后在程序中查表修正。 我上文所提及的非线性是指放大电路的非线性,例如,对温度信号Ut与基准电压之间差值的非线性:Uo1=91Ut-90Uref。还有对接近电源电压+5V时的运放饱和区非线性,接近0电压时的运放截止区非线性,等等。 |
逝者如斯夫。 |
不要以为不线性,就对测温有影响了。其实没有电阻与成线性关系的。不线性也无关系,计算机就是干这个活的! 定定心心来做,哪一种方式都可以实现。 做复杂了,可以多积累一点经验。做简单了,完成的胜算多一点。不必纠结。开工吧。 做这个题目,你跳不掉做一个查表的程序。除非老师不考你“对非线性的处理及不规则曲线的处理” |
热敏电阻测温可以实现,根据电阻特性解方程t=(Rt-B)/K就可以得到温度了 |
zl2168 发表于 2016-10-24 21:38 谢谢你了^_^我会好好看你的资料和分析的。让你费心了,主要我又不太有设计理念,就想照搬一下,做出东西来 |
本帖最后由 zl2168 于 2016-10-25 09:34 编辑 给你的电路不看,自己找一个不太好的电路。 你自己找的电路可勉强用,但不太好,有问题。 第一级运放,差动放大,Uo1=91Ut-90Uref,其中Ut为温度信号,Uref为基准电压。这种91Ut-90Uref的差动比例放大,本身就是非线性的 第二级运放,反相放大,Uo1=2Ut-Uref 你用的运放为LM358,双运放,但加的电源电压是单极性的,那么0点及最高点5V处会产生非线性放大,你除了测温元件非线性,放大电路也是非线性的。 优点是取样电路电源电压比较稳定,由431稳压。但意义不是很大,因电源电压略有波动对Ut和Uref作用是相同的。具有共模性质,被运放抑制。 我给你介绍的电路与你的电路结构基本相同,但细节好得多。 ![]() 桥式取样。由R4、D1分压取得温度信号Ut,不过测温元件是二极管;由R5、R7、RP1分压取得基准电压Uref,这个Uref是可调的,RP1用于调节零度基准(对应于AD转换器的最小值00H),而且为了防止电位器噪声,加了一个滤波电容。 第一级运放,差动放大。由于4个10k,组成减法器,Uo1=Uref-Ut。 第二级运放,反相放大,Uo2=Au*Uo1,Au可调,RP2用于调节满度(AD最大值FFH) 为了是运放放大有较好的线性度,运放正电源电压比AD转换器的电源电压略高,取6.2V;运放负电源电压取-0.7V。就避免了你电路0V和5V处的非线性。 再有,你只需一路AD,用不着8路AD 0809,0809是并行AD,太庞大复杂,没必要。用只有2路AD的串行AD,足够了,体积小,成本低,编程相对方便。 好了,不说了,我已经对你说得太多了。 |
1062298577 发表于 2016-10-24 07:52 是滴嘞,老师说数字传感器里面已经是一个模块了,除了自己要做一个最小系统自己什么都不用干,哪能这么简单,我也是要晕了~ |
PT100测温范围广,耐高温,是温敏电阻是比较高级的传感器,就是价格高。Pt是贵金属。 |
我有上面提到的方式,是我们产品应用的实例,硬件上就是两个电阻分压(一个是热敏),采样分压值。已是最简单了。温度表格的计算稍麻烦一点,不过用EXCEL计算也很方便。单片机程序就是采样、查表、温度的小数部分,做个插值就OK了。 |
PT100贵! 电路差别不大,因为都属于电阻转电压。 对照表的生成,在PC机上完成,复制到单片机中即可。 |
用pt100吧,这个器件的线性很好 以下代码是我拟合了PT100,cu50,BA1,BA2的曲线,你可以参考使用。
|
你老师意思肯定是不能用数字传感器咯 |
yzwzfyz 发表于 2016-10-23 22:48 很感谢大神,我明白你的思路,不过让我设计电路图想想小女子就汗颜,蓝瘦。不过嘛我在想是用PT100还是其他你这个热敏电阻电路会简单些 |
发一部分计算值给你参考,3950是热敏电阻的型号 |
温度℃ 3950电阻K 采样电压 AD值 AD取整 -20 98.26 2.995178275 928.95908 929 -19 92.74 2.978800857 923.879599 924 -18 87.55 2.961711943 918.5794464 919 -17 82.69 2.943974539 913.0781638 913 -16 78.12 2.925510667 907.351566 907 -15 73.83 2.906346177 901.4076703 901 -14 69.8 2.886466165 895.2418546 895 -13 66.01 2.865846599 888.8466649 889 -12 62.45 2.844513458 882.2301587 882 -11 59.1 2.822431259 875.3813314 875 -10 55.95 2.799620925 868.3066717 868 -9 52.98 2.776024135 860.9880915 861 -8 50.19 2.751736169 853.4551421 853 -7 47.57 2.726784784 845.7164322 846 -6 45.09 2.700980214 837.7131058 838 -5 42.76 2.674526156 829.5083397 830 -4 40.56 2.647310127 821.0672468 821 -3 38.49 2.619447309 812.4255517 812 -2 36.53 2.590780142 803.5343864 804 -1 34.68 2.561414503 794.4265891 794 0 32.94 2.531485794 785.1441546 785 1 31.3 2.500968523 775.6791768 776 2 29.74 2.469602416 765.9509311 766 3 28.28 2.437931034 756.1280042 756 4 26.89 2.405448631 746.0535375 746 5 25.58 2.372512648 735.8383924 736 6 24.34 2.339021549 725.4510775 725 7 23.17 2.305125113 714.9380464 715 8 22.06 2.270679975 704.2548347 704 9 21.01 2.235827153 693.445179 693 10 20.01 2.200366544 682.4470177 682 11 19.07 2.164809082 671.4188166 671 12 18.18 2.128956707 660.2991483 660 13 17.33 2.092535675 649.0031101 649 14 16.53 2.056125141 637.7103279 638 15 15.77 2.019441211 626.3327513 626 16 15.05 1.982634731 614.9171657 615 17 14.37 1.945876077 603.5164136 604 18 13.72 1.908768971 592.0075885 592 19 13.1 1.871428571 580.4264069 580 20 12.52 1.834635879 569.0150977 569 21 11.96 1.79726776 557.4253188 557 22 11.43 1.76010266 545.8985068 546 23 10.93 1.723315815 534.489011 534 24 10.45 1.686308068 523.0110024 523 25 10 1.65 511.75 512 26 9.569 1.613659359 500.4788952 500 |
表格不必做得很密,表格之间的数据(指两个相邻数据之间的数据),无法直接取得温度值,可以用插值的方法估算得到。 |
采样电压变化的原因,是“10K的热敏阻”阻值的变化,将“热敏阻”阻值与温度的关系特性(与生产商索取)进行计算(计算:与10电阻分压后的电压),制成一个:“分压采样值”与“温度”关系的表格,将此表格放在程序中,采样、查表后就达成楼主的目的了。 |
比如用“标称值为10K的热敏阻”,与一个温漂小的“10K电阻”串联。则当温度变化时,其分压值会随温度变化。采样这个电压,就能得到对应这个电压值的温度。 |
尚尚123 发表于 2016-10-23 20:25 好像不行哎,要做一个测温系统 |
热敏电阻一般都有一个温度对应的线段吧,如果有公式的话,可以选择用公式的方法算出温度,不然用一个码表,把对应温度的AD输出的值对应出来就可以了吧。 |