找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机仿真NTC热敏电阻温度上传到上位机 源程序

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


单片机源程序如下:

  1. #include <reg51.h>
  2. #include <intrins.h>
  3. #include "math.h"

  4. #define uchar unsigned char
  5. #define uint unsigned int
  6. #define data_out        P1                //数据输出口
  7. #define weicon        P2                        //位控

  8. #define K 273.15
  9. #define T0 (25.0+K)
  10. #define R0 10000.0
  11. #define B 3455.0

  12. sbit sdo = P0^0;                        //tlc549:sdo端
  13. sbit cs = P0^1;
  14. sbit sclk = P0^2;
  15. sbit LE1 = P3^6;                        //锁存端
  16. sbit LE2 = P3^7;


  17. uchar code dis_code[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x9c,0xc6,0xbf};

  18. uint time;
  19. uint code temp_table[] = {4446,4224,4019,3830,3654,3491,3338,3196,3063,2938,                //-10~-1
  20.                                                                                                         2764,2657,2555,2459,2324,2240,2121,2047,1942,1876,                        //0~9
  21.                                                                                                         1813,1723,1639,1585,1509,1461,1392,1348,1285,1245,                        //10~19
  22.                                                                                                         1188,1151,1098,1064,1015,984,939,910,868,841,                                        //20~29
  23.                                                                                                         815,777,753,729,695,673,651,630,610,590,                                                        //30~39
  24.                                                                                                         560,542,523,505,488,479,462,446,430,414,                                                                //40~49
  25.                                                                                                         406                                        //50度
  26.                                                                                                         };

  27. void delay18us()
  28. {
  29.         _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
  30.         _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
  31. }

  32. void delay200us()
  33. {
  34.         uchar i;
  35.         i = 100;
  36.         do
  37.         {
  38.                 _nop_();
  39.         }while(--i);
  40. }


  41. uchar convert (void)
  42. {
  43.         uint i,vtemp;
  44.         cs = 1;
  45.         sclk = 0;
  46.         sdo = 1;
  47.         cs = 0;
  48.         
  49.         delay18us();
  50.         for(i = 0;i < 8;i++)
  51.         {
  52.                 sclk = 1;
  53.                 _nop_();_nop_();_nop_();_nop_();
  54.                
  55.                 vtemp = vtemp<<1;
  56.                 if(sdo)vtemp = vtemp|0x01;
  57.                 sclk = 0;
  58.                 _nop_();_nop_();
  59.         }
  60.         cs = 1;
  61.         //vtemp = vtemp*1.96;
  62.         return (vtemp);
  63. }

  64. void display(uchar a,uchar b)
  65. {
  66.         LE2 = 1;
  67.         weicon = 0x01<<a;
  68. //        LE2 = 1;
  69.         LE2 = 0;
  70.         LE1 = 1;
  71.         data_out = b;
  72. //        LE1 = 1;
  73.         LE1 = 0;
  74.         delay200us();
  75.         delay200us();
  76.         delay200us();
  77.         data_out = 0xff;
  78.         LE1 = 1;
  79.         LE1 = 0;
  80.         //while(1);
  81. }

  82. void ntc_display(int temp)
  83. {
  84.         static uchar c[] = {0x08,8,8,8,0x0a,0x0b};
  85.         int i ;
  86.         static int t_old;
  87.         
  88.         if(t_old != temp)
  89.         {
  90.                 t_old = temp;
  91.                 if(temp >= 0)
  92.         {
  93.                
  94.                 for (i = 3;i >= 0;i--)
  95.         {
  96.                 c[i] = temp%10;
  97.                 /*SBUF = '0'+c[i];
  98.                 while(!TI);
  99.                 ;
  100.                 TI = 0;*/
  101.                 temp /= 10;
  102.         }
  103.         for(i = 0;i <= 2;i++)
  104.         {
  105.                 SBUF = '0'+c[i];
  106.                 while(!TI);
  107.                 ;
  108.                 TI = 0;
  109.                
  110.         }
  111.         }
  112.         else
  113.         {
  114.                 temp = 0-temp;
  115.                 for (i = 3;i >= 0;i--)
  116.         {
  117.                 c[i] = temp%10;
  118.                 temp /= 10;
  119.                
  120.         }
  121.                 c[0] = 0x0c;
  122.         SBUF = '-';
  123.                 while(!TI);
  124.                 ;
  125.                 TI = 0;
  126.                 for(i = 1;i <= 2;i++)
  127.         {
  128.                 SBUF = '0'+c[i];
  129.                 while(!TI);
  130.                 ;
  131.                 TI = 0;
  132.                
  133.         }
  134.         }
  135.         
  136.         SBUF = '.';
  137.                 while(!TI);
  138.                 ;
  139.                 TI = 0;
  140.         SBUF = '0'+c[3];
  141.                 while(!TI);
  142.                 ;
  143.                 TI = 0;
  144.                 SBUF = '\'';
  145.                 while(!TI);
  146.                 ;
  147.                 TI = 0;
  148.         SBUF = 'C';
  149.                 while(!TI);
  150.                 ;
  151.                 TI = 0;
  152.         SBUF = ' ';
  153.                 while(!TI);
  154.                 ;
  155.                 TI = 0;
  156.                 SBUF = ' ';
  157.                 while(!TI);
  158.                 ;
  159.                 TI = 0;
  160.         
  161.         /*SBUF = (c[0]<<4)|c[1];
  162.                 while(!TI);
  163.                 ;
  164.                 TI = 0;
  165.         SBUF = (c[2]<<4)|c[3];
  166.                 while(!TI);
  167.                 ;
  168.                 TI = 0;*/
  169.         }
  170.         
  171.         
  172.         display(0,dis_code[c[0]]);
  173.         display(1,dis_code[c[1]]);
  174.         display(2,dis_code[c[2]]&0x7f);
  175.         display(3,dis_code[c[3]]);
  176.         display(4,dis_code[c[4]]);
  177.         display(5,dis_code[c[5]]);
  178. }

  179. float lookup(float a)
  180. {
  181.         int  t,r,i = 0;
  182.         r = (int)(a);
  183.         while(1)
  184.         {
  185.                 if((temp_table[i] <= r) && i < 61)
  186.                         break;
  187.                
  188.                 if(i > 60)
  189.                         break;
  190.                 i++;
  191.         }
  192.         t = i*100.0+((temp_table[i]-(float)r)*100.0)/(temp_table[i] - temp_table[i+1]);
  193.         return t/10-100.0;
  194. }

  195. void main(void)
  196. {        
  197.         int tem;
  198.         float t_v;
  199.         float t_r;
  200.         float t;
  201.         TMOD = 0x21;//TMOD = 0x01;
  202.         
  203.         TH1 = 0xfd;
  204.         TH1 = 0xfd;
  205.         SCON = 0x40;
  206.         PCON = 0x00;
  207.         TR1 = 1;
  208.         
  209.         ET0 = 1;
  210.         EA = 1;
  211.         TH0 = (65536-50000)/256;
  212.         TL0 = (65536-50000)%256;
  213.         TR0 = 1;

  214.         time = 0;
  215.         while(1)
  216.         {
  217.                
  218.                 if(time = 20)
  219.                 {
  220.                         time = 0;
  221.                         tem = convert();
  222.                         t_v = (float)tem*500/256;
  223.                         t_r = (t_v/(500.0-t_v))*1000;                        //t_r = (t_v*100)/((500-t_v)/10);  
  224.                         t=1/((1/T0)+(log(t_r/R0)/B));
  225.                         tem = lookup(t_r);
  226.                         
  227.                         
  228.                         ntc_display(tem);
  229.                 }
  230.         }
  231. }
  232. void time_T0(void) interrupt 1
  233. {
  234.         TH0 = (65536-50000)/256;
  235.         TL0 = (65536-50000)%256;
  236.         time++;
  237. }
复制代码

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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