找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2343|回复: 0
打印 上一主题 下一主题
收起左侧

C51单片机&DB18S20使用

[复制链接]
跳转到指定楼层
楼主
ID:272943 发表于 2018-1-7 22:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
源代码
  1. #include <AT89x52.h>      
  2. #include <Intrins.h>  
  3. //---------------------------------------
  4. //1602液晶相关I/O设置
  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;     //设置8位的unsigendchar型寄存器用来暂存1602要显示的内容

  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总线开始复位        
  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,为读状态做准备
  150.    RS=0;                //RS=0、RW=1、E=1时,忙信号输出到DB7,由P0.7读入
  151.     RW=1;                //RS=0、RW=1、E=1时,忙信号输出到DB7,由P0.7读入
  152.     E=1;                 //RS=0、RW=1、E=1时,忙信号输出到DB7,由P0.7读入
  153.     while(P0_7==1);      //由P0.7读入1,表示1602液晶忙,需要等待
  154.     E=0;                 //读完以后,恢复E的电平
  155. }

  156. void LCD1602_Write_com(unsigned charcombuf)
  157. {
  158.    RS=0;                //选择指令寄存器
  159.     RW=0;                //选择写状态
  160.     P0=combuf;           //将命令字通过P0口送至DB
  161.    E=1;                 //E高电平将命令字写入1602液晶
  162.     E=0;                 //写完以后,恢复E的电平
  163. }

  164. void LCD1602_Write_com_busy(unsigned charcombuf)
  165. {
  166.     LCD1602_busy();            //调用忙检测函数
  167.     LCD1602_Write_com(combuf); //调用忙检测函数
  168. }
  169. void LCD1602_Write_data_busy(unsigned chardatabuf)
  170. {
  171.     LCD1602_busy();      //调用忙检测函数
  172.    RS=1;                //选择数据寄存器
  173.    RW=0;                //选择写状态
  174.     P0=databuf;          //将命令字通过P0口送至DB
  175.    E=1;                 //E高电平将命令字写入1602液晶
  176.     E=0;                 //写完以后,恢复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);               //调用延时函数
  190.    LCD1602_Write_com(0x38);       //8位数据总线,两行显示模式,5*7点阵显示
  191.   Delay(50);                //调用延时函数
  192.     LCD1602_Write_com(0x38);       //8位数据总线,两行显示模式,5*7点阵显示
  193.     Delay(50);                //调用延时函数
  194.    LCD1602_Write_com(0x38);       //8位数据总线,两行显示模式,5*7点阵显示
  195.   LCD1602_Write_com_busy(0x38);  //8位数据总线,两行显示模式,5*7点阵显示
  196.   LCD1602_Write_com_busy(0x08);  //显示功能关,无光标
  197.   LCD1602_Write_com_busy(0x01);  //清屏
  198.     LCD1602_Write_com_busy(0x06);  //写入新的数据后,光标右移,显示屏不移动
  199.    LCD1602_Write_com_busy(0x0C);  //显示功能开,无光标
  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);  //再写入要显示的数据
  205. }

  206. void main(void)            //主函数,单片机开机后就是从这个函数开始运行
  207. {
  208.        unsigned char buf;
  209.   LCD1602_init();        //调用1602液晶初始化函数
  210.   while(1)               //死循环,单片机初始化后,将一直运行这个死循环
  211.    {
  212.            tc=Convert();                                        //启动转换
  213.      if(tc==1)                                                //转换结束
  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);  //温度整数部分十位
  221.                       buf=temp1%10;
  222.                       buf+=0x30;                        
  223.                LCD1602_Disp(1,0,buf);  //温度整数部分个位
  224.                       LCD1602_Disp(2,0,0x2e);  //.
  225.                     buf=tablexiao[temp2&0x0f];
  226.                      buf+=0x30;
  227.                     LCD1602_Disp(3,0,buf);  //温度小数部分
  228.                      LCD1602_Disp(4,0,0xdf);   //.
  229.                       LCD1602_Disp(5,0,0x43);   //C                                                                 
  230.          }   
  231. }}
复制代码





分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表