DS18B20学习

 

DS18B20学习

 

DS18B20学习

 

DS18B20学习

DS18B20

#include <reg52.h>
#include <intrins.h>
typedef unsigned char u8;
typedef unsigned int u16;

sbit IO_18b20 = P3^7;

void delay(u16 i)
{
    while(i--);
}

bit Init_18b20()     //18b20初始化
{
    bit ack ;
    EA = 0;
    IO_18b20 = 0;
    delay(50);
    IO_18b20 = 1;
    delay(6);
    ack = IO_18b20;
    while(!IO_18b20);    //等待18b20释放总线
    EA = 1 ;

    return ack ;
}

void write18b20(u8 dat)
{
    u8 i;
    EA = 0;
    for(i=0;i<8;i++)
    {
        IO_18b20 = 0;
        _nop_();
        _nop_();
        IO_18b20 = dat&0x01;
        delay(6);
        IO_18b20 = 1;
        dat >>= 1;
    }
    EA = 1;
}

u8 read18b20()
{
     u8 mask;
     u8 dat;
     EA = 0;
     for(mask = 0x01;mask != 0;mask<<=1)
     {
          IO_18b20 = 0;
        _nop_();
        _nop_();
        IO_18b20 = 1;
        _nop_();
        _nop_();
        if(!IO_18b20)
            dat &= ~mask;
        else
            dat |= mask;
        delay(6);
     }
     EA = 1;

     return dat;
}

void Start18b20()
{
    bit ack;
    ack = Init_18b20();
    if(ack == 0)
    {
        write18b20(0xcc);     //跳过ROM操作命令
        write18b20(0x44);     //温度转换命令
    }
}

void DS18b20temp()
{
        bit ack;
    ack = Init_18b20();
    if(ack == 0)
    {
        write18b20(0xcc);
        write18b20(0xbe);      //发送读取温度命令
    }
}

int Get18b20temp()
{
    bit ack;
    int temp = 0;
    u8 LSB,MSB;
    ack = Init_18b20();
    if(ack == 0)
    {
        Start18b20();    //启动18b20,开始温度转化
b
        DS18b20temp();    //然后等待转换完后发送读取温度命令
        LSB = read18b20();     //读取温度值共16位,先读低字节
        MSB = read18b20();      //再读高字节
        temp = ((int)MSB<<8) + LSB;
    }
    return temp;

}

 

main

#include<reg52.h>
#define LED P0
typedef unsigned char u8;
typedef unsigned int u16;

bit Init_18b20();
void write18b20(u8 dat);
u8 read18b20();
void Start18b20();
void DS18b20temp();
int Get18b20temp();

sbit LSA = P2^2;
sbit LSB = P2^3;
sbit LSC = P2^4;

u8 code smgduan[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//显示0~9的值
u8 ledchar[8] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
u8 flag1s = 0;
u8 i = 0;

void init()
{
    TMOD = 0x01;
    TH0 = 0xff;    //fff6 = 65526
    TL0 = 0xf6;
    TR0 = 1;
    ET0 = 1;
    EA = 1;
}

void Timer0() interrupt 1
{
    static u16 cnt;
    TH0 = 0xff;
    TL0 = 0xf6;
    cnt++;
    if(cnt == 1)      //定时10us
    {
        cnt = 0;
        flag1s = 1;
    }
    LED = 0x00;
    switch(i)
    {
        case(0):LSA = 0;LSB = 0;LSC = 0;i++;LED = ledchar[0];break;
        case(1):LSA = 1;LSB = 0;LSC = 0;i++;LED = ledchar[1];break;
        case(2):LSA = 0;LSB = 1;LSC = 0;i++;LED = ledchar[2];break;
        case(3):LSA = 1;LSB = 1;LSC = 0;i++;LED = ledchar[3];break;
        case(4):LSA = 0;LSB = 0;LSC = 1;i++;LED = ledchar[4];break;
        case(5):LSA = 1;LSB = 0;LSC = 1;i++;LED = ledchar[5];break;
        case(6):LSA = 0;LSB = 1;LSC = 1;i++;LED = ledchar[6];break;
        case(7):LSA = 1;LSB = 1;LSC = 1;i=0;LED = ledchar[7];break;
        default:break;
    }
}

void datapros(int temp)
{
    float tp;
    if(temp)
    {
        ledchar[0] = 0x00;
        tp=temp;    //因为数据处理有小数点所以将温度赋给一个浮点型变量
        //如果温度是正的那么,那么正数的原码就是补码它本身
        temp=tp*0.0625*100+0.5;
        if(flag1s == 1)
        {
            flag1s = 0;
            ledchar[1] = smgduan[temp/10000];
            ledchar[2] = smgduan[temp%10000/1000];
            ledchar[3] = smgduan[temp%1000/100] | 0x80;
            ledchar[4] = smgduan[temp%100/10];
            ledchar[5] = smgduan[temp%10];
        }
    }
}

void main()
{
    init();
    while(1)
    {    
         datapros(Get18b20temp());    //数据处理函数
    }
}

 

相关文章:

  • 2021-08-18
  • 2021-04-28
  • 2021-07-16
  • 2021-05-08
  • 2021-06-21
  • 2021-04-12
  • 2021-08-02
  • 2021-09-19
猜你喜欢
  • 2022-12-23
  • 2021-12-04
  • 2022-12-23
  • 2021-11-17
  • 2021-05-21
相关资源
相似解决方案