打印

分享DS18B20数码管显示

[复制链接]
2051|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
小涛xty|  楼主 | 2011-8-21 16:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 小涛xty 于 2011-8-21 17:05 编辑

/*-----------------------------------------------
  名称:ds18b20
  修改:无
  内容:用数码管显示温度.请将18b20插紧,然后在数
        码管可以显示XX表示摄氏度,如显示25表示当
  前温度25度
------------------------------------------------*/
#include<reg52.h>
#define uchar unsigned char
#define uint  unsigned int
uchar code smg_we[]={0,1,2,3,4,5,6,7};
uchar code smg_du[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
uchar temp;
sbit DQ=P1^3;
void delay_50us(uchar t);
void delay(uint t);
void init_ds18b20(void);
void write_byte(uchar dat);
uchar read_byte(void);
uchar readtemperature(void);
void display(void);
/*--------------------------------------
  延时子函数,在11.0592MHZ的晶振频率下
  大约50us的延时
---------------------------------------*/
void delay_50us(uchar t)
{
uchar x,y;
for(x=t;x>0;x--)
{
  for(y=21;y>0;y--);
}
}
/*-----------------------------------
             延时函数
------------------------------------*/
void delay(uint t)
{
while(t--);
}
/*-----------------------------------
           ds18b20初始化函数
------------------------------------*/
void init_ds18b20(void)
{
uchar n;
DQ=1;
delay(8);
DQ=0;
delay(80);
DQ=1;
delay(8);
n=DQ;
delay(4);
}
/*-----------------------------------
             写函数
------------------------------------*/
void write_byte(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
  DQ=0;
  DQ=dat&0x01;        //温度传感器低位在前
  delay(4);
  DQ=1;
  dat>>=1;            //右移1位
}
delay(4);
}
/*-----------------------------------
             读函数
------------------------------------*/
uchar read_byte(void)
{
uchar i,value;
for(i=0;i<8;i++)
{
  DQ=0;
  value>>=1;           //右移,同时起延时作用
  DQ=1;
  if(DQ)               //采样   
   value|=0x80;
  delay(4);
}
return value;
}
/*-----------------------------------
             读温度函数
------------------------------------*/
uchar readtemperature(void)
{
uchar a,b;
init_ds18b20();
write_byte(0xcc);       //跳过ROM
write_byte(0x44);       //启动温度测量
delay(300);
init_ds18b20();
write_byte(0xcc);      //跳过ROM
write_byte(0xbe);      //读取暂存器内容
a=read_byte();         //低位
b=read_byte();         //高位
b<<=4;
b+=(a&0xf0)>>4;
return b;
}
/*-----------------------------------
             显示函数
------------------------------------*/
void display(void)
{
P2=smg_we[6];
P0=smg_du[temp/10];
delay_50us(20);
P2=smg_we[7];
P0=smg_du[temp%10];
delay_50us(20);
}
/*-----------------------------------
             主函数
------------------------------------*/
void main()
{
while(1)
{
  temp=readtemperature();
  display();
}
}

相关帖子

沙发
小涛xty|  楼主 | 2011-8-22 08:56 | 只看该作者
呵呵

使用特权

评论回复
板凳
mugenwon| | 2011-8-22 16:46 | 只看该作者
这东西有用!曾经想用但只看datasheet又没ic验证搞来搞去没搞明白!有程序看帮助很大!!

使用特权

评论回复
地板
hukepig| | 2011-8-27 06:40 | 只看该作者
谢谢你的分享,我正在弄这个东西

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

50

帖子

1

粉丝