電路原理圖如下:
單片機源程序如下:
- #include <reg51.h>
- #include <intrins.h>
- #include "math.h"
- #define uchar unsigned char
- #define uint unsigned int
- #define data_out P1 //數據輸出口
- #define weicon P2 //位控
- #define K 273.15
- #define T0 (25.0+K)
- #define R0 10000.0
- #define B 3455.0
- sbit sdo = P0^0; //tlc549:sdo端
- sbit cs = P0^1;
- sbit sclk = P0^2;
- sbit LE1 = P3^6; //鎖存端
- sbit LE2 = P3^7;
- uchar code dis_code[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x9c,0xc6,0xbf};
- uint time;
- uint code temp_table[] = {4446,4224,4019,3830,3654,3491,3338,3196,3063,2938, //-10~-1
- 2764,2657,2555,2459,2324,2240,2121,2047,1942,1876, //0~9
- 1813,1723,1639,1585,1509,1461,1392,1348,1285,1245, //10~19
- 1188,1151,1098,1064,1015,984,939,910,868,841, //20~29
- 815,777,753,729,695,673,651,630,610,590, //30~39
- 560,542,523,505,488,479,462,446,430,414, //40~49
- 406 //50度
- };
- void delay18us()
- {
- _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
- _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
- }
- void delay200us()
- {
- uchar i;
- i = 100;
- do
- {
- _nop_();
- }while(--i);
- }
- uchar convert (void)
- {
- uint i,vtemp;
- cs = 1;
- sclk = 0;
- sdo = 1;
- cs = 0;
-
- delay18us();
- for(i = 0;i < 8;i++)
- {
- sclk = 1;
- _nop_();_nop_();_nop_();_nop_();
-
- vtemp = vtemp<<1;
- if(sdo)vtemp = vtemp|0x01;
- sclk = 0;
- _nop_();_nop_();
- }
- cs = 1;
- //vtemp = vtemp*1.96;
- return (vtemp);
- }
- void display(uchar a,uchar b)
- {
- LE2 = 1;
- weicon = 0x01<<a;
- // LE2 = 1;
- LE2 = 0;
- LE1 = 1;
- data_out = b;
- // LE1 = 1;
- LE1 = 0;
- delay200us();
- delay200us();
- delay200us();
- data_out = 0xff;
- LE1 = 1;
- LE1 = 0;
- //while(1);
- }
- void ntc_display(int temp)
- {
- static uchar c[] = {0x08,8,8,8,0x0a,0x0b};
- int i ;
- static int t_old;
-
- if(t_old != temp)
- {
- t_old = temp;
- if(temp >= 0)
- {
-
- for (i = 3;i >= 0;i--)
- {
- c[i] = temp%10;
- /*SBUF = '0'+c[i];
- while(!TI);
- ;
- TI = 0;*/
- temp /= 10;
- }
- for(i = 0;i <= 2;i++)
- {
- SBUF = '0'+c[i];
- while(!TI);
- ;
- TI = 0;
-
- }
- }
- else
- {
- temp = 0-temp;
- for (i = 3;i >= 0;i--)
- {
- c[i] = temp%10;
- temp /= 10;
-
- }
- c[0] = 0x0c;
- SBUF = '-';
- while(!TI);
- ;
- TI = 0;
- for(i = 1;i <= 2;i++)
- {
- SBUF = '0'+c[i];
- while(!TI);
- ;
- TI = 0;
-
- }
- }
-
- SBUF = '.';
- while(!TI);
- ;
- TI = 0;
- SBUF = '0'+c[3];
- while(!TI);
- ;
- TI = 0;
- SBUF = '\'';
- while(!TI);
- ;
- TI = 0;
- SBUF = 'C';
- while(!TI);
- ;
- TI = 0;
- SBUF = ' ';
- while(!TI);
- ;
- TI = 0;
- SBUF = ' ';
- while(!TI);
- ;
- TI = 0;
-
- /*SBUF = (c[0]<<4)|c[1];
- while(!TI);
- ;
- TI = 0;
- SBUF = (c[2]<<4)|c[3];
- while(!TI);
- ;
- TI = 0;*/
- }
-
-
- display(0,dis_code[c[0]]);
- display(1,dis_code[c[1]]);
- display(2,dis_code[c[2]]&0x7f);
- display(3,dis_code[c[3]]);
- display(4,dis_code[c[4]]);
- display(5,dis_code[c[5]]);
- }
- float lookup(float a)
- {
- int t,r,i = 0;
- r = (int)(a);
- while(1)
- {
- if((temp_table[i] <= r) && i < 61)
- break;
-
- if(i > 60)
- break;
- i++;
- }
- t = i*100.0+((temp_table[i]-(float)r)*100.0)/(temp_table[i] - temp_table[i+1]);
- return t/10-100.0;
- }
- void main(void)
- {
- int tem;
- float t_v;
- float t_r;
- float t;
- TMOD = 0x21;//TMOD = 0x01;
-
- TH1 = 0xfd;
- TH1 = 0xfd;
- SCON = 0x40;
- PCON = 0x00;
- TR1 = 1;
-
- ET0 = 1;
- EA = 1;
- TH0 = (65536-50000)/256;
- TL0 = (65536-50000)%256;
- TR0 = 1;
- time = 0;
- while(1)
- {
-
- if(time = 20)
- {
- time = 0;
- tem = convert();
- t_v = (float)tem*500/256;
- t_r = (t_v/(500.0-t_v))*1000; //t_r = (t_v*100)/((500-t_v)/10);
- t=1/((1/T0)+(log(t_r/R0)/B));
- tem = lookup(t_r);
-
-
- ntc_display(tem);
- }
- }
- }
- void time_T0(void) interrupt 1
- {
- TH0 = (65536-50000)/256;
- TL0 = (65536-50000)%256;
- time++;
- }
復制代碼 |