Chinaunix首页 | 论坛 | 博客
  • 博客访问: 71309
  • 博文数量: 27
  • 博客积分: 2015
  • 博客等级: 大尉
  • 技术积分: 300
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-18 19:36
文章分类

全部博文(27)

文章存档

2011年(1)

2010年(5)

2009年(16)

2008年(5)

我的朋友

分类: C/C++

2009-04-16 15:31:54

//=====================================================================
//                    DS18b20 驱动程序
//硬件连接: DQ——P0^0;  
//          VDD--逻辑电源(+5V)
//          GND--GND(0V)
//DS18b20.c
//writer:谷雨 2008年3月18日于EDA实验室整理
//=====================================================================

#include

#define uint unsigned int
#define uchar unsigned char


sbit DQ =P0^0;   //定义通信端口,修改硬件时要修改的部分


void delay(uint i) //延时函数
{
while(i--);
}

Init_DS18B20(void) //初始化函数
{
unsigned char x=0;
DQ = 1;   //DQ复位
delay(8); //稍做延时
DQ = 0;   //单片机将DQ拉低
delay(80); //精确延时 大于 480us
DQ = 1;   //拉高总线
delay(14);
x=DQ;     //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
delay(20);
}

uchar ReadOneChar(void) //读一个字节
{
uchar i=0;
uchar dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; // 给脉冲信号
dat>>=1;
DQ = 1; // 给脉冲信号
if(DQ)
dat|=0x80;
delay(4);
}
return(dat);
}

void WriteOneChar(unsigned char dat) //写一个字节
{
uchar i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
delay(5);
DQ = 1;
dat>>=1;
}
}

float ReadTemperature(void) //读取温度
{
uchar a=0,i;
uchar b=0;
int t=0;
float tt;
Init_DS18B20();
WriteOneChar(0xCC); // 跳过读序号列号的操作
WriteOneChar(0x44); // 启动温度转换
   for(i=0;i<30;i++)
      delay(10000);      //长时间延时,保证转换完成
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
a=ReadOneChar();
b=ReadOneChar();
t=b;
t<<=8;
t=t|a;
tt=t*0.0625;
return(tt);
}

void init_serial()    //初始化串口
{
   TMOD=0x20;    //定时器T1使用工作方式2
   TH1=250;     //设置初值
   TH0=250;
   TR1=1;      //开始计时
   PCON=0x80;     //SMOD=1;
   SCON=0x50;     //工作方式1,波特率9600bit/s,允许接收
   TI=1;
}


void main()
{
    float tem;
int Tem;
uchar date[5],i;
uchar recFlag=1;
init_serial();
IE=0; //屏蔽中断
    Init_DS18B20();
    while(1)
{
    tem=ReadTemperature();
    Tem=tem;
    date[0]=0x30+(Tem/100); //百位
    date[1]=0x30+((Tem%100)/10); //十位
    date[2]=0x30+(Tem%10);   //个位
    date[3]=0x2e;               //小数点
    Tem=tem*10;
    date[4]=0x30+Tem%10; //小数部分第一位
    i=0;
    while(i<5)
    {
        if(TI==1)
     {
        SBUF=date[i];
     TI=0;
     i++;
     }
    }
}
  
}

阅读(720) | 评论(0) | 转发(0) |
0

上一篇:uCOS-Ⅱ简介

下一篇:4*4键盘扫描测试程序

给主人留下些什么吧!~~