找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2032|回复: 0
收起左侧

ds18b20测试程序

[复制链接]
ID:150754 发表于 2016-11-28 15:19 | 显示全部楼层 |阅读模式
#include<reg51.h>
#include"nrf24l10out.h"

int t;

uint num;

uchar dat; //读写数据变量

uchar a=0;

uchar b=0;

sbit DQ=P1^6;

float tep=0; //读一个温度时的温度转换中间间

uchar data tempbuf[4]=0;//温度字型显示中间变量

uchar tt[]={"444"};

/******************************************************

函数名称:delay(uint num)

返回值:无
参数:uint num
延时数据值
作用:延时

*******************************************************/

void delay(uint num)           // 微秒级

{

while(num--);

}

/******************************************************

函数名称:void Init_DS18B20(void)

返回值:无                                       

参数:无

作用:初始化18B20

*******************************************************/

void Init_DS18B20(void)

{

char x=0;

DQ=1;
delay(10);//稍作延时
DQ=0;
delay(80);//延时>480us 540us
DQ=1; //拉高总线 15-60us
delay(20);
x=DQ;//读总线状态 为0复位成功,为1则不成功
delay(30);
DQ=1;//释放总线
}
/******************************************************
函数名称:uchar ReadOneChar(void)
返回值:uchar dat
参数: 无
作用:读取1820一个字节
*******************************************************/
uchar ReadOneChar(void)
{
uchar i;
uchar dat=0;
for(i=0;i<8;i++)
{
DQ=0;
dat>>=1;
DQ=1;//给脉冲
if(DQ)
{dat|=0x80;}//读1 /// 读0右移处理
delay(8);//15us内读完一个数
}
return(dat);
}
/******************************************************
函数名称:void WriteOneChar(uchar dat)
返回值:无
参数: uchar dat
作用:向1820写一个字节
*******************************************************/
/////****写DS18B20***/
//写0 60us读完,写1 30us 内读完

void WriteOneChar(uchar dat)
{
uchar i=0;
for(i=0;i<8;i++)
{
DQ=0;
DQ=dat&0x01;//写所给数据最低位
delay(10);
///////////
DQ=1;//给脉冲
dat>>=1;
}
delay(8);
}
/******************************************************
函数名称:int ReadOneTemperature(void)
返回值:int t
参数: 无
作用:读温度值
*******************************************************/
int ReadOneTemperature(void)
////////***读取温度值***********/
//// 每次读写均要先复位
{
Init_DS18B20();
WriteOneChar(0xcc);//发跳过ROM命令
WriteOneChar(0x44);//发读开始转换命令
Init_DS18B20();
WriteOneChar(0xcc);//发跳过ROM命令
WriteOneChar(0xbe);//读寄存器,共九字节,前两字节为转换值
a=ReadOneChar(); //a存低字节
b=ReadOneChar(); //b存高字节
t=b;
t<<=8;//高字节转换为10进制
t=t|a;
tep=t*0.0625;//转换精度为0.0625/LSB
t=tep*10+0.5;//保留1位小数并四舍五入****后面除10还原正确温度值)
return(t);
}
/******************************************************
函数名称:uint Temperaturepro(void)
返回值:void
参数: void
作用:温度处理
*******************************************************/
void Temperaturepro(void)
{
int temp;
temp=ReadOneTemperature();
tempbuf[3]=temp/1000;//百位
tempbuf[2]=temp/100%10;//十位
tempbuf[1]=temp%100/10; //个位
tempbuf[0]=temp%10; //小数
}
void initUart(void)
{
        TMOD|=0x20;// 初始化定时器1为8位自动重装模式
        SCON=0x50;// 配置串口工作模式,使能了串口接收中断
        TH1=0xfd;// 配置波特率
        TL1=0xfd;
        TR1=1;// 启动定时器1
        ES=1;// 打开串口中断允许
        TI=1;
}


void main()
{

        int temp;
//        uchar str[4]="1234";
        init_io();
//        initUart();
        while(1)
        {
                temp=ReadOneTemperature();         //获取温度值               
                tempbuf[3]=temp/1000;//百位
                tempbuf[0]=temp/100%10;//十位
                tempbuf[1]=temp%100/10; //个位
                tempbuf[2]=temp%10; //小数
                //printf("sfkjsfks\n");
               
}

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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