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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 8354|回復: 0
收起左側

STC12 1T單片機DS18B20溫度檢測仿真+代碼+原理圖

[復制鏈接]
ID:430888 發表于 2018-11-21 22:42 | 顯示全部樓層 |閱讀模式
新人報道。了解學習下
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png 0.png

單片機源程序如下:
  1. /*******************************************************************************************/
  2. //   單片機原理與應用課程設計
  3. //   題目:溫度檢測系統設計
  4. //   要點:1、用溫度傳感器18B20測環境溫度,用LCD1602顯示測量結果
  5. //         2、用PROTEUS仿真
  6. //         3、焊接電路板并調試運行
  7. //   出品:濰坊學院信息與控制工程學院
  8. //   編程:戴曰章
  9. //   日期:2014年12月
  10. //   注意:該程序僅供參考。改程序用于STC12C5A60S2單片機。它是1T的指令周期,與傳統的12T的MCU不同
  11. /*******************************************************************************************/

  12. #include<reg52.h>
  13. #include<intrins.h>
  14. #define uchar unsigned char
  15. #define uint unsigned int

  16. #define     LCDIO      P1  //1602數據口
  17. sbit DQ=P3^2;//ds18b20與單片機連接口

  18. sbit rs=P2^0;  //1602數據命令選擇引腳
  19. sbit rd=P2^1;        //讀寫選擇
  20. sbit lcden=P2^2;        //1602選通引腳




  21. void DelayXus(uchar n);
  22. void DS18B20_Reset();
  23. void DS18B20_WriteByte(uchar dat);
  24. uchar DS18B20_ReadByte();


  25. float f_temp; //浮點型溫度值   
  26. uint tvalue;//溫度值
  27. uchar tflag;

  28. uchar code table[]=        {"The temperature "};    //每行顯示16個字符
  29. uchar code table1[]=        {"is:  000.0C wfu"};

  30. uchar data disdata[5];


  31. void delay(uint z)        //短延時
  32. {
  33.         uint x,y;
  34.         for(x=z;x>0;x--)
  35.                 for(y=110;y>0;y--);
  36. }

  37. void write_com(uchar com)        //1602寫命令子程序
  38. {
  39.         rs=0;                //RS是數據命令選擇短,高電平寫數據,低電平寫命令
  40.         rd=0;                //RD是讀寫選擇短,高電平讀,低電平寫
  41.         lcden=0;        //1602選通端,高電平選通,低電平禁止
  42.         LCDIO =com;
  43.         delay(5);
  44.         lcden=1;
  45.         delay(5);
  46.         lcden=0;        
  47. }

  48. void write_date(uchar date)        //1602寫數據子程序
  49. {
  50.         rs=1;        //RS是數據命令選擇短,高電平寫數據,低電平寫命令
  51.         rd=0;        //RD是讀寫選擇短,高電平讀,低電平寫
  52.         lcden=0;        //1602選通端,高電平選通,低電平禁止
  53.         LCDIO =date;
  54.         delay(5);
  55.         lcden=1;
  56.         delay(5);
  57.         lcden=0;        
  58. }



  59. void init()                                //1602初始化程序
  60. {
  61.         uchar num;
  62.         lcden=0;

  63.         write_com(0x38);        //0011 1000B,功能模式設置,設置為8為數據口,兩行顯示,5*7點陣
  64.         write_com(0x0c);        //0000 1011B,顯示開及光標設置,關顯示,顯示光標,光標閃爍
  65.         write_com(0x06);        //0000 0110B,顯示光標移動設置,讀或寫一個字符,地址指針減一且光標減一,寫一個字符屏幕顯示不移動
  66.         write_com(0x01);        //0000 0001B,顯示清屏,數據指針和所有顯示清屏
  67.         write_com(0x80);        //1000 000B,關閉顯示
  68.         delay(5);
  69.         write_com(0x80);        //1000 000B,設置為2行顯示,寫入第一行字符的地址,第一行地址是00-2F
  70.         for(num=0;num<16;num++)
  71.                 {
  72.                         write_date(table[num]);        //寫入第一行數據
  73.                         delay(5);
  74.                 }
  75.         write_com(0x80+0x40);        //1100 0000B,設置為2行顯示,寫入第二行字符的地址,第而行地址是40-67
  76.         for(num=0;num<16;num++)        //寫入第二行數據
  77.                 {
  78.                         write_date(table1[num]);//寫入第二行數據
  79.                         delay(5);
  80.                 }      
  81.         

  82. }










  83. /**************************************
  84. 延時X微秒(STC12C5A60S2@12M)
  85. 不同的工作環境,需要調整此函數
  86. 此延時函數是使用1T的指令周期進行計算,與傳統的12T的MCU不同
  87. **************************************/
  88. void DelayXus(uchar n)
  89. {
  90.     while (n--)
  91.     {
  92.         _nop_();
  93.         _nop_();
  94.     }
  95. }

  96. /**************************************
  97. 復位DS18B20,并檢測設備是否存在
  98. **************************************/
  99. void DS18B20_Reset()
  100. {
  101.     CY = 1;
  102.     while (CY)
  103.     {
  104.         DQ = 0;                     //送出低電平復位信號
  105.         DelayXus(240);              //延時至少480us
  106.         DelayXus(240);
  107.         DQ = 1;                     //釋放數據線
  108.         DelayXus(60);               //等待60us
  109.         CY = DQ;                    //檢測存在脈沖
  110.         DelayXus(240);              //等待設備釋放數據線
  111.         DelayXus(180);
  112.     }
  113. }

  114. /**************************************
  115. 從DS18B20讀1字節數據
  116. **************************************/
  117. uchar DS18B20_ReadByte()
  118. {
  119.     uchar i;
  120.     uchar dat = 0;

  121.     for (i=0; i<8; i++)             //8位計數器
  122.     {
  123.         dat >>= 1;
  124.         DQ = 0;                     //開始時間片
  125.         DelayXus(1);                //延時等待
  126.         DQ = 1;                     //準備接收
  127.         DelayXus(1);                //接收延時
  128.         if (DQ) dat |= 0x80;        //讀取數據
  129.         DelayXus(60);               //等待時間片結束
  130.     }

  131.     return dat;
  132. }

  133. /**************************************
  134. 向DS18B20寫1字節數據
  135. **************************************/
  136. void DS18B20_WriteByte(uchar dat)
  137. {
  138.     char i;

  139.     for (i=0; i<8; i++)             //8位計數器
  140.     {
  141.         DQ = 0;                     //開始時間片
  142.         DelayXus(1);                //延時等待
  143.         dat >>= 1;                  //送出數據
  144.         DQ = CY;
  145.         DelayXus(60);               //等待時間片結束
  146.         DQ = 1;                     //恢復數據線
  147.         DelayXus(1);                //恢復延時
  148.     }
  149. }







  150. unsigned int ReadTemp(void)
  151. {
  152. unsigned char a=0;
  153. unsigned char b=0;


  154.     DS18B20_Reset();                //設備復位
  155.     DS18B20_WriteByte(0xCC);        //跳過ROM命令
  156.     DS18B20_WriteByte(0x44);        //開始轉換命令
  157.     while (!DQ);                    //等待轉換完成

  158.     DS18B20_Reset();                //設備復位
  159.     DS18B20_WriteByte(0xCC);        //跳過ROM命令
  160.     DS18B20_WriteByte(0xBE);        //讀暫存存儲器命令
  161.     a= DS18B20_ReadByte();       //讀溫度低字節
  162.     b= DS18B20_ReadByte();       //讀溫度高字節


  163.   tvalue=b;
  164.   tvalue<<=8;
  165.   tvalue=tvalue|a;
  166.     if(tvalue<0x0fff)
  167.    tflag=0;
  168.     else
  169.    {tvalue=~tvalue+1;
  170.          tflag=1;
  171.    }
  172. //tvalue=tvalue*(0.425);//溫度值擴大10倍,精確到1位小數
  173. f_temp=tvalue*(0.0625);    // 溫度在寄存器中為12位,分辨率為0.0625
  174. tvalue=f_temp*10+0.5;    //乘以10表示小數點后面只取1位,加0.5時四舍五入
  175. //f_temp=f_temp+0.05;
  176. //f_temp=tvalue*(0.0625);
  177. //tvalue=f_temp*100+(tvalue>0?0.5:-0.5);


  178.         return(tvalue);
  179.   }


  180. void ds1820disp()//溫度值顯示
  181.         { uchar flagdat;
  182.           disdata[0]=tvalue/1000+0x30;//百位數
  183.      disdata[1]=tvalue%1000/100+0x30;//十位數
  184.      disdata[2]=tvalue%100/10+0x30;//個位數
  185.      disdata[3]=tvalue%10+0x30;//小數位
  186.    
  187.      if(tflag==0)
  188.             flagdat=0x20;//正溫度不顯示符號
  189.      else
  190.        flagdat=0x2d;//負溫度顯示負號:-

  191.      if(disdata[0]==0x30)
  192.            {disdata[0]=0x20;//如果百位為0,不顯示
  193.                  if(disdata[1]==0x30)
  194.                   {disdata[1]=0x20;//如果百位為0,十位為0也不顯示
  195.                   }
  196.                 }


  197.            write_com(0x80+0x44);            //1100 0000B,設置為2行顯示,寫入第二行字符的地址,第而行地址是40-67
  198.            write_date(flagdat);//顯示符號位
  199.            write_com(0x80+0x45);
  200.            write_date(disdata[0]);//顯示百位
  201.            write_com(0x80+0x46);
  202.            write_date(disdata[1]);//顯示十位         
  203.            write_com(0x80+0x47);
  204.            write_date(disdata[2]);//顯示個位         
  205.            write_com(0x80+0x48);
  206.            write_date(0x2e);//顯示小數點         
  207.            write_com(0x80+0x49);
  208.            write_date(disdata[3]);//顯示小數位
  209.            write_com(0x80+0x4a);
  210.            write_date('C');
  211.    }



  212. void main()
  213. {        
  214.         init();

  215.         ReadTemp();//讀取溫度
  216.         ds1820disp();//顯示
  217.         while(1)
  218.         {

  219.          ReadTemp();//讀取溫度
  220.          ds1820disp();//顯示

  221.         }

  222. }
復制代碼

所有資料51hei提供下載:
http://www.zg4o1577.cn/bbs/dpj-142615-1.html


回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 精品久久中文 | 久久久www成人免费精品 | 国产在线网站 | 日韩精品久久久久久 | 插插插干干干 | 粉嫩粉嫩芽的虎白女18在线视频 | 亚洲成人免费视频在线观看 | 欧美日本韩国一区二区三区 | 亚洲精品一区二区 | 欧美一区二区久久 | 亚洲a网| 欧美亚洲国产成人 | 91久久国产综合久久 | 日韩图区| 国产亚洲精品精品国产亚洲综合 | 中文字幕一区二区三区乱码图片 | 最新av在线网址 | 国产色婷婷久久99精品91 | 欧美极品一区二区 | 国产成人久久精品一区二区三区 | 亚洲欧美在线一区 | 亚洲一区二区三区四区五区午夜 | 国产激情在线 | 日本一区高清 | 亚洲一区二区三区视频 | 伊人国产精品 | 亚洲精品乱码久久久久久蜜桃 | 亚洲精品日韩精品 | 麻豆久久精品 | 日韩国产中文字幕 | 日韩在线看片 | 久久久久免费精品国产 | a级毛片免费高清视频 | 日韩激情一区 | 中文在线一区二区 | 中文字幕国产精品视频 | 国产视频一区二区 | 亚洲视频自拍 | 黄网免费看 | 精品久久久久久久人人人人传媒 | 久久精品国产亚洲 |