久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4262|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 免费在线观看黄网站 | 亚洲成人一级片 | 午夜精品久久久久久久星辰影院 | 红色av社区 | 日韩欧美亚洲 | 在线国产一区二区 | 国产成人免费网站 | 超碰成人在线观看 | 欧美黄色性生活视频 | 日本网站免费在线观看 | 国内自拍真实伦在线观看 | 日本一级淫片免费啪啪3 | 91精品国产91久久久久游泳池 | 欧美一区二区在线播放 | 欧美一区二区三区在线免费观看 | 7777精品伊人久久精品影视 | 超碰97免费观看 | 亚洲精品久久久久久久久久久 | 欧美成人精品 | 怡红院成人在线视频 | 一区中文 | 一区二区三区四区五区在线视频 | 国产羞羞视频在线观看 | 91免费版在线观看 | 久久国产精品免费一区二区三区 | 亚洲91精品| 在线观看免费观看在线91 | 日韩在线免费观看视频 | 欧美一区二区三区在线观看 | 色婷婷综合久久久中文字幕 | 精品亚洲一区二区三区 | 九九热在线视频观看这里只有精品 | 美女一区 | 久久影音先锋 | 无码一区二区三区视频 | 91精品国产综合久久久亚洲 | 草久久 | 亚洲第一在线 | 国产精品久久午夜夜伦鲁鲁 | 亚洲一区中文字幕在线观看 | 91私密视频 |