找回密码
 立即注册

QQ登录

只需一步,快速开始

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

自己做的基于单片机的温度检测系统

  [复制链接]
跳转到指定楼层
楼主
ID:51090 发表于 2014-10-13 14:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1.     该温度检测系统可直接测温,测温范围为-125-+125度,还可以时时对不同时刻的温度进行手动采样,待采样完成后,可以将采样温度一一读出,也可进行定时采样,例如间隔1秒采样温度一次,采样开始有指示灯亮,采样结束指示灯灭,停止采样,一一读出数据。
  2.   源程序
  3.           #include<reg51.h>
  4. #include <intrins.h>
  5. #define uchar unsigned char
  6. #define uint unsigned int
  7. sbit lcdrs=P1^1;
  8. sbit lcdrw=P1^2;
  9. sbit lcden=P1^3;
  10. sbit DQ = P3^7;
  11. sbit JL=P3^0;
  12. sbit DT=P3^1;
  13. sbit DS=P3^2;
  14. sbit LED=P3^3;
  15. uchar code table0[]=" RUI LOVE YING";
  16. uchar unm,temp,temp1,temp2,temp3,kk=0,s,tt=0;
  17. uchar temp00,temp01,temp02,temp03,temp04,temp05,temp06,temp07,temp08,temp09;
  18. uchar xs00,xs01,xs02,xs03,xs04,xs05,xs06,xs07,xs08,xs09;
  19. /*************精确延时函数*****************/
  20. void delay(unsigned char i)
  21. {
  22. while(--i);
  23. }
  24. /******************************************
  25. 此延时函数针对的是12Mhz的晶振
  26. delay(0):延时518us 误差:518-2*256=6
  27. delay(1):延时7us   (原帖写"5us"是错的)
  28. delay(10):延时25us    误差:25-20=5
  29. delay(20):延时45us    误差:45-40=5
  30. delay(100):延时205us 误差:205-200=5
  31. delay(200):延时405us 误差:405-400=5
  32. *******************************************/
  33. /*****************DS18B20******************/
  34. void Init_Ds18b20(void)     //DS18B20初始化send reset and initialization command
  35. {
  36. DQ = 1;                     //DQ复位,不要也可行。
  37. delay(1);                  //稍做延时
  38. DQ = 0;                    //单片机拉低总线
  39. delay(250);                //精确延时,维持至少480us
  40. DQ = 1;                    //释放总线,即拉高了总线
  41. delay(100);                //此处延时有足够,确保能让DS18B20发出存在脉冲。
  42. }
  43. uchar Read_One_Byte()       //读取一个字节的数据read a byte date
  44.                             //读数据时,数据以字节的最低有效位先从总线移出
  45. {
  46. uchar i   = 0;
  47. uchar dat = 0;
  48. for(i=8;i>0;i--)
  49. {
  50.    DQ = 0;                  //将总线拉低,要在1us之后释放总线
  51.                            //单片机要在此下降沿后的15us内读数据才会有效。
  52.    _nop_();                 //至少维持了1us,表示读时序开始
  53.    dat >>= 1;               //让从总线上读到的位数据,依次从高位移动到低位。
  54.    DQ = 1;                  //释放总线,此后DS18B20会控制总线,把数据传输到总线上
  55.    delay(1);                 //延时7us,此处参照推荐的读时序图,尽量把控制器采样时间放到读时序后的15us内的最后部分
  56.    if(DQ)                   //控制器进行采样
  57.    {
  58.     dat |= 0x80;            //若总线为1,即DQ为1,那就把dat的最高位置1;若为0,则不进行处理,保持为0
  59.    }      
  60.    delay(10);               //此延时不能少,确保读时序的长度60us。
  61. }
  62. return (dat);
  63. }
  64. void Write_One_Byte(uchar dat)
  65. {
  66. uchar i = 0;
  67. for(i=8;i>0;i--)
  68. {
  69.    DQ = 0;                        //拉低总线
  70.    _nop_();                       //至少维持了1us,表示写时序(包括写0时序或写1时序)开始
  71.    DQ = dat&0x01;                 //从字节的最低位开始传输
  72.                                  //指令dat的最低位赋予给总线,必须在拉低总线后的15us内,
  73.                                  //因为15us后DS18B20会对总线采样。
  74.    delay(10);                     //必须让写时序持续至少60us
  75.    DQ = 1;                        //写完后,必须释放总线,
  76.    dat >>= 1;
  77.    delay(1);
  78. }
  79. }

  80. uint Get_Tmp()                   //获取温度get the temperature
  81. {
  82. uchar a,b;
  83. Init_Ds18b20();                //初始化
  84. Write_One_Byte(0xcc);          //忽略ROM指令
  85. Write_One_Byte(0x44);          //温度转换指令
  86. Init_Ds18b20();                 //初始化
  87. Write_One_Byte(0xcc);          //忽略ROM指令
  88. Write_One_Byte(0xbe);          //读暂存器指令
  89. a = Read_One_Byte();           //读取到的第一个字节为温度LSB
  90. b = Read_One_Byte();           //读取到的第一个字节为温度MSB
  91. temp1 = b<<4;
  92. temp3=(a&0xf0)>>4;
  93. temp=temp1+temp3;
  94. temp2=(a&0x0f)*0.0625*100;
  95. return temp;
  96. }
  97. void delay1(int z)
  98. {
  99. int x,y;
  100.   for(x=z;x>0;x--)
  101.    for(y=110;y>0;y--) ;
  102. }
  103. void writen_com(uchar com)
  104. {
  105. lcdrs=0;
  106. P2=com;
  107. delay1(5);
  108. lcden=1;
  109. delay1(5);
  110. lcden=0;
  111. }

  112. void writen_date(uchar date)
  113. {
  114. lcdrs=1;
  115. P2=date;
  116. delay1(5);
  117. lcden=1;
  118. delay1(5);
  119. lcden=0;
  120. }
  121. void writen_sfm(uchar add,uchar date)
  122. {
  123.    uchar bai,shi,ge;
  124.    bai=date/100;
  125.    shi=date%100/10;
  126.    ge=date%10;
  127.    writen_com(0x80+0x40+add);
  128.    writen_date(0x30+bai);
  129.    writen_date(0x30+shi);
  130.    writen_date(0x30+ge);
  131. }
  132. void writen_sfm1(uchar add,uchar date)
  133. {
  134.    uchar shi,ge;

  135.    shi=date/10;
  136.    ge=date%10;
  137.    writen_com(0x80+0x40+add);
  138.    writen_date(0x30+shi);
  139.    writen_date(0x30+ge);
  140. }
  141. void main();

  142. void xianshi_temp()
  143. {
  144.   if(DT ==0)
  145.    {
  146.     delay(5);
  147. if(DT==0)
  148.   {
  149.    while(!DT);
  150.    writen_com(0x01);
  151.    writen_com(0x38);
  152.       writen_com(0x0c);
  153.       writen_com(0x06);
  154.    writen_com(0x80);
  155.       writen_date('0');
  156.       writen_com(0x80+0x40+0x05);
  157.       writen_date('.');
  158.    while(DT)
  159.    {
  160.   writen_sfm1(6,xs00);
  161.         writen_sfm(2,temp00);
  162.    }
  163. if(DT ==0)
  164.     {
  165.     delay(5);
  166. if(DT==0)
  167.   {
  168.    while(!DT);
  169.    writen_com(0x01);
  170.    writen_com(0x38);
  171.       writen_com(0x0c);
  172.       writen_com(0x06);
  173.    writen_com(0x80);
  174.       writen_date('1');
  175.       writen_com(0x80+0x40+0x05);
  176.       writen_date('.');
  177.    while(DT)
  178.    {
  179.   writen_sfm1(6,xs01);
  180.         writen_sfm(2,temp01);
  181.    }
  182.   if(DT ==0)
  183.     {
  184.     delay(5);
  185. if(DT==0)
  186.   {
  187.    while(!DT);
  188.    writen_com(0x01);
  189.    writen_com(0x38);
  190.       writen_com(0x0c);
  191.       writen_com(0x06);
  192.    writen_com(0x80);
  193.       writen_date('2');
  194.       writen_com(0x80+0x40+0x05);
  195.       writen_date('.');
  196.    while(DT)
  197.    {
  198.   writen_sfm1(6,xs02);
  199.         writen_sfm(2,temp02);
  200.    }
  201.   if(DT ==0)
  202.     {
  203.     delay(5);
  204. if(DT==0)
  205.   {
  206.    while(!DT);
  207.    writen_com(0x01);
  208.    writen_com(0x38);
  209.       writen_com(0x0c);
  210.       writen_com(0x06);
  211.    writen_com(0x80);
  212.       writen_date('3');
  213.       writen_com(0x80+0x40+0x05);
  214.       writen_date('.');
  215.    while(DT)
  216.    {
  217.   writen_sfm1(6,xs03);
  218.         writen_sfm(2,temp03);
  219.    }
  220.   if(DT ==0)
  221.     {
  222.     delay(5);
  223. if(DT==0)
  224.   {
  225.    while(!DT);
  226.    writen_com(0x01);
  227.    writen_com(0x38);
  228.       writen_com(0x0c);
  229.       writen_com(0x06);
  230.    writen_com(0x80);
  231.       writen_date('4');
  232.       writen_com(0x80+0x40+0x05);
  233.       writen_date('.');
  234.    while(DT)
  235.    {
  236.   writen_sfm1(6,xs04);
  237.         writen_sfm(2,temp04);
  238.    }
  239. if(DT ==0)
  240.     {
  241.     delay(5);
  242. if(DT==0)
  243.   {
  244.    while(!DT);
  245.    writen_com(0x01);
  246.    writen_com(0x38);
  247.       writen_com(0x0c);
  248.       writen_com(0x06);
  249.    writen_com(0x80);
  250.       writen_date('5');
  251.       writen_com(0x80+0x40+0x05);
  252.       writen_date('.');
  253.    while(DT)
  254.    {
  255.   writen_sfm1(6,xs05);
  256.         writen_sfm(2,temp05);
  257.    }
  258.     if(DT ==0)
  259.     {
  260.     delay(5);
  261. if(DT==0)
  262.   {
  263.    while(!DT);
  264.    writen_com(0x01);
  265.    writen_com(0x38);
  266.       writen_com(0x0c);
  267.       writen_com(0x06);
  268.    writen_com(0x80);
  269.       writen_date('6');
  270.       writen_com(0x80+0x40+0x05);
  271.       writen_date('.');
  272.    while(DT)
  273.    {
  274.   writen_sfm1(6,xs06);
  275.         writen_sfm(2,temp06);
  276.    }
  277.     if(DT ==0)
  278.     {
  279.     delay(5);
  280. if(DT==0)
  281.   {
  282.    while(!DT);
  283.    writen_com(0x01);
  284.    writen_com(0x38);
  285.       writen_com(0x0c);
  286.       writen_com(0x06);
  287.    writen_com(0x80);
  288.       writen_date('7');
  289.       writen_com(0x80+0x40+0x05);
  290.       writen_date('.');
  291.    while(DT)
  292.    {
  293.   writen_sfm1(6,xs07);
  294.         writen_sfm(2,temp07);
  295.    }
  296.     if(DT ==0)
  297.     {
  298.     delay(5);
  299. if(DT==0)
  300.   {
  301.    while(!DT);
  302.    writen_com(0x01);
  303.    writen_com(0x38);
  304.       writen_com(0x0c);
  305.       writen_com(0x06);
  306.    writen_com(0x80);
  307.       writen_date('8');
  308.       writen_com(0x80+0x40+0x05);
  309.       writen_date('.');
  310.    while(DT)
  311.    {
  312.   writen_sfm1(6,xs08);
  313.         writen_sfm(2,temp08);
  314.    }
  315.    if(DT ==0)
  316.     {
  317.     delay(5);
  318. if(DT==0)
  319.   {
  320.    while(!DT);
  321.    writen_com(0x01);
  322.    writen_com(0x38);
  323.       writen_com(0x0c);
  324.       writen_com(0x06);
  325.    writen_com(0x80);
  326.       writen_date('9');
  327.       writen_com(0x80+0x40+0x05);
  328.       writen_date('.');
  329.    while(DT)
  330.    {
  331.   writen_sfm1(6,xs09);
  332.         writen_sfm(2,temp09);
  333.    }
  334.    if(DT ==0)
  335.         {
  336.       delay(5);
  337.    if(DT==0)
  338.     {
  339.      while(!DT);
  340.   s=0;
  341.   main();
  342. }}}}}}}}}}}}}}}}}}}}}}
  343. }
  344. void record_temp()
  345. {
  346. if(JL == 0)
  347.   {
  348.    delay(5);
  349.     if(JL == 0)
  350.   {
  351.    while(!JL);
  352.    switch(s)
  353.    {
  354.     case 0:temp00=Get_Tmp(),xs00=temp2;break;
  355.     case 1:temp01=Get_Tmp(),xs01=temp2;break;
  356.     case 2:temp02=Get_Tmp(),xs02=temp2;break;
  357.     case 3:temp03=Get_Tmp(),xs03=temp2;break;
  358.     case 4:temp04=Get_Tmp(),xs04=temp2;break;
  359.     case 5:temp05=Get_Tmp(),xs05=temp2;break;
  360.     case 6:temp06=Get_Tmp(),xs06=temp2;break;
  361.     case 7:temp07=Get_Tmp(),xs07=temp2;break;
  362.     case 8:temp08=Get_Tmp(),xs08=temp2;break;
  363.     case 9:temp09=Get_Tmp(),xs09=temp2;break;
  364.    }
  365.    s++;
  366.    if(s==10)
  367.        s=0;
  368.   }
  369.   }
  370. }
  371. void init()
  372. {
  373. temp00=temp01=temp02=temp03=temp04=temp05=temp06=temp07=temp08=temp09=0;
  374. xs00=xs01=xs02=xs03=xs04=xs05=xs06=xs07=xs08=xs09=0;
  375. s=0;
  376. LED=1;
  377. lcden=0;
  378. lcdrw=0;
  379. writen_com(0x38);
  380. writen_com(0x0c);
  381. writen_com(0x06);
  382. writen_com(0x80);
  383. for(unm=0;unm<14;unm++)
  384. {
  385. writen_date(table0[unm]);
  386. }
  387. writen_com(0x80+0x40+0x05);
  388. writen_date('.');
  389. }
  390. void main()
  391. {TMOD=0X01;          //定时器工作方式设定
  392. TH0=(65536-50000)/256;       //设定定时初值50MS
  393. TL0=(65536-50000)%256;
  394. EA=1;           //开总中断
  395. ET0=1;           //开定时器0中断
  396. TR0=1;
  397. init();
  398. while(1)
  399. {
  400. xianshi_temp();
  401. record_temp();
  402. writen_sfm1(6,temp2);
  403. writen_sfm(2,Get_Tmp());
  404. }
  405. }
  406. void time0() interrupt 1       //定时器0
  407. {
  408.   if(DS==0)
  409.   {
  410.    delay(5);
  411.    if(DS==0)
  412.    {
  413.     LED=0;
  414. if(tt==4)
  415. {
  416.   tt=0;
  417.   switch(s)
  418.    {
  419.     case 0:temp00=Get_Tmp(),xs00=temp2;break;
  420.     case 1:temp01=Get_Tmp(),xs01=temp2;break;
  421.     case 2:temp02=Get_Tmp(),xs02=temp2;break;
  422.     case 3:temp03=Get_Tmp(),xs03=temp2;break;
  423.     case 4:temp04=Get_Tmp(),xs04=temp2;break;
  424.     case 5:temp05=Get_Tmp(),xs05=temp2;break;
  425.     case 6:temp06=Get_Tmp(),xs06=temp2;break;
  426.     case 7:temp07=Get_Tmp(),xs07=temp2;break;
  427.     case 8:temp08=Get_Tmp(),xs08=temp2;break;
  428.     case 9:temp09=Get_Tmp(),xs09=temp2;break;
  429.    }
  430.    s++;
  431.    if(s==10)
  432.        {s=0;
  433.     LED=1;
  434.     while(!DS);
  435.     }}}}
  436. TH0=(65536-50000)/256;
  437. TL0=(65536-50000)%256;
  438. Get_Tmp();
  439. tt++;
  440. }
复制代码


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

使用道具 举报

沙发
ID:75107 发表于 2015-5-3 22:34 | 只看该作者
原理图???
回复

使用道具 举报

板凳
ID:78005 发表于 2015-5-16 16:52 | 只看该作者
无图无真相
回复

使用道具 举报

地板
ID:80179 发表于 2015-5-16 18:26 | 只看该作者
学习学习,谢谢分享。
回复

使用道具 举报

5#
ID:80203 发表于 2015-5-17 00:49 | 只看该作者
原理图呢
回复

使用道具 举报

6#
ID:79943 发表于 2015-5-17 09:40 | 只看该作者
该温度检测系统可直接测温,测温范围为-125-+125度,还可以时时对不同时刻的温度进行手动采样,待采样完成后,可以将采样温度一一读出,也可进行定时采样,例如间隔1秒采样温度一次,采样开始有指示灯亮,采样结束指示灯灭,停止采样,一一读出数据。
回复

使用道具 举报

7#
ID:80035 发表于 2015-5-18 23:57 | 只看该作者
无图无真相
回复

使用道具 举报

8#
ID:118804 发表于 2016-5-6 11:46 | 只看该作者
我试试行不行
回复

使用道具 举报

9#
ID:611151 发表于 2019-10-4 22:17 | 只看该作者
怎么不附上实物图啊??
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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