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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1520|回復: 0
打印 上一主題 下一主題
收起左側

基于STC8H8K64U單片機和DS18B20實現溫度的串口通信讀取

[復制鏈接]
跳轉到指定樓層
樓主
功能實現和項目描述
單片機讀取溫度傳感器數據,并通過串口發送至電腦
電路及實現效果


單片機代碼如下:

  1. /*--------- DS18B20 -----------
  2. Function: Display temperature by UART
  3. Board: STC8H8K64U
  4. Main Fosc: 22.1184 MHz
  5. Baud rate: 9600 bps
  6. Connect: DQ --> P20
  7. Author: Jin-Lei Li
  8. Email: lijinlei0907@163.com
  9. Date: June.27, 2024
  10. Ref: UART section in STC32 series datasheet
  11. ------------------------------*/

  12. #include "STC8H.h"
  13. #include "intrins.h"

  14. typedef unsigned char u8;
  15. typedef unsigned int u16;
  16. typedef unsigned long int u32;

  17. #define MAIN_Fosc     22118400UL
  18. #define Baudrate      9600
  19. #define BRT           (65536 - (MAIN_Fosc/Baudrate + 2)/4)

  20. sbit DQ = P2^0;

  21. /*-- UART --*/
  22. bit busy;
  23. u8 wptr;
  24. u8 rptr;
  25. u8 buffer[16];
  26. /*---------*/
  27. bit MinusFlag;                //溫度正負  0:正數  1:負數
  28. //u16 Temper; // temperature
  29. void GPIO_Init();
  30. void UartInit();
  31. void UartSend(u8 dat);
  32. void UartSendStr(u8 *p);
  33. void Display();
  34. void Delay_ms(u16 ms);
  35. /*----------- Main Program ----------------*/
  36. void main(void)
  37. {
  38.         P_SW2 |= 0x80; //擴展寄存器(XFR)訪問使能
  39.         
  40.         GPIO_Init();
  41.   UartInit();
  42.         ES = 1;
  43.   EA = 1;
  44.   while(1)
  45.   {
  46.                 Display();
  47.     Delay_ms(500);
  48.   }
  49. }
  50. /*-------------- GPIO initialize ------------------*/
  51. void GPIO_Init()
  52. {
  53.         P0M1 = 0x00;   P0M0 = 0x00;
  54.   P1M1 = 0x00;   P1M0 = 0x00;
  55.   P2M1 = 0x00;   P2M0 = 0x00;
  56.   P3M1 = 0x00;   P3M0 = 0x00;
  57.   P4M1 = 0x00;   P4M0 = 0x00;
  58.   P5M1 = 0x00;   P5M0 = 0x00;
  59.         P6M1 = 0x00;   P6M0 = 0x00;
  60.   P7M1 = 0x00;   P7M0 = 0x00;
  61. }
  62. /*----------- Delay time ----------------*/
  63. void Delay1us(void)        //@22.1184MHz
  64. {
  65.         u8 data i;

  66.         _nop_();
  67.         i = 5;
  68.         while (--i);
  69. }

  70. void Delay60us(void)        //@22.1184MHz
  71. {
  72.         u8 data i, j;

  73.         _nop_();
  74.         _nop_();
  75.         i = 2;
  76.         j = 182;
  77.         do
  78.         {
  79.                 while (--j);
  80.         } while (--i);
  81. }

  82. void Delay480us(void)        //@22.1184MHz
  83. {
  84.         u8 data i, j;

  85.         _nop_();
  86.         i = 14;
  87.         j = 199;
  88.         do
  89.         {
  90.                 while (--j);
  91.         } while (--i);
  92. }

  93. void Delay_ms(u16 ms)
  94. {
  95.         u16 i;
  96.   do{
  97.       i = MAIN_Fosc / 10000;
  98.       while(--i);
  99.     }while(--ms);
  100. }
  101. /*-------------- UART Send byte ------------------*/
  102. void UartSend(u8 dat)
  103. {
  104.     while (busy);
  105.     busy = 1;
  106.     SBUF = dat;
  107. }
  108. /*-------------- UART Send string ------------------*/
  109. void UartSendStr(u8 *p)
  110. {
  111.     while (*p)
  112.     {
  113.         UartSend(*p++);
  114.     }
  115. }
  116. /*-------------- UART isr ------------------*/
  117. void UartIsr() interrupt 4
  118. {
  119.     if (TI)
  120.     {
  121.         TI = 0;
  122.         busy = 0;
  123.     }
  124.     if (RI)
  125.     {
  126.         RI = 0;
  127.         buffer[wptr++] = SBUF;
  128.         wptr &= 0x0f;
  129.     }
  130. }
  131. /*---------------- UART initial -----------------*/
  132. void UartInit()
  133. {
  134.     SCON = 0x50;
  135.         TMOD = 0x00;
  136.         TL1 = BRT;
  137.         TH1 = BRT>>8;
  138.         TR1 = 1;
  139.     AUXR = 0x40;
  140.     wptr = 0x00;
  141.     rptr = 0x00;
  142.     busy = 0;
  143. }
  144. /*----------- Initialize DS18B20 ----------------*/
  145. void Init_DS18B20(void)//初始化ds1820
  146. {
  147.   bit flag = 1;
  148.   while( flag )
  149.         {
  150.                 DQ = 0;                                //輸出低電平
  151.                 Delay480us();
  152.                 DQ = 1;                                //輸出高電平
  153.                 Delay60us();
  154.                 flag = DQ;                        //讀取當前電平
  155.                 Delay480us();        
  156.         }
  157. }
  158. void DS18b20_Write_0(void)                //寫邏輯0碼
  159. {
  160.         DQ = 0;                                //輸出低電平
  161.         Delay60us();
  162.         DQ = 1;                                //輸出高電平
  163.         Delay1us();               
  164.         Delay1us();        
  165. }

  166. void DS18b20_Write_1(void)                //寫邏輯1碼
  167. {
  168.         DQ = 0;                                //輸出低電平
  169.         Delay1us();        
  170.         Delay1us();        
  171.         DQ = 1;                                //輸出高電平
  172.         Delay60us();        
  173. }
  174. /*----------- Read level ----------------*/
  175. bit DS18b20_Read(void)                //讀取電平
  176. {
  177.         bit state ;
  178.         
  179.         DQ = 0;                                //輸出低電平
  180.         Delay1us();        
  181.         Delay1us();        
  182.         DQ = 1;                                //輸出低電平
  183.         Delay1us();        
  184.         Delay1us();        
  185.         state = DQ;                        //讀取當前電平

  186.         Delay60us();

  187.         return         state;
  188. }
  189. /*----------- Write byte ----------------*/
  190. void WriteOneChar(u8 dat)//寫一個字節
  191. {
  192.   u8 i;
  193.         for( i=0;i<8;i++ )                //循環八次
  194.         {
  195.                 if( dat & 0x01 )
  196.                         DS18b20_Write_1();
  197.                 else
  198.                         DS18b20_Write_0();
  199.                 dat >>=1;
  200.         }
  201. }
  202. /*----------- Read byte ----------------*/
  203. u8 ReadOneChar(void)//讀一個字節
  204. {
  205.     u8 i = 0;
  206.     u8 dat = 0;
  207.     for (i=8;i>0;i--)
  208.     {
  209.       DQ = 0; // 給脈沖信號
  210.       dat >>= 1;
  211.       DQ = 1; // 給脈沖信號
  212.       if( DS18b20_Read() )        //如果讀取到的是1,
  213.                         dat |= 0x80;
  214.     }
  215.     return dat;
  216. }

  217. /*----------- Start ----------------*/
  218. void Start_Convert()
  219. {
  220.         Init_DS18B20();
  221.         WriteOneChar(0xcc);
  222.         WriteOneChar(0x44);
  223. }
  224. /*----------- Read Temperature ----------------*/
  225. u16 Readtemp(void)
  226. {
  227.   u8 Low = 0;
  228.   u8 High = 0;
  229.   u16 Temper = 0; // temperature
  230.   float Tt = 0;
  231.         
  232.         Start_Convert();
  233.         while(!DQ);                                //4.等待DQ變成高電平
  234.         
  235.         Init_DS18B20();
  236.         WriteOneChar(0xCC); //跳過讀序號列號的操作
  237.         WriteOneChar(0xBE); //讀取溫度寄存器
  238.         
  239.         Low = ReadOneChar();   //連續讀兩個字節數據   //讀低8位
  240.         High = ReadOneChar();                          //讀高8位
  241.         
  242.         if( High & 0XF8 )                                                        //有1出現就是負數
  243.         {
  244.                 MinusFlag = 1;                                                        //標志位負數
  245.                 Temper = (High<<8) | Low;                //將溫度換算成16位
  246.                 Temper = (~Temper) +1;                         //按位取反+1
  247.                 Tt = Temper*0.0625;                //得到真實十進制溫度值,因為DS18B20可以精確到0.0625度,所以讀回數據的最低位代表的是0.0625度
  248.                 Temper = Tt*10 + 0.5; //放大十倍,以便保留一位小數,并四舍五入
  249.         }
  250.         else
  251.         {
  252.                 MinusFlag = 0;                                                        //標志位正數
  253.                 Temper = (High<<8) | Low;                //將溫度換算成16位
  254.                 Tt = Temper*0.0625;                //最終溫度保留一位小數
  255.                 Temper = Tt*10 + 0.5;
  256.         }
  257.         return Temper;
  258. }
  259. /*----------- Display temperature ----------------*/
  260. void Display()
  261. {
  262.     u16 val;
  263.     u16 shi,ge,xiaoshu;
  264.     val = Readtemp();
  265.     shi = val/100+48;
  266.     ge = val/10%10+48;
  267.     xiaoshu = val%10+48;
  268.         if( MinusFlag==1 ) // negtive
  269.         {
  270.                 UartSendStr("Temperature: ");
  271.                 UartSend('-');
  272.     UartSend(shi);
  273.     UartSend(ge);
  274.     UartSend('.');
  275.     UartSend(xiaoshu);
  276.                 UartSendStr("\r\n");
  277.         }
  278.         else // MinusFlag==0, positive
  279.         {
  280.                 UartSendStr("Temperature: ");
  281.     UartSend(shi);
  282.     UartSend(ge);
  283.     UartSend('.');
  284.     UartSend(xiaoshu);
  285.                 UartSendStr("\r\n");
  286.         }
  287. }
復制代碼
轉載請注明出處和來源,如有問題請聯系本人 lijinlei0907@163.com

評分

參與人數 2黑幣 +55 收起 理由
STC莊偉 + 5 很給力!
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂2 踩
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 羞羞视频在线观看 | 欧美综合自拍 | 97国产精品 | 91国产视频在线观看 | 国产精品一区在线观看你懂的 | jizz中国日本| 免费国产视频在线观看 | 欧美伊人| 欧美一级特黄aaa大片在线观看 | 色综合一区二区三区 | 亚洲综合国产 | 亚洲区视频| 欧美日韩亚洲在线 | 中文字幕二区三区 | 天天操狠狠操 | 色悠悠久 | 福利社午夜影院 | 中文字幕福利视频 | 成人欧美一区二区三区在线播放 | 中文亚洲视频 | 精品久久香蕉国产线看观看亚洲 | 99精品在线免费观看 | 日韩视频在线观看中文字幕 | 久久久久久久夜 | 99久久国产综合精品麻豆 | xx视频在线观看 | 免费在线观看黄网站 | 免费一区 | 国产精品一区久久久 | 成人免费观看视频 | a级性视频 | 在线免费观看成年人视频 | 麻豆视频在线免费观看 | 欧美日韩一区二区在线 | 日韩欧美二区 | 亚洲一区二区三区 | 国产一区二区三区色淫影院 | 亚洲视频在线一区 | 国产免费一区二区 | 伊人久久综合影院 | 蜜臀久久99精品久久久久野外 |