找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3437|回复: 3
收起左侧

可设定限制温度的单片机温度计(1602+DS18b20)仿真+代码+实物制作

[复制链接]
ID:413948 发表于 2018-11-25 09:07 | 显示全部楼层 |阅读模式
可设定限制温度,超过则报警,绿灯灭,在限制温度内绿灯亮

制作出来的实物图如下:
1543053276178.jpg 1543053299685.jpg

电路原理图如下:
原理图.png

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
1.png 启动.png

单片机源程序如下:
  1. /*********************************************************************************
  2. * 【作    者】: 清翔电子:03
  3. * 【版    本】: 1.0
  4. * 【实验平台】: QX-MCS51 单片机开发板
  5. * 【外部晶振】: 11.0592mhz        
  6. * 【主控芯片】: STC89C52
  7. * 【编译环境】: Keil μVisio3        
  8. * 【程序功能】: 1602液晶显示18B20温度                                                         
  9. * 【使用说明】:
  10. *  说明:免费开源,不提供源代码分析.
  11. **********************************************************************************/
  12. #include <reg52.H>
  13. #include <intrins.H>
  14. #include <math.H>

  15. #define uchar unsigned char
  16.   #define uint unsigned int
  17. //sbit dula = P2^6;
  18. //sbit wela = P2^7;
  19. sbit rw = P3^6;
  20. sbit RS = P3^5;  
  21. sbit LCDEN = P3^4;
  22.         
  23. sbit green=P1^0;

  24.         sbit beep=P2^3;
  25.         
  26. sbit K1=P3^0;
  27. sbit K2=P3^1;

  28.         
  29.         uchar str[5];//uchartostr函数转换的字符串
  30.         float H=380;

  31.         
  32.         
  33. void delayUs()
  34. {
  35.     _nop_();
  36. }

  37. void delayMs(uint a)
  38. {
  39.     uint i, j;
  40.     for(i = a; i > 0; i--)
  41.         for(j = 100; j > 0; j--);
  42. }


  43. void writeComm(uchar comm)
  44. {
  45.      RS = 0;   
  46.     P0 = comm;
  47.     LCDEN = 1;
  48.      delayUs();
  49.     LCDEN = 0;
  50.     delayMs(1);
  51. }

  52. //写数据:RS=1, RW=0;
  53. void writeData(uchar dat)
  54. {
  55.      RS = 1;
  56.      P0 = dat;
  57.      LCDEN = 1;
  58.     delayUs();
  59.     LCDEN = 0;
  60.     delayMs(1);
  61. }


  62. void init()
  63. {
  64.      rw = 0;
  65.     // dula = wela = 0;
  66.     writeComm(0x38);
  67.    writeComm(0x0c);
  68.     writeComm(0x06);
  69.     writeComm(0x01);
  70. }

  71. void writeString(uchar * str, uchar length)
  72. {
  73.      uchar i;
  74.     for(i = 0; i < length; i++)
  75.     {
  76.          writeData(str[i]);
  77.      }
  78. }

  79. /**//*****************************DS18B20*******************************/
  80. sbit ds = P2^2;
  81. void dsInit()
  82. {
  83.    
  84.     unsigned int i;  
  85.     ds = 0;
  86.     i = 100;  
  87.      while(i>0) i--;
  88.     ds = 1;   
  89.     i = 4;
  90.      while(i>0) i--;
  91. }

  92. void dsWait()
  93. {
  94.       unsigned int i;
  95.       while(ds);  
  96.       while(~ds);
  97.       i = 4;
  98.       while(i > 0) i--;
  99. }


  100. bit readBit()
  101. {
  102.     unsigned int i;
  103.     bit b;
  104.     ds = 0;
  105.     i++;   
  106.     ds = 1;
  107.    i++; i++;  
  108.     b = ds;
  109.     i = 8;
  110.     while(i>0) i--;
  111.     return b;
  112. }

  113. unsigned char readByte()
  114. {
  115.     unsigned int i;
  116.     unsigned char j, dat;
  117.    dat = 0;
  118.     for(i=0; i<8; i++)
  119.     {
  120.         j = readBit();
  121.       
  122.         dat = (j << 7) | (dat >> 1);
  123.     }
  124.     return dat;
  125. }


  126. void writeByte(unsigned char dat)
  127. {
  128.     unsigned int i;
  129.     unsigned char j;
  130.     bit b;
  131.     for(j = 0; j < 8; j++)
  132.     {
  133.         b = dat & 0x01;
  134.         dat >>= 1;
  135.    
  136.         if(b)   
  137.         {
  138.            ds = 0;          i++; i++;  
  139.             ds = 1;   
  140.             i = 8; while(i>0) i--;  
  141.         }
  142.         else  
  143.         {
  144.             ds = 0;
  145.           i = 8; while(i>0) i--;  
  146.             ds = 1;
  147.            i++; i++;
  148.         }
  149.    }
  150. }


  151. void sendChangeCmd()
  152. {
  153.     dsInit();   
  154.     dsWait();   
  155.     delayMs(1);   
  156.     writeByte(0xcc);
  157.     writeByte(0x44);
  158. }

  159. void sendReadCmd()
  160. {
  161.     dsInit();
  162.     dsWait();
  163.     delayMs(1);
  164.     writeByte(0xcc);
  165.     writeByte(0xbe);
  166. }


  167. int getTmpValue()
  168. {
  169.     unsigned int tmpvalue;
  170.     int value;
  171.     float t;
  172.     unsigned char low, high;
  173.     sendReadCmd();
  174.    
  175.     low = readByte();
  176.     high = readByte();
  177.    
  178.     tmpvalue = high;
  179.     tmpvalue <<= 8;
  180.     tmpvalue |= low;
  181.     value = tmpvalue;
  182.    
  183.   \
  184.     t = value * 0.0625;
  185.     \
  186.     value = t * 100 + (value > 0 ? 0.5 : -0.5); //大于0加0.5, 小于0减0.5
  187.     return value;
  188. }

  189. void display(int v)
  190. {
  191.     unsigned char count;
  192.     unsigned char datas[] = {0, 0, 0, 0, 0};
  193.     unsigned int tmp = abs(v);
  194.     datas[0] = tmp / 10000;
  195.     datas[1] = tmp % 10000 / 1000;
  196.     datas[2] = tmp % 1000 / 100;
  197.     datas[3] = tmp % 100 / 10;
  198.     datas[4] = tmp % 10;
  199.     writeComm(0xc0+3);
  200.     if(v < 0)
  201.     {
  202.         writeString("- ", 2);
  203.    }
  204.     else
  205.     {
  206.        writeString("+ ", 2);
  207.     }
  208.     if(datas[0] != 0)
  209.     {
  210.         writeData('0'+datas[0]);
  211.     }
  212.     for(count = 1; count != 5; count++)
  213.     {
  214.         writeData('0'+datas[count]);
  215.         if(count == 2)
  216.         {
  217.             writeData('.');
  218.         }
  219.     }
  220. }

  221. void lcd_dis(uchar X,uchar Y,uchar *dis)        //显示数据数组
  222. {                          
  223.    uchar  pos;
  224.         switch(X)
  225.         {
  226.                 case 0:X=0x00;
  227.                 break;
  228.                 case 1:X=0x40;
  229.                 break;
  230.                 break;
  231.                 default:break;
  232.         }

  233.    pos =0x80+X+Y;  
  234.    writeComm(pos);     //显示地址
  235.    while(*dis!='\0')
  236.    {
  237.         writeData(*dis++);               
  238.    }
  239. }


  240. uchar *uchartostr(float num)        //将一个字节的数据转换为字符串 或10进制
  241. {
  242.         uchar x2,x1,x0,i;
  243.         x2=(int)num/100;
  244.         x1=(int)num%100/10;
  245.         x0=(int)num%100%10;
  246.         i=0;
  247.         
  248.                 str[i]=x2+48;
  249.                 i++;
  250.         
  251.         
  252.                 str[i]=x1+48;
  253.                 i++;
  254.         

  255.         
  256.         str[i]='.';
  257.         i++;
  258.         
  259.         str[i]=x0+48;        
  260.         i++;
  261.         str[i]='\0';
  262.         return str;
  263. }

  264. uchar *mtostr(uchar num)        //将一个字节的数据转换为字符串 或10进制
  265. {
  266.         int i=0;
  267.         str[i]=num+48;
  268.         i++;
  269.         str[i]='\0';
  270.         return str;
  271. }


  272. uchar key(void)
  273. {
  274.         
  275.         
  276.                 if(K1==0)
  277.                 {
  278.                         delayMs(20);
  279.                                 if(K1==0)
  280.                         {
  281.                                 if(H<1000)
  282.                                         H++;
  283.                         }
  284.                 }
  285.                
  286.                 if(K2==0)
  287.                 {
  288.                         delayMs(20);
  289.                                 if(K2==0)
  290.                         {
  291.                                 if(H>0)
  292.                                 H--;
  293.                         }
  294.                 }
  295.                
  296.         
  297.         
  298.         
  299. }
  300. /**//*****************************DS18B20*******************************/

  301. void main()
  302. {
  303.            green=0;
  304.         
  305.     sendChangeCmd();
  306.     init();
  307.     writeComm(0x80);
  308.                         writeComm( 0x80 + 4);
  309.                 writeString("thermometre",10);
  310.                 delayMs(1500);
  311.         writeComm( 0x01);
  312.         delayMs(15);
  313.                 writeComm( 0x80 + 3);
  314.                 //writeData( "" );

  315. writeString("LIMIT",5);
  316.         
  317.         while(1)
  318.     {
  319.         delayMs(100); //温度转换时间需要750ms以上
  320.         writeComm(0xc0);
  321.                                 lcd_dis( 0,9,uchartostr(H));
  322.                                 display(getTmpValue());
  323.         sendChangeCmd();
  324.                         
  325.                         if(getTmpValue()>H*10)
  326.                         {
  327.                                 green=1;
  328.                                 beep=0;
  329.                         
  330.                         }
  331.                         else
  332.                         {
  333.                                 green=0;
  334.                                 beep=1;
  335.                         }
  336.                
  337.                         key();
  338.     }
  339. }
复制代码

所有资料51hei提供下载:
单片机课程设计.zip (317.92 KB, 下载次数: 143)

评分

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

查看全部评分

回复

使用道具 举报

ID:348399 发表于 2019-1-9 16:37 | 显示全部楼层
很好用这个,良心帖子
回复

使用道具 举报

ID:445069 发表于 2019-1-15 14:57 | 显示全部楼层
打算分析一下代码,学习 ds18b20 温度传感器。
回复

使用道具 举报

ID:477399 发表于 2019-3-10 19:36 | 显示全部楼层
这个好,有心了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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