找回密码
 立即注册

QQ登录

只需一步,快速开始

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

求玩过DS18B20大虾解答;初始化正常读出数据ab是0xffff

[复制链接]
跳转到指定楼层
楼主
void Delay800ms()  //@12.000MHz
{
unsigned char i, j, k;
_nop_();
_nop_();
i = 49;
j = 180;
k = 100;
do
{
  do
  {
   while (--k);
  } while (--j);
} while (--i);
}
void nb(uint z)   //??
{
uint x,y;
     x=z;
for(x;x>0;x--)
   for(y=110;y>0;y--);
}
void Delay1us(uint zz)  //@12.000MHz 1U延时
{
unsigned char i ;uint z;

for(z=zz;z>0;z--)
{i = 2;
while (--i);}
}
void Delay1ms()  //@12.000MHz
{
unsigned char i, j;
i = 16;
j = 147;
do
{
  while (--j);
} while (--i);
}
/*****初始化DS18B20*****/
void Init_DS18B20()
{
unsigned char x=100;
DQ=1;

DQ=0;

Delay1us(500);
DQ=1;
Delay1us(60);
while(DQ&&x--);
fg=DQ;
}
/*****读一个字节*****/
uchar  ReadOneChar(void)  //主机数据线先从高拉至低电平1us以上,再使数据线升为高电平,从而产生读信号
{  
unsigned char i=8; //每个读周期最短的持续时间为60us,各个读周期之间必须有1us以上的高电平恢复期
unsigned char dat=0,dab;
for (i=8;i>0;i--) //一个字节有8位
{
  
  DQ=0;
  dat>>=1;
  Delay1us(2);
  DQ=1;
  Delay1us(10);
  if(DQ)
  {
   dat|=0x80;
  }
  Delay1us(60);

} return(dat);
}
/*****写一个字节*****/
void WriteOneChar(unsigned char dat)
{

unsigned char i=0;

//数据线从高电平拉至低电平,产生写起始信号。15us之内将所需写的位送到数据线上,
for(i=8;i>0;i--) //在15~60us之间对数据线进行采样,如果是高电平就写1,低写0发生。
{
  
  DQ=0; //在开始另一个写周期前必须有1us以上的高电平恢复期。
  Delay1us(1);
  DQ=dat&0x01;  //按低位发送数据
  Delay1us(120);
  DQ=1;
  dat=dat>>1;}
Delay1us(70);
}

/*****读取温度*****/
ReadTemperature()
{
uchar a,b;uchar t;float tt;
Init_DS18B20(); //初始化
Delay1ms();
WriteOneChar(0xcc); //跳过读序列号的操作
WriteOneChar(0x44); //启动温度转换
  Delay800ms() ; //@12.000MHz //转换需要一点时间,延时
Init_DS18B20(); //初始化
WriteOneChar(0xcc); //跳过读序列号的操作
WriteOneChar(0xbe); //读温度寄存器(头两个值分别为温度的低位和高位)
a=ReadOneChar(); //读出温度的低位LSB
b=ReadOneChar(); //读出温度的高位MSB


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

使用道具 举报

沙发
ID:213173 发表于 2019-3-6 15:34 | 只看该作者
你这样问很难解答,给你一个成熟的程序和仿真图参考

  1. /*-----------------------------------------------
  2.   名称:DS18b20测温程序 数码管显示(-55~128度)
  3. ------------------------------------------------*/
  4. #include <reg51.H>
  5. #define uchar unsigned char
  6. #define uint unsigned int
  7. #define DataPort P0 //定义数据端口

  8. sbit LATCH1=P2^6;//定义锁存使能端口 段锁存
  9. sbit LATCH2=P2^7;//                 位锁存
  10. sbit DQ=P2^2;                //DS18B20 端口

  11. /************定义全局变量*************/
  12. uchar code dofly_DuanMa[]={//共阴数码管段码"0~f-."
  13.                 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,
  14.                 0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40,0x80};
  15. uchar code dofly_WeiMa[]={//共阴数码管8位位码
  16.                 0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
  17. uchar TempData[6]; //存储显示值的全局变量
  18. bit ReadTempFlag;        //读时间标志
  19. /*------------------------------------------------
  20.                   函数声明
  21. ------------------------------------------------*/
  22. void WriteOneChar(uchar dat);//写入DS18B20一个字节
  23. uchar ReadOneChar();//读取DS18B20一个字节
  24. uint ReadTemperature();//读取DS18B20温度值
  25. void Init_DS18B20();//初始化DS18B20
  26. void Display();        //数码管显示函数
  27. void Init_Timer0();        //定时器初始化
  28. void delay(uchar i);//1ms延时函数
  29. /*------------------------------------------------
  30.                     主函数
  31. ------------------------------------------------*/
  32. void main()
  33. {                  
  34.         uint temp;
  35.         long tempM;
  36.         bit negative;//负数标志
  37.         uchar TempH,TempL,TempK;
  38.         Init_Timer0();
  39.         TempData[5]=0x39;                                //显示C
  40.         while(1)         //主循环
  41.         {
  42.                 if(ReadTempFlag==1)//定时标志
  43.                 {
  44.                         ReadTempFlag=0;
  45.                         temp=ReadTemperature();//读取温度
  46.                         if(temp&0x8000)
  47.                         {
  48.                                 negative=1;                //负号标志
  49.                                 temp=~temp;                //取反加1
  50.                                 temp +=1;
  51.                         }
  52.                         else negative=0;        //正数

  53.                         tempM=temp*0.0625*100;        //换算为10进制温度值再放大100倍
  54.                         TempH=tempM/100;                                //分解出整数值       
  55.                         TempL=tempM%100;                                //分解出小数值
  56.                         TempL=(TempL+TempK)/2+0.5;//小数取两次平均值加四舍五入
  57.                         TempK=TempL;
  58.                        
  59.                         if(negative==1)
  60.                                 TempData[0]=0x40;//显示负号
  61.                         else if(TempH/100==0)//小于100
  62.                                 TempData[0]=0;                                                                                        //百位消隐
  63.                         else
  64.                                 TempData[0]=dofly_DuanMa[TempH/100];                         //显示百位温度
  65.        
  66.                         if((TempH/100==0)&&((TempH%100)/10==0))
  67.                                 TempData[1]=0;                                                                                        //十位消隐
  68.                         else
  69.                                 TempData[1]=dofly_DuanMa[(TempH%100)/10];                //显示十位温度
  70.                         TempData[2]=dofly_DuanMa[(TempH%100)%10]|0x80;//显示个位温度,带小数点
  71.                         TempData[3]=dofly_DuanMa[TempL/10];                                //显示温度小数1位
  72.                         TempData[4]=dofly_DuanMa[TempL%10];                                //显示温度小数2位       
  73.                 }
  74.         }
  75. }
  76. /**********1ms延时************/
  77. void delay(uchar i)
  78. {
  79.         uchar j, k;  
  80.         for(j=i;j>0;j--)
  81.                 for(k=120;k>0;k--);   
  82. }
  83. /*****初始化DS18B20*****/
  84. void Init_DS18B20()
  85. {
  86.         uint i;
  87.         DQ=0;
  88.         i = 103;  
  89.         while(i>0)
  90.                 i--;
  91.         DQ=1;
  92.         i = 4;   
  93.         while(i>0)
  94.                 i--;  
  95. }
  96. /*****读一个字节*****/
  97. uchar ReadOneChar()
  98. {
  99.         uchar i=0;
  100.         uchar dat = 0;
  101.         for (i=8;i>0;i--)
  102.         {
  103.                 DQ = 0; // 给脉冲信号
  104.                 dat>>=1;
  105.                 DQ = 1; // 给脉冲信号
  106.                 if(DQ)
  107.                 dat|=0x80;
  108.                 delay(1);
  109.         }
  110.         return(dat);
  111. }
  112. /*****写一个字节*****/
  113. void WriteOneChar(uchar dat)
  114. {
  115.         uchar i=0;
  116.         for(i=8; i>0; i--)
  117.         {
  118.                 DQ = 0;
  119.                 DQ = dat&0x01;
  120.                 delay(1);
  121.                 DQ = 1;
  122.                 dat>>=1;
  123.         }
  124.         delay(1);
  125. }
  126. /*****读取温度*****/
  127. uint ReadTemperature()
  128. {
  129.         uchar a,b;
  130.         uint tt;

  131.         Init_DS18B20();    //初始化DS18B20
  132.         delay(1);    //延时1ms  
  133.         WriteOneChar(0xcc); //写入跳过序列号命令字
  134.         WriteOneChar(0x44); //写入温度转换命令字

  135.         delay(1);      //延时1ms  //@12.000MHz //转换需要一点时间,延时
  136.         Init_DS18B20();     //初始化DS18B20
  137.         delay(1);      //延时1ms  
  138.         WriteOneChar(0xcc); //写入跳过序列号命令字
  139.         WriteOneChar(0xbe); //写入读取数据令字

  140.         a=ReadOneChar(); //读出温度的低位LSB
  141.         b=ReadOneChar(); //读出温度的高位MSB
  142.         tt=(b<<8)|a;
  143.         return tt;
  144. }
  145. /*------------------------------------------------
  146.                                 6位动态数码管显示函数
  147. ------------------------------------------------*/
  148. void Display()
  149. {
  150.         static uchar i=0;

  151.         DataPort=0;   //清空数据,消隐
  152.         LATCH1=1;     //段锁存
  153.         LATCH1=0;
  154.        
  155.         DataPort=dofly_WeiMa[i]; //取位码
  156.         LATCH2=1;     //位锁存
  157.         LATCH2=0;
  158.        
  159.         DataPort=TempData[i]; //取显示数据,段码
  160.         LATCH1=1;     //段锁存
  161.         LATCH1=0;
  162.        
  163.         i++;
  164.         i%=6;
  165. }
  166. /*------------------------------------------------
  167.             定时器初始化子程序
  168. ------------------------------------------------*/
  169. void Init_Timer0(void)
  170. {
  171.          TMOD |= 0x01;          //使用模式1,16位定时器
  172.          TH0=(65536-2000)/256;              //给定初值
  173.          TL0=(65536-2000)%256;
  174.          EA=1;            //总中断打开
  175.          ET0=1;           //定时器中断打开
  176.          TR0=1;           //定时器开关打开
  177. }
  178. /*------------------------------------------------
  179.                  定时器中断子程序
  180. ------------------------------------------------*/
  181. void Timer0_isr(void) interrupt 1
  182. {
  183.         static uint num;
  184.         TH0=(65536-2000)/256;        //重新赋值 2ms
  185.         TL0=(65536-2000)%256;
  186.        
  187.         Display();       // 调用数码管扫描
  188.         num++;
  189.         if(num>=250)        //500ms
  190.         {
  191.                 num=0;
  192.                 ReadTempFlag=1; //读标志位置1
  193.         }
  194. }
复制代码



回复

使用道具 举报

板凳
ID:323005 发表于 2019-3-6 21:17 | 只看该作者
wulin 发表于 2019-3-6 15:34
你这样问很难解答,给你一个成熟的程序和仿真图参考

谢谢已解决
回复

使用道具 举报

地板
ID:466164 发表于 2019-3-6 22:57 | 只看该作者
缺少浮点变量,转来转去全是整数
TempData[1]=dofly_DuanMa[(TempH%100)/10];                //显示十位温度
TempData[2]=dofly_DuanMa[(TempH%100)%10]|0x80;//显示个位温度TempData[3]=dofly_DuanMa[TempL/10];                                //显示温度TempData[4]=dofly_DuanMa[TempL%10];                                //显示温度小数2位  
缺少个位
TempData[1]=dofly_DuanMa[TempH/100];
TempData[2]=dofly_DuanMa[TempH%100/10];
TempData[3]=dofly_DuanMa[TempH%10/10]|0x80;
TempData[4]=dofly_DuanMa[TempL/10];
TempData[5]=dofly_DuanMa[TempL%10];
你可以试下我新手才学3个月
回复

使用道具 举报

5#
ID:471066 发表于 2019-3-7 00:47 | 只看该作者

是啊,在做只前一定要弄懂别人的,再找着调试,模仿

评分

参与人数 1黑币 +8 收起 理由
嘉立创AAA + 8 很给力!

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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