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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2631|回復(fù): 0
收起左側(cè)

C51單片機(jī)&DB18S20使用

[復(fù)制鏈接]
ID:272943 發(fā)表于 2018-1-7 22:09 | 顯示全部樓層 |閱讀模式
源代碼
  1. #include <AT89x52.h>      
  2. #include <Intrins.h>  
  3. //---------------------------------------
  4. //1602液晶相關(guān)I/O設(shè)置
  5. sbit E=P2^3;               //1602液晶的E腳接在P2.3口上
  6. sbit RW=P2^4;              //1602液晶的RW腳接在P2.4口上
  7. sbit RS=P2^5;              //1602液晶的RS腳接在P2.5口上
  8. //---------------------------------------
  9. sbit ds18b20=P3^7;        

  10. unsigned char DISbuf;     //設(shè)置8位的unsigendchar型寄存器用來暫存1602要顯示的內(nèi)容

  11.         
  12. unsigned char temp1;
  13. unsigned char temp2;
  14. unsigned char temp1buf1;
  15. unsigned char temp1buf2;
  16. bit tc;
  17. bit no;
  18. unsigned char codetablexiao[16]={0,0,1,2,2,3,4,4,5,6,6,7,8,8,9,9};
  19. void Delay(unsigned int nTimeDelay)
  20. {
  21.    unsigned int i;
  22.    while (nTimeDelay--)
  23.        for (i=0;i<125;i++)
  24.        {}
  25. }
  26. void Reset()
  27. {
  28.    unsigned int i;
  29.    
  30.    ds18b20=0;     //拉低DQ總線開始復(fù)位        
  31.    i=206;
  32.    while(i>0)
  33.        i--;       //保持DQ低大約900uS            
  34.   ds18b20=1;     //釋放DQ位   
  35.    i=8;
  36.    while(i>0)
  37.       i--;
  38. }

  39. bit WaitPresence()
  40. {
  41.    unsigned char i;
  42.   bit k;
  43.    i=16;
  44.    while(i>0)
  45.       i--;
  46.    
  47.        if(ds18b20==0)
  48.          k=1;
  49.        else
  50.         k=0;

  51.   i=72;
  52.    while(i>0)
  53.       i--;
  54.        return k;
  55.    
  56. }

  57. bit ReadBit()
  58. {
  59.    unsigned int i;
  60.   bit dat;   
  61.    ds18b20=0;

  62.   i++;
  63.   
  64.    ds18b20=1;
  65.    i+=2;
  66.    
  67.    dat=ds18b20;           
  68. i=16;
  69.    while(i>0)
  70.        i--;

  71.    return dat;
  72. }
  73. unsigned char ReadByte()
  74. {
  75.    unsigned char i,j,dat;
  76.    dat=0;

  77.    for(i=1;i<=8;i++)
  78.     {
  79.        j=ReadBit();
  80.        dat=(j<<7) | (dat>>1);
  81.    }

  82.    return dat;
  83. }

  84. void WriteByte(unsigned char dat)
  85. {
  86.    unsigned int i;
  87.    unsigned char j;
  88.    bit testb;

  89.    for(j=1;j<=8;j++)
  90.     {
  91.        testb=dat & 0x01;
  92.        dat=dat>>1;

  93.        if(testb)
  94.        {
  95.            ds18b20=0;               
  96.            i+=2;
  97.            
  98.            ds18b20=1;                 
  99.            i=8;
  100.            while(i>0)
  101.                 i--;
  102.        }
  103.        else      {            
  104.             ds18b20=0;                 
  105.            i=8;
  106.          while(i>0)
  107.             i--;

  108.          
  109.          ds18b20=1;                 
  110.          i+=2;
  111.     } }}
  112. bit Convert()
  113. {   
  114.    Reset();
  115.   if(WaitPresence()==1)
  116.      {
  117.      Delay(1);
  118.      WriteByte(0xcc);//skip rom
  119.      WriteByte(0x44);//convert         
  120.          return 1;
  121.        }
  122.        else
  123.        {         
  124.         return 0;
  125.      } }

  126. bit ReadFlash()
  127. {   
  128.   unsigned char nLsb,nMsb;        
  129.     Reset();        
  130.   if(WaitPresence()==1)
  131.        {
  132.     Delay(1);
  133.      WriteByte(0xcc);//skip rom
  134.      WriteByte(0xbe);//convert
  135.    nLsb=ReadByte();//LSB
  136.     nMsb=ReadByte();//MSB         
  137.          if(no==1) return 1;         
  138.         temp2=nLsb&0x0f;
  139.     temp1=(nLsb>>4)|(nMsb<<4);         
  140.         return 1;
  141.       }
  142.      else
  143.        {
  144.          return 0;
  145.        }
  146. }

  147. void LCD1602_busy(void)
  148. {
  149.     P0_7=1;              //將P0.7置1,為讀狀態(tài)做準(zhǔn)備
  150.    RS=0;                //RS=0、RW=1、E=1時(shí),忙信號輸出到DB7,由P0.7讀入
  151.     RW=1;                //RS=0、RW=1、E=1時(shí),忙信號輸出到DB7,由P0.7讀入
  152.     E=1;                 //RS=0、RW=1、E=1時(shí),忙信號輸出到DB7,由P0.7讀入
  153.     while(P0_7==1);      //由P0.7讀入1,表示1602液晶忙,需要等待
  154.     E=0;                 //讀完以后,恢復(fù)E的電平
  155. }

  156. void LCD1602_Write_com(unsigned charcombuf)
  157. {
  158.    RS=0;                //選擇指令寄存器
  159.     RW=0;                //選擇寫狀態(tài)
  160.     P0=combuf;           //將命令字通過P0口送至DB
  161.    E=1;                 //E高電平將命令字寫入1602液晶
  162.     E=0;                 //寫完以后,恢復(fù)E的電平
  163. }

  164. void LCD1602_Write_com_busy(unsigned charcombuf)
  165. {
  166.     LCD1602_busy();            //調(diào)用忙檢測函數(shù)
  167.     LCD1602_Write_com(combuf); //調(diào)用忙檢測函數(shù)
  168. }
  169. void LCD1602_Write_data_busy(unsigned chardatabuf)
  170. {
  171.     LCD1602_busy();      //調(diào)用忙檢測函數(shù)
  172.    RS=1;                //選擇數(shù)據(jù)寄存器
  173.    RW=0;                //選擇寫狀態(tài)
  174.     P0=databuf;          //將命令字通過P0口送至DB
  175.    E=1;                 //E高電平將命令字寫入1602液晶
  176.     E=0;                 //寫完以后,恢復(fù)E的電平
  177. }

  178. void LCD1602_Write_address(unsigned charx,unsigned char y)
  179. {
  180.    x&=0x0f;             //列地址限制在0-15間
  181.     y&=0x01;             //行地址限制在0-1間
  182.     if(y==0)             //如果是第一行
  183.     LCD1602_Write_com_busy(x|0x80);       //將列地址寫入
  184.    else                 //如果是第二行
  185.       LCD1602_Write_com_busy((x+0x40)|0x80); //將列地址寫入
  186. }
  187. void LCD1602_init(void)
  188. {
  189.   Delay(150);               //調(diào)用延時(shí)函數(shù)
  190.    LCD1602_Write_com(0x38);       //8位數(shù)據(jù)總線,兩行顯示模式,5*7點(diǎn)陣顯示
  191.   Delay(50);                //調(diào)用延時(shí)函數(shù)
  192.     LCD1602_Write_com(0x38);       //8位數(shù)據(jù)總線,兩行顯示模式,5*7點(diǎn)陣顯示
  193.     Delay(50);                //調(diào)用延時(shí)函數(shù)
  194.    LCD1602_Write_com(0x38);       //8位數(shù)據(jù)總線,兩行顯示模式,5*7點(diǎn)陣顯示
  195.   LCD1602_Write_com_busy(0x38);  //8位數(shù)據(jù)總線,兩行顯示模式,5*7點(diǎn)陣顯示
  196.   LCD1602_Write_com_busy(0x08);  //顯示功能關(guān),無光標(biāo)
  197.   LCD1602_Write_com_busy(0x01);  //清屏
  198.     LCD1602_Write_com_busy(0x06);  //寫入新的數(shù)據(jù)后,光標(biāo)右移,顯示屏不移動(dòng)
  199.    LCD1602_Write_com_busy(0x0C);  //顯示功能開,無光標(biāo)
  200. }

  201. void LCD1602_Disp(unsigned char x,unsignedchar y,unsigned char buf)
  202. {
  203.     LCD1602_Write_address(x,y);    //先將地址信息寫入
  204.   LCD1602_Write_data_busy(buf);  //再寫入要顯示的數(shù)據(jù)
  205. }

  206. void main(void)            //主函數(shù),單片機(jī)開機(jī)后就是從這個(gè)函數(shù)開始運(yùn)行
  207. {
  208.        unsigned char buf;
  209.   LCD1602_init();        //調(diào)用1602液晶初始化函數(shù)
  210.   while(1)               //死循環(huán),單片機(jī)初始化后,將一直運(yùn)行這個(gè)死循環(huán)
  211.    {
  212.            tc=Convert();                                        //啟動(dòng)轉(zhuǎn)換
  213.      if(tc==1)                                                //轉(zhuǎn)換結(jié)束
  214.             {            
  215.                   ReadFlash();                       //讀取溫度                           
  216.       if(temp1>80) temp1=0;                        
  217.                        if(temp2>15)temp2=0;         
  218.                       buf=temp1/10;                        
  219.                       buf+=0x30;                        
  220.                       LCD1602_Disp(0,0,buf);  //溫度整數(shù)部分十位
  221.                       buf=temp1%10;
  222.                       buf+=0x30;                        
  223.                LCD1602_Disp(1,0,buf);  //溫度整數(shù)部分個(gè)位
  224.                       LCD1602_Disp(2,0,0x2e);  //.
  225.                     buf=tablexiao[temp2&0x0f];
  226.                      buf+=0x30;
  227.                     LCD1602_Disp(3,0,buf);  //溫度小數(shù)部分
  228.                      LCD1602_Disp(4,0,0xdf);   //.
  229.                       LCD1602_Disp(5,0,0x43);   //C                                                                 
  230.          }   
  231. }}
復(fù)制代碼





回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 在线观看国产视频 | 成人中文字幕av | 成人午夜在线视频 | 久久精品| 欧美三级在线 | 日韩免费福利视频 | 久久国产精品免费一区二区三区 | 亚洲 成人 在线 | 国产中文一区二区三区 | 亚洲精品九九 | 一区二区三区视频 | 一区二区三区亚洲 | 龙珠z在线观看 | 久久久久久国产精品免费免费 | 亚洲三区在线观看 | 日韩插插| av中文字幕网| 久久99精品久久久久子伦 | 成人黄色av网址 | 午夜小视频在线播放 | 欧美国产一区二区 | 精品久久国产 | 亚洲自拍偷拍免费视频 | 粉嫩一区二区三区性色av | 成人欧美一区二区三区色青冈 | 精品乱码一区二区三四区视频 | 97伦理影院 | 国产98色在线 | 日韩 | 日韩在线看片 | 欧美成人在线影院 | 欧美精品一区二区三区四区 在线 | 一区精品在线观看 | 一区二区在线 | 国产精品久久久久久久久久三级 | 日韩高清中文字幕 | 欧美a在线看| 久久久久久久久久久久久9999 | 欧美久久大片 | 国产主播第一页 | 成人在线视频网址 | 欧美视频精品 |