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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7702|回復: 3
收起左側

DS18B20溫度傳感器PIC測溫并用1602顯示屏顯示溫度C程序

[復制鏈接]
ID:75926 發表于 2015-4-2 23:19 | 顯示全部樓層 |閱讀模式

  1. //熟悉使用單片機運用DS18B20溫度傳感器測試溫度,并用1602顯示屏顯示溫度
  2. //1、第一行顯示:Temperature
  3. //2、第二行顯示:實測溫度值
  4. //**************************************************

  5. //**************************************************
  6. //硬件設置:
  7. //1、SW2,SW4開關全部斷開
  8. //2、插上DS18B20溫度傳感器
  9. //**************************************************

  10. //**************************************************
  11. //*****************定義頭文件**********************
  12. //**************************************************
  13. #include<PIC.h>
  14. #include "delay.h"

  15. //**************************************************
  16. //******************定義配置位*********************
  17. //**************************************************
  18. __CONFIG(0x3545);      
  19. //FLASH代碼不保護,RB6和RB7為調試模式,FLASH不寫保護,數據代碼不保護
  20. //RB3為數字IO口,低電壓復位使能,上電延時開,看門狗開,4M晶體XT振蕩器

  21. //**************************************************
  22. //******************定義常量***********************
  23. //**************************************************
  24. #define uchar unsigned char
  25. #define uint  unsigned int

  26. //**************************************************
  27. //***************定義DS18B20引腳*******************
  28. //**************************************************
  29. #define DQ     RE0
  30. #define DQ_IO  TRISE0

  31. //**************************************************
  32. //******************定義LCD引腳*********************
  33. //**************************************************
  34. #define RS RA1
  35. #define RW RA2
  36. #define E  RA3

  37. //**************************************************
  38. //******************定義變量***********************
  39. //**************************************************
  40. uchar lowtemp,hightemp;  //低8位溫度變量,高8位溫度變量
  41. uchar zhengshu,xiaoshu;  //溫度整數變量,溫度小數變量
  42. uint temperature;        //轉換后的溫度值BCD碼形式
  43. uchar temp[7];           //轉換后溫度存放變量

  44. //**************************************************
  45. //******************定義數據***********************
  46. //**************************************************
  47. //顯示:  Temperature
  48. //顯示:WWW.PICAVR.COM
  49. const uchar name[16]=
  50. //{0x20,0x20,0x20,0x54,0x65,0x6d,0x70,0x65,0x72,0x61,0x74,0x75,0x72,0x65,0x20,0x20};
  51. {0x20,0x57,0x57,0x57,0x2E,0x50,0x49,0x43,0x41,0x56,0x52,0x2E,0x43,0x4F,0x4D,0x20};

  52. //***********************************************
  53. //函 數 名:delayms(uchar time);
  54. //入口參數:time
  55. //出口參數:無
  56. //函數作用:毫秒延時
  57. //說    明:
  58. //***********************************************
  59. void delayms(uchar time)
  60. {
  61.   uint i;
  62.   while(time--)
  63.   {
  64.     for(i=93;i>0;i--){;}
  65.   }
  66. }

  67. //***********************************************
  68. //函 數 名:port_init();
  69. //入口參數:無
  70. //出口參數:無
  71. //函數作用:端口初始化
  72. //說    明:
  73. //***********************************************
  74. void port_init(void)
  75. {
  76.   ADCON1=0X07;   //設置RA,RE口為數字口
  77.   TRISA=0X00;    //設置RA口為輸出口
  78.   TRISD=0X00;    //設置RD口為輸出口
  79.   TRISE=0X00;    //設置RE口為輸出口
  80.   OPTION=0X8F;   //分頻給WDT,分頻比為128
  81. }

  82. //***********************************************
  83. //函 數 名:lcd_enable();
  84. //入口參數:無
  85. //出口參數:無
  86. //函數作用:LCD寫使能
  87. //說    明:
  88. //***********************************************
  89. void lcd_enable(void)
  90. {
  91.   RS=0;         //寫命令
  92.   RW=0;         //寫操作
  93.   E=0;          //低電平信號
  94.   delayms(10);  //低電平信號保持
  95.   E=1;          //拉高電平信號
  96. }

  97. //***********************************************
  98. //函 數 名:lcd_writebyte(uchar data);
  99. //入口參數:data
  100. //出口參數:無
  101. //函數作用:LCD寫一個字節數據
  102. //說    明:
  103. //***********************************************
  104. void lcd_writebyte(uchar data)
  105. {
  106.   PORTD=data;   //向RD口寫數據
  107.   RS=1;         //寫數據
  108.   RW=0;         //寫操作
  109.   E=0;          //低電平信號
  110.   delayms(10);  //低電平信號保持
  111.   E=1;          //拉高電平信號
  112. }

  113. //***********************************************
  114. //函 數 名:lcd_writedata(const uchar *ptt);
  115. //入口參數:*ptt
  116. //出口參數:無
  117. //函數作用:LCD寫數據塊函數
  118. //說    明:
  119. //***********************************************
  120. void lcd_writedata(const uchar *ptt)
  121. {
  122.   uchar i;
  123.   for(i=0;i<16;i++)         //寫16個字節數據
  124.   {
  125.     lcd_writebyte(ptt[i]);  //查表寫數據
  126.   }
  127. }

  128. //***********************************************
  129. //函 數 名:lcd_init();
  130. //入口參數:無
  131. //出口參數:無
  132. //函數作用:LCD初始化
  133. //說    明:
  134. //***********************************************
  135. void lcd_init(void)
  136. {
  137.   PORTD=0X01;    //清除顯示
  138.   lcd_enable();
  139.   PORTD=0X38;    //8位2行5*7點陣
  140.   lcd_enable();
  141.   PORTD=0X0e;    //顯示開,光標開,閃爍
  142.   lcd_enable();
  143.   PORTD=0X06;    //文字不動,光標右移
  144.   lcd_enable();
  145. }

  146. //***********************************************
  147. //函 數 名:ds18b20_reset();
  148. //入口參數:無
  149. //出口參數:無
  150. //函數作用:DS18B20復位
  151. //說    明:
  152. //***********************************************
  153. void ds18b20_reset(void)
  154. {
  155.   uchar x=1;
  156.   while(x)
  157.   {
  158.     DQ_IO=0;       //設置RE0為輸出口
  159.     DQ=0;          //RE0輸出低電平
  160.     DelayUs(201);  //延時503us(最短480us低電平信號)
  161.     DQ_IO=1;       //釋放總線,進入接收(設置RE0為輸入口)
  162.     DelayUs(29);   //延時70us(18b20檢測到上升沿時,等待15-60us)
  163.     if(DQ){x=1;}   //有應答信號,跳出
  164.     else {x=0;}    //沒有應答信號,繼續復位(低電平持續在60-240us)
  165.     DelayUs(172);  //延時430us
  166.    }
  167. }

  168. //***********************************************
  169. //函 數 名:ds18b20_writebyte(uchar data);
  170. //入口參數:data
  171. //出口參數:無
  172. //函數作用:DS18B20寫一個字節數據
  173. //說    明:
  174. //***********************************************
  175. void ds18b20_writebyte(uchar data)
  176. {
  177.   uchar i,temp;
  178.   for(i=8;i>0;i--)      //寫8位數據
  179.   {
  180.     temp=data&0x01;     //先寫低位數據
  181.     DQ_IO=0;            //設置RE0為輸出口
  182.     DQ=0;               //RE0輸出低電平
  183.     DelayUs(1);         //延時6us(15us之內把數據送到總線上)
  184.     if(temp){DQ_IO=1;}  //設置RE0為輸入口(寫1時序)
  185.     DelayUs(25);        //延時61us(總線采樣時間15-60us)
  186.     DQ_IO=1;            //設置RE0為輸入口(寫0時序)
  187.     DelayUs(1);         //延時6us(寫第二位時間間隙大于1us)
  188.     data=data>>1;       //右移一位
  189.   }
  190. }

  191. //***********************************************
  192. //函 數 名:ds18b20_readbyte();
  193. //入口參數:無
  194. //出口參數:無
  195. //函數作用:DS18B20讀一個字節數據
  196. //說    明:
  197. //***********************************************
  198. unsigned char ds18b20_readbyte(void)
  199. {
  200.   uchar i,data=0;           //讀出溫度
  201.   for(i=8;i>0;i--)          //讀8位數據
  202.   {
  203.     data=data>>1;           //數據先右移一位
  204.     DQ_IO=0;                //設置RE0為輸出口
  205.     DQ=0;                   //RE0輸出低電平
  206.     DelayUs(1);             //延時6us(低電平時間大于1us)
  207.     DQ_IO=1;                //拉高總線,產生讀時間間隙(設置RE0為輸入口)
  208.     DelayUs(1);             //延時6us(從拉低電平開始15us之內完成讀位)
  209.     if(DQ){data=data|0x80;} //先讀高位數據,高位為1
  210.     else  {data=data|0x00;} //高位為0
  211.     DelayUs(25);            //延時61us(從拉低電平開始60-120us之內釋放總線)
  212.   }
  213.   return(data);
  214. }

  215. //***********************************************
  216. //函 數 名:read_ds18b20_data();
  217. //入口參數:無
  218. //出口參數:無
  219. //函數作用:讀DS18B20測試的溫度數據
  220. //說    明:
  221. //***********************************************
  222. void read_ds18b20_data(void)
  223. {
  224.   DQ_IO=1;                                   //設置RE0為輸入口
  225.   ds18b20_reset();                           //調用復位函數
  226.   ds18b20_writebyte(0XCC);                   //跳過ROM匹配
  227.   ds18b20_writebyte(0X44);                   //發送溫度變換命令
  228.   ds18b20_reset();                           //再次復位
  229.   ds18b20_writebyte(0XCC);                   //跳過ROM匹配
  230.   ds18b20_writebyte(0XBE);                   //發送讀溫度命令
  231.   lowtemp=ds18b20_readbyte();                //讀出低8位溫度值
  232.   hightemp=ds18b20_readbyte();               //讀出高8位溫度值
  233.   DQ_IO=1;                                   //釋放總線
  234.   zhengshu=((lowtemp>>4)|(hightemp<<4))&0X3F;
  235.   xiaoshu=lowtemp<<4;
  236.   temp[0]=(zhengshu/100)%10;                 //整數百位
  237.   temp[1]=(zhengshu/10)%10;                  //整數十位
  238.   temp[2]=zhengshu%10;                       //整數個位
  239.   temperature=0;  
  240.   if(xiaoshu&0x80)                           //下面是把小數部分轉換為BCD碼形式
  241.   {
  242.     temperature+=5000;
  243.   }
  244.   if(xiaoshu&0x40)
  245.   {
  246.     temperature+=2500;
  247.   }
  248.   if(xiaoshu&0x20)
  249.   {
  250.     temperature+=1250;
  251.   }
  252.   if(xiaoshu&0x10)
  253.   {
  254.      temperature+=625;               
  255.   }            
  256.   temp[3]=(temperature/1000)%10;             //十分位                    
  257.   temp[4]=(temperature/100)%10;              //百分位
  258.   temp[5]=(temperature/10)%10;               //千分位
  259.   temp[6]=temperature%10;                    //萬分位
  260.   DelayUs(1);                                //延時6us
  261. }

  262. //***********************************************
  263. //函 數 名:lcd_display_temp();
  264. //入口參數:無
  265. //出口參數:無
  266. //函數作用:LCD顯示測試溫度程序
  267. //說    明:
  268. //***********************************************
  269. void lcd_display_temp(void)
  270. {
  271.   PORTD=0X80;                    //設置第1行顯示地址
  272.   lcd_enable();
  273.   lcd_writedata(name);           //調用顯示函數
  274.   PORTD=0XC0;                    //設置第2行顯示地址
  275.   lcd_enable();                  //調用寫使能函數
  276.   lcd_writebyte(0x20);   
  277.   lcd_writebyte(0x20);
  278.   lcd_writebyte(0x20);
  279.   if(temp[0]==0)
  280.   {
  281.     lcd_writebyte(0x20);
  282.   }
  283.   else
  284.   {
  285.     lcd_writebyte(temp[0]+0x30);
  286.   }
  287.   lcd_writebyte(temp[1]+0x30);
  288.   lcd_writebyte(temp[2]+0x30);
  289.   lcd_writebyte(0x2e);
  290.   lcd_writebyte(temp[3]+0x30);
  291.   lcd_writebyte(temp[4]+0x30);
  292.   lcd_writebyte(temp[5]+0x30);
  293.   lcd_writebyte(temp[6]+0x30);
  294.   lcd_writebyte(0x20);
  295.   lcd_writebyte(0x43);
  296.   lcd_writebyte(0x20);
  297.   lcd_writebyte(0x20);
  298.   lcd_writebyte(0x20);
  299. }

  300. //***********************************************
  301. //函 數 名:main();
  302. //入口參數:無
  303. //出口參數:無
  304. //函數作用:MAIN函數
  305. //說    明:
  306. //***********************************************
  307. void main(void)
  308. {
  309.   port_init();           //調用端口初始化函數
  310.   lcd_init();            //調用LCD初始化函數
  311.   while(1)
  312.   {
  313.     read_ds18b20_data(); //調用溫度轉換函數
  314.     CLRWDT();            //清看門狗
  315.     lcd_display_temp();  //調用溫度顯示函數
  316.   }
  317. }
復制代碼




回復

使用道具 舉報

ID:490776 發表于 2019-6-10 11:01 來自手機 | 顯示全部樓層
有圖么
回復

使用道具 舉報

ID:410928 發表于 2019-9-20 10:35 | 顯示全部樓層
我現在就想做一個這個的東西,可以指導一下嗎?
回復

使用道具 舉報

ID:592524 發表于 2019-9-27 19:14 | 顯示全部樓層
感謝分享。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 精区3d动漫一品二品精区 | 涩涩视频网站在线观看 | 亚洲精品美女视频 | 中文一区 | 国产精品视频二区三区 | 成人一区二 | 成人国产精品久久 | 亚洲第一网站 | 亚洲欧美日韩激情 | 日韩在线一区二区 | 欧美群妇大交群中文字幕 | 国产成人一区二区 | 国产精品美女久久久久久久网站 | 欧美一级大片免费观看 | 精品欧美一区二区三区久久久 | 日本精品久久 | 91人人在线| 久久久久久国产 | 99久久夜色精品国产亚洲96 | 超碰在线97国产 | 狠狠爱网址| 999精品网 | 亚洲日日夜夜 | 国产69久久精品成人看动漫 | 男人视频网站 | 国产精品免费一区二区 | 婷婷色国产偷v国产偷v小说 | 久久一| 欧美h视频 | 日韩欧美精品 | 欧区一欧区二欧区三免费 | 中文在线一区二区 | 免费在线日韩 | 成人午夜激情 | 欧美日韩精品一区二区三区四区 | 精品福利一区二区三区 | 狠狠婷婷综合久久久久久妖精 | 91不卡在线 | 欧美日韩综合一区 | 国产在线资源 | av片在线观看 |