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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

DS18b20與單片機連接串口通訊電路及程序

[復制鏈接]
ID:1022048 發表于 2023-3-26 11:23 | 顯示全部樓層 |閱讀模式
壓縮包內包含:單片機 Keil uVision5  C程序
                      proteus電路
如需要CVI程序見本人貼http://www.zg4o1577.cn/bbs/dpj-227709-1.html

仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.png

單片機源程序如下:
  1. #include <reg51.h>
  2. #include <intrins.h>
  3. #include <stdio.h>


  4. sbit DIO = P1^6;


  5. void delay_5us(unsigned char y)                         //(2.17*y+5)us延時,11.0592M晶振
  6. {
  7.     while(--y);
  8. }

  9. void OneWireWByte(unsigned char x)    //向1wire總線寫一個字節,X是要寫的字節
  10. {
  11.     unsigned char i;
  12.     for(i=0;i<8;i++)
  13.     {
  14.         DIO=0;                  //拉低總線
  15.         _nop_();                      //要求>1us,但又不能超過15us
  16.         _nop_();
  17.         if(0x01&x)
  18.         {
  19.           DIO=1;                //如果最低位是1,則將總線拉高
  20.         }
  21.         delay_5us(30);                //延時60-120us
  22.         DIO=1;                  //釋放總線
  23.         _nop_();                      //要求>1us      
  24.         x=x>>1;                       //移位,準備發送下一位
  25.     }   
  26. }
  27. void delay(unsigned int v)                                    
  28. //1ms單位延時(實際是0.998ms)。50是49ms;500是490ms,還算準. 晶振11.0592M
  29. {
  30.     unsigned char i;
  31.     while(v--)
  32.     {
  33.         for(i=0;i<111;i++);
  34.     }
  35. }
  36. unsigned char OneWireRByte(void)          //從1-wire總線讀一個字節.返回讀到的內容
  37. {
  38.     unsigned char i,j;
  39.     j=0;                              
  40.     for(i=0;i<8;i++)                  
  41.     {
  42.         j=j>>1;
  43.         DIO=0;                  //拉低總線
  44.         _nop_();                      //要求>1us,但又不能超過15us
  45.         _nop_();
  46.         DIO=1;                   //釋放總線
  47.         _nop_();
  48.         _nop_();
  49.         if(DIO==1)               //如果是高電平
  50.         {
  51.              j|=0x80;
  52.         }
  53.         delay_5us(30);                  //要求總時間在60-120us
  54.         DIO=1;                  //釋放總線
  55.         _nop_();                      //要求>1us
  56.     }
  57.     return j;   
  58. }
  59. void DS18b20_int(void)                //每次上電都給18b20初始化,設置18b20的參數.
  60. {
  61.     DIO=0;
  62.     delay_5us(255);                   //要求480-960us
  63.     DIO=1;                      //釋放總線
  64.     delay_5us(30);                    //要求60-120us
  65.     if(DIO==0)
  66.     {
  67.         delay_5us(200);              //要求釋放總線后480us內結束復位
  68.         DIO=1;                 //釋放總線
  69.         OneWireWByte(0xcc);         //發送Skip ROM命令
  70.         OneWireWByte(0x4e);         //發送"寫"暫存RAM命令
  71.         OneWireWByte(0x00);         //溫度報警上限設為0
  72.         OneWireWByte(0x00);         //溫度報警下限設為0
  73.         OneWireWByte(0x7f);         //將18b20設為12位,精度就是0.25度
  74.         DIO=0;
  75.         delay_5us(255);                  //要求480-960us
  76.         DIO=1;                  //釋放總線
  77.         delay_5us(240);                  //要求釋放總線后480us內結束復位
  78.         DIO=1;                  //釋放總線
  79.     }
  80. }
  81. unsigned int DS18b20_readTemp(void)     //讀18b20溫度值
  82. {
  83.     unsigned int temp;
  84.     unsigned char DS18b20_temp[2];    //溫度數據
  85.     DIO=0;
  86.     delay_5us(255);                      //要求480-960us
  87.     DIO=1;                      //釋放總線
  88.     delay_5us(30);                      //要求60-120us
  89.     if(DIO==0)
  90.     {
  91.         delay_5us(200);                  //要求釋放總線后480us內結束復位
  92.         DIO=1;                  //釋放總線
  93.         OneWireWByte(0xcc);         //發送Skip ROM命令
  94.         OneWireWByte(0x44);         //發送溫度轉換命令   
  95.         DIO=1;                  //釋放總線
  96.                     delay(1000);                                        //1000ms
  97.         DIO=0;
  98.         delay_5us(255);                  //要求480-960us
  99.         DIO=1;                  //釋放總線
  100.         delay_5us(30);                  //要求60-120us
  101.         if(DIO==0)
  102.         {
  103.             delay_5us(200);              //要求釋放總線后480us內結束復位
  104.             DIO=1;              //釋放總線
  105.             OneWireWByte(0xcc);     //發送Skip ROM命令
  106.             OneWireWByte(0xbe);     //發送"讀"暫存RAM命令
  107.             DS18b20_temp[0]=OneWireRByte();    //讀溫度低字節
  108.             DS18b20_temp[1]=OneWireRByte();    //讀溫度高字節
  109.             temp = 256 * DS18b20_temp[1] + DS18b20_temp[0];   
  110.             DIO=0;
  111.             delay_5us(255);              //要求480-960us
  112.             DIO=1;              //釋放總線
  113.             delay_5us(240);              //要求釋放總線后480us內結束復位
  114.             DIO=1;              //釋放總線
  115.         }
  116.     }   
  117.         return temp;
  118. }

  119. void DelayMS(unsigned int ms)
  120. {
  121.         unsigned char i;
  122.         while(ms--)
  123.         {
  124.                  for(i=0;i<120;i++);
  125.         }
  126. }
  127. void InitUART(void)
  128. {
  129.     TMOD = 0x20;     //9600bps
  130.     SCON = 0x50;
  131.     TH1 = 0xFD;
  132.     TL1 = TH1;
  133.     PCON = 0x00;
  134.     EA = 1;
  135.     ES = 1;
  136.     TI = 1;
  137.     TR1 = 1;
  138. }

  139. int main(void)
  140. {
  141.   int temp;
  142.   InitUART();
  143.   DS18b20_int();                    //初始化18B20
  144.         while(1)
  145.         {

  146.            temp = DS18b20_readTemp();             //讀溫度數據

  147. //    putchar(temp/0xff);                   //然后將溫度數據通過串口發送
  148. //    putchar(temp%0xff);
  149.                 if(temp>=0){
  150.                         printf("+%4.2f",temp*0.5/8);}
  151.                         else{
  152.                                 printf("%4.2f",temp*0.5/8);}
  153.        
  154.     DelayMS(100);


  155.         }
  156. }
復制代碼

Keil代碼與Proteus仿真下載:
單片機程序.7z (56.65 KB, 下載次數: 27)
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 在线视频91 | a视频在线 | 日韩精品一区二区三区 | 日韩精品视频中文字幕 | 一区影院 | 韩国理论电影在线 | 国产亚洲精品精品国产亚洲综合 | 日韩视频在线免费观看 | 亚洲福利一区 | 欧美一区精品 | 亚洲精品久久久久久宅男 | 国产午夜精品久久久久免费视高清 | 羞羞视频免费观 | 中文字幕精| 亚洲狠狠爱 | 国产成人福利视频在线观看 | 性视频网| 亚洲一区二区三区四区五区午夜 | 干出白浆视频 | 殴美黄色录像 | 精品国产乱码久久久久久图片 | 91资源在线| 国产一区二区三区视频免费观看 | 91在线精品秘密一区二区 | 亚洲精品久久久久久久久久久久久 | 久久99国产精品 | 国产精品久久久久久中文字 | 国产精品av久久久久久毛片 | 国产电影一区二区在线观看 | 99re热精品视频国产免费 | 亚洲国产成人av好男人在线观看 | 色偷偷噜噜噜亚洲男人 | 欧美极品在线视频 | 欧美成人精品一区二区男人看 | 亚洲小视频在线观看 | 国产精品久久久久久久三级 | 久久成人国产精品 | 精品一区二区三区四区在线 | 亚洲精品黄色 | 午夜影院在线免费观看视频 | 国产福利久久 |