找回密码
 立即注册

QQ登录

只需一步,快速开始

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

ds18b20温度显示 仿真及源码

[复制链接]
跳转到指定楼层
楼主
lcd1602显示,只能显示正温度


单片机程序源码:
  1. #include<reg52.h>
  2. #include  "Cry1602.h"
  3. #include  "Cry1602.c"
  4. #define out  P1
  5. #define uint unsigned int
  6. #define uchar unsigned char
  7. #define set_DQ P3|=0x80;
  8. #define clr_DQ P3&=~0x80;
  9. uchar i=0,t=0,j;
  10. uchar count[2]=0;
  11. void delay(uint z)
  12. {
  13.         uint x,y;
  14.         for(x=z;x>0;x--)
  15.                 for(y=114;y>0;y--);
  16. }
  17. void tmp_reset(void)       //send tmp_reset and initialization command 18B20复位,初始化函数
  18. {
  19.   uint i;
  20.   clr_DQ;
  21.   for(i=103;i>0;i--);
  22.   set_DQ;
  23. for(i=4;i>0;i--);
  24. }

  25. bit tmp_read1bit(void)      
  26. {
  27.    uint i;
  28.    bit dat;
  29.    clr_DQ;i++;         
  30.    set_DQ;i++;i++;
  31.    dat=P3&0x80;
  32.    for(i=8;i>0;i--);
  33.    return (dat);
  34. }

  35. uchar tmp_readbyte(void)   //read a byte date   读1字节函数
  36. {
  37.   uchar i,j,dat;
  38.   dat=0;
  39.   for(i=1;i<=8;i++)
  40.   {
  41.     j=tmp_read1bit();
  42.     dat=(j<<7)|(dat>>1);   //读出的数据最低位在最前面,这样刚好一个字节在DAT里
  43.   }
  44.   return(dat);
  45. }

  46. void tmp_writebyte(uchar dat)   //write a byte to ds18b20  向1820写一个字节数据函数
  47. {
  48.   uint i;
  49.   uchar j;
  50.   bit testb;
  51.   for(j=1;j<=8;j++)
  52.   {
  53.     testb=dat&0x01;
  54.     dat=dat>>1;
  55.     if(testb)     //write 1
  56.     {
  57.       clr_DQ;
  58.       i++;i++;
  59.       set_DQ;
  60.       for(i=8;i>0;i--);
  61.     }
  62.     else
  63.     {
  64.       clr_DQ;       //write 0
  65.       for(i=8;i>0;i--);
  66.       set_DQ;
  67.       i++;i++;
  68.     }

  69.   }
  70. }
  71. uint get_tmp()               //get the temperature     读取寄存器中存储的温度数据
  72. {
  73.   float tt;
  74.   uchar a,b;
  75.   uint temp;

  76.   tmp_reset();
  77.   delay(1);
  78.   tmp_writebyte(0xcc);  // address all drivers on bus  写跳过读ROM指令
  79.   tmp_writebyte(0x44);

  80.   tmp_reset();
  81.   delay(1);
  82.   tmp_writebyte(0xcc);
  83.   tmp_writebyte(0xbe);
  84.   a=tmp_readbyte();   //读低8位
  85.   b=tmp_readbyte();   //读高8位
  86.   temp=b;
  87.   temp<<=8;             //two byte  compose a int variable   两个字节组合为1个字
  88.   temp=temp|a;
  89.   tt=temp*0.0625;   //温度在寄存器中是12位,分辨率是0.0625
  90.   temp=(tt*10+0.5)/10;  //乘10表示小数点后只取1位,加0.5是四折五入
  91.   return temp;
  92. }



  93. void timer_init();

  94. void main()
  95. {
  96.         timer_init();
  97.         LcdReset();
  98.         DispStr(0x80,0,"welcom!");
  99.         while(1)
  100.         {
  101.                 temp=get_tmp();
  102.                 for(j=0;j<2;j++)
  103.                 {
  104.                         count[1-j]=temp%10+0x30;
  105.                         temp/=10;
  106.                 }
  107.         DispStr(0x85,1,count);
  108.         }
  109. }
  110. void timer_init()
  111. {
  112. EA=1;
  113.         ET1=1;
  114.         TR1=1;
  115.         TMOD=0x10;
  116.         TH1=(65536-10000)/256;
  117.         TL1=(65536-10000)%256;
  118. }
复制代码

温度显示.rar

77.91 KB, 下载次数: 32, 下载积分: 黑币 -5

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

沙发
ID:147898 发表于 2016-11-14 21:35 | 只看该作者
很不错,很有用。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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