找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3677|回复: 3
打印 上一主题 下一主题
收起左侧

单片机线性插值计算温度值(0~1200°C范围的 K分度表,每隔5)

[复制链接]
跳转到指定楼层
楼主
电路原理图如下:


单片机源程序如下:
  1. #include<reg51.h>
  2. #include<stdio.h>
  3. #include<math.h>
  4. #define uint unsigned int
  5. #define uchar unsigned char

  6. unsigned int temp;
  7. unsigned  char t[6] ={"0000`C"}        ;
  8. float U1;
  9. unsigned int code K_TABLE[242]={0,198,397,597,798,1000,1203,1407,1614,1817,2022,2229,2436,2643,2850,3058,3266,
  10.         3473,3681,3888,4095,4302,4508,4714,4919,5124,5327,5531,5733,5936,6137,6338,6539,6739,6939,7139,7338,7538,7737,7937,8137,8336,8537,8737,8938,
  11.         9139,9341,9543,9745,9948,10151,10355,10560,10764,10969,11175,11381,11587,11793,12000,12207,12415,12623,12831,13039,13247,13456,13665,13874,
  12.         14083,14292,14502,14712,14922,15132,15342,15552,15763,15974,16184,16395,16607,16818,17029,17241,17453,17664,17876,18088,18301,18513,18725,18938,
  13.         19150,19363,19576,19788,20001,20214,20427,20640,20853,21066,21280,21493,21706,21919,22132,22346,22559,22772,22985,23198,23411,23624,23837,24050,
  14.         24263,24476,24689,24902,25114,25327,25539,25751,25964,26176,26387,26599,26811,27022,27234,27445,27656,27867,28078,28288,28498,28709,28919,29128,
  15.         29338,29547,29756,29965,30174,30383,30591,30799,31007,31214,31422,31629,31836,32042,32249,32455,32661,32866,33072,33277,33482,33686,33891,34095,
  16.         34299,34502,34705,34909,35111,35314,35516,35718,35920,36121,36323,36524,36724,36925,37125,37325,37524,37923,38122,38320,38519,38717,38915,39112,
  17.         39310,39546,39703,39900,40096,40292,40488,40634,40897,41074,41296,41463,41657,41851,42045,42239,42432,42625,42817,43010,43202,43394,43585,43777,
  18.         43968,44159,44349,44539,44729,44919,45108,45297,45486,45675,45863,46051,46238,46425,46612,46799,46985,47171,47356,47542,47726,47911,48095,48279,48462,48645,48828
  19.         };//0~1200°C范围的 K分度表,每隔5



  20. sbit RS=P2^0;     //数据(L)/命令(H)选择  
  21. sbit LCDRW=P2^1;     //写,低电平有效  
  22. sbit EN=P2^2;     //使能,低电平有效
  23. sbit START=P2^3;      
  24. sbit ALE=P2^4;  
  25. sbit EOC=P2^5;  
  26. sbit OE=P2^6;

  27. unsigned int search (float input);
  28. void conv_start(void);  
  29. void conv_check(void);  
  30. int  read_data(void);
  31. void delay_ms(int);  
  32. void write_data(char);  
  33. void write_com(char);   
  34. void LCD_home(void);  
  35. void lcd_init();  
  36. void print_string(char*);

  37. //----------------------------------------------------------------------------                                                                                                
  38. void main()
  39. {
  40.         int res=0;  
  41.   float vol=0.0;
  42.         float vin;
  43.         unsigned int tempin;
  44.         char pr[8];
  45.   lcd_init();               
  46.   while(1)
  47.         {
  48.                 res=read_data();
  49.                 vol=5.0*res/255;
  50.                 vin=vol/10*1000;
  51.                 tempin=search(vin);
  52.     sprintf(pr,"%d",tempin);
  53.                 LCD_home();  
  54.     print_string("Temperature:");  
  55.     print_string(pr);
  56.     write_data(0xDF);               
  57.     print_string("C  ");
  58.   }
  59. }

  60. //----------------------------------------------------------------------------
  61. unsigned int search (float input)        /*+查表子函数*/
  62. {
  63.   unsigned int  da=0,max,min,mid,j;
  64.   da=input*1000;                                     /*u1扩大1000倍 */
  65.   //da=da+1203;//30 度
  66.   max=242;
  67.   min=0;
  68.   temp=0;
  69.   while(1)
  70.         {
  71.                 mid=(max+min)/2;                    /*中心元素位置*/
  72.                 if(K_TABLE[mid]==da)
  73.                         {
  74.                                 temp=mid*5;
  75.                                 break;
  76.       }                                         /*中心元素等于查表的元素,计算相应温度*/
  77.                         if(K_TABLE[mid]>da)
  78.                                 max=mid-1;
  79.                           else            
  80.                                         min=mid+1;
  81.                         if((max-min)==1 )                                         /*线性插值计算温度值*/
  82.                                 {
  83.                                         if(da >= K_TABLE[min])
  84.                                                 {
  85.                                                         j=(K_TABLE[max]- K_TABLE[min])/5;    /*表中相邻两值对应温度相差5°C*/
  86.                                                         j=(da- K_TABLE[min])/j;
  87.                           temp=5*min+j;
  88.                     break;
  89.                                                 }
  90.                                         if(da <= K_TABLE[min])
  91.                                                 {
  92.                                                         j=(K_TABLE[max]- K_TABLE[min])/5;    /*表中相邻两值对应温度相差5°C*/
  93.                                                         j=(K_TABLE[min]-da )/j;
  94.                                                         temp=5*min-j;
  95.                                                         break;
  96.             }               
  97.         }
  98.                         if(max==min)        
  99.                                 {

  100.                                         if(da >= K_TABLE[min])
  101.                                                 {
  102.                                                         j=(K_TABLE[min+1]- K_TABLE[min])/5;
  103.                                                         j=(da- K_TABLE[min])/j;
  104.             }
  105.                                                 else if(da < K_TABLE[min])
  106.                                                         {
  107.                                                                 j=(K_TABLE[min]- K_TABLE[min-1])/5;
  108.                                                                 j=(da- K_TABLE[min-1])/j;
  109.                                                                 min = min -1;
  110.               }
  111.                                         temp=5*min+j;
  112.                       break;
  113.         }         
  114.   }
  115.         return temp;
  116. }

  117. //----------------------------------------------------------------------------
  118. void conv_start()
  119. {  
  120.     ALE=1;            
  121.     START=1;  
  122.     delay_ms(1);    //当晶振较高时加延时  
  123.     ALE=0;  
  124.     START=0;  
  125. //  delay_ms(5);    //当晶振较高时加延时  
  126. }

  127. //----------------------------------------------------------------------------
  128. int read_data()
  129. {   
  130.     int i=0;  
  131.     OE=1;  
  132.     conv_start();  
  133.     while(!EOC);  
  134.     i=P1;  
  135.     OE=0;  
  136.     return i;  
  137. }

  138. //----------------------------------------------------------------------------
  139. void delay_ms(int t)
  140. {  
  141.         int j;  
  142.         for( ;t!=0; t--)
  143.           for(j=0;j<255;j++);     
  144. }

  145. //----------------------------------------------------------------------------
  146. void write_data(char dat)
  147. {  
  148.         RS=1;          //数据  
  149.         LCDRW=0;        //写  
  150.         P0=dat; //把数据送到P口  
  151.         delay_ms(5);      //当晶振较高时加延时  
  152.         EN=1;  
  153.         delay_ms(5);    //当晶振较高时加延时  
  154.         EN=0;          //关使能  
  155. }  

  156. //----------------------------------------------------------------------------  
  157. void write_com(char com)
  158. {  
  159.         RS=0;          //命令  
  160.         LCDRW=0;        //写  
  161.         P0=com;  
  162.         delay_ms(5);    //当晶振较高时加延时  
  163.         EN=1;  
  164.         delay_ms(5);    //当晶振较高时加延时  
  165.         EN=0;  
  166. }

  167. //----------------------------------------------------------------------------
  168. void LCD_home(void)
  169. {  
  170.         write_com(0x02);  
  171. }

  172. //----------------------------------------------------------------------------
  173. void lcd_init()
  174. {  
  175.         LCDRW=0;  
  176.   RS=0;  
  177.         write_com(0x36);     //set text home address  
  178.         write_com(0x0c);        //display on,cursor off,blink off  
  179.         write_com(0x38);  
  180.         write_com(0x06);     //input set.  
  181.         write_com(0x01);     //screen clear  
  182.         write_com(0x80);    //DDRAM AD set to 00h,  
  183. }

  184. //----------------------------------------------------------------------------
  185. void print_string(char* str)
  186. {  
  187.         int i;  
  188.         for(i=0;str[ i]!=0;i++)  
  189.         {
  190.                 write_data(str[ i]);  
  191.   }  
  192. }
复制代码

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:344442 发表于 2018-6-4 10:15 | 只看该作者
回复

使用道具 举报

板凳
ID:138247 发表于 2018-9-18 10:35 | 只看该作者
感谢分享,很有帮助。。。。
回复

使用道具 举报

地板
ID:206373 发表于 2019-7-29 17:35 | 只看该作者
感谢分享,很有帮助。。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表