欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

帶注釋的DS18B20測溫單片機程序源碼

[復制鏈接]
跳轉到指定樓層
樓主
ID:300102 發表于 2018-6-10 14:07 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
單片機源程序如下:
  1. #include<reg52.h>  
  2. #include<intrins.h>
  3. #include <math.H>
  4. #define uchar  unsigned char  
  5. #define uint  unsigned int
  6. uchar i,L,M;
  7.   uchar datas[] = {0, 0, 0, 0, 0};
  8. sbit ds=P2^2;
  9. sbit RW = P3^6;
  10. sbit RS = P3^5;  
  11. sbit EN = P3^4;
  12. void delay(uchar us)
  13. {
  14.   while(us--);
  15. }
  16. void delayMs(uint a)
  17. {
  18.     uint i, j;
  19.     for(i = a; i > 0; i--)
  20.         for(j = 100; j > 0; j--);
  21. }
  22. /***LCD1602顯示***/
  23. void Read_busy()
  24. {
  25.     uchar busy;
  26.   P0=0xff;
  27.   RS = 0;
  28.     RW=1;
  29.   do
  30.       {
  31.      EN = 1;
  32.     busy=P0;
  33.     EN=0;
  34.    }
  35.    while(P0&0x80);//0x80:10000000,判斷狀態字的最后一位是0還是1.如果是0,則為不忙。不忙的話,則可以跳出do....while循環
  36. }
  37. //讀狀態,將液晶的狀態發回給單片機
  38. void writeCmd(uchar cmd)//寫1602命令一個字節
  39. {
  40.     Read_busy();//判斷忙
  41.    RS = 0;
  42.     RW=0;
  43.     P0 = cmd;//發送狀態字
  44.     EN = 1;//數據送過去以后,1602把它讀走。
  45.     EN=0;
  46. }
  47. //1602顯示字符串函數
  48. void Write_data(uchar date)
  49. {
  50.      Read_busy();//判斷忙不忙   
  51.     RS = 1;
  52.     RW=0;
  53.      P0 = date;//把數據送到數據線上
  54.      EN = 1;
  55.      EN=0;
  56. }
  57. void init()
  58. {
  59.     RW= 0;
  60.     writeCmd(0x38);
  61.     writeCmd(0x0c);
  62.     writeCmd(0x06);
  63.     writeCmd(0x01);
  64. }
  65. /****18B20函數****/
  66. void Init()//DS18B20初始化
  67. {
  68. //uchar t;
  69. ds=1;
  70. _nop_();//小小的延時
  71. ds=0;
  72. delay(75);//拉低總線499.45us;
  73. ds=1;
  74. //t=ds;//把ds的值賦給i,等待ds響應,如果i為1,則傳回主函數中去,及檢測到了DS18B20的響應
  75. delay(20);
  76. ds=1;//釋放總線
  77. _nop_();
  78. //return(t);
  79. }
  80. uchar read_byte()//讀數據
  81. {
  82. uchar i,j,dat;
  83.   for(i=0;i<8;i++)
  84. {
  85.    ds=0;
  86.    _nop_();
  87.    ds=1;//釋放總線
  88.   _nop_();
  89.   j=ds;//獲取數據
  90.   delay(10);
  91.   ds=1;
  92.   _nop_();
  93.   dat=(j<<7|dat>>1);//j左移7位,dat右移。一個字節便被存進去了
  94.     return(dat);
  95. }
  96. }
  97. void write_byte(uchar dat)//寫數據
  98. {
  99. uchar i;
  100. for(i=0;i<8;i++)
  101.   {
  102.     ds=0;
  103.   _nop_();
  104.   ds=dat&0x01;//當dat最低位為1時。與上以后還是1.所以就滿足時序圖的要求了。
  105.   delay(10);
  106.     ds=1;//釋放總線,準備下一次數據輸入
  107.   _nop_();//釋放總線要保持1us
  108.   dat>>=1;
  109.   }
  110. }
  111. void tempcod(uint t) //溫度轉化。。。顯示溫度值函數,t傳遞的是整形的溫度值(t是傳過來的溫度)
  112. {
  113.     uchar temp;
  114.     datas[0] = (temp / 10)+'0';//十位轉ASCLL碼
  115.     datas[1] = (temp % 10)+'0';//個位轉ASCLL碼
  116.    /* datas[2] = '\'';
  117.     datas[3] = 'c';
  118.     datas[4] = '0';//字符串結束符
  119.   Write_data(12,1,datas[]);//表示顯示在橫坐標為12,縱坐標在第二行的地方。*/
  120. }
  121. void display()
  122. {
  123. writeCmd(0x46|0x80);
  124. Write_data(datas[0]);//顯示十位
  125.   Write_data(datas[1]);//顯示個位
  126.   Write_data('.');
  127.   Write_data(0xdf);
  128.   Write_data('c');
  129. }
  130. main()
  131. {
  132. writeCmd(0x38);//顯示設置16*2顯示
  133.   writeCmd(0x0c);//開顯示
  134. writeCmd(0x06);//地址指針加一
  135. writeCmd(0x80);//顯示的位置(地址)
  136. writeCmd(0x01);//清屏
  137. // Write_data(i);
  138. //while(1);//讓程序一直停在這里
  139. while(1)
  140. {
  141. Init();
  142. write_byte(0xcc);//跳過ROM指令
  143. write_byte(0x44);//發送溫度轉化指令
  144. Init();
  145.   write_byte();//讀取暫存器的值
  146.   L=read_byte();//低八位
  147.   M=read_byte();//高八位
  148.   i=M;i<<=8;
  149.   i|=L;
  150.    i=i*0.0625*10+0.5;
  151. display(i);
  152. }
  153. }


復制代碼

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

使用道具 舉報

沙發
ID:633896 發表于 2019-11-1 15:50 | 只看該作者
樓主  你這里面 display里怎么可以放i變量  我用你的程序 編譯程序報錯
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表