蓝桥杯DS18B20数字温度传感器范例代码(芯片型号:IAP15F2K61S2)

原创代码:转载请注明转载URL和作者。

本人几年前参加蓝桥杯单片机本科组拿了一个小奖,但是由于对单片机得爱好兴趣不是很大,所以毅然决然决定学习JAVA,所以以前写的一些单片机例子程序也分享出来给大家参考:

头文件代码ONEWIRE.H:(代码很简单,如果需要解释得同学们请留言,我还有很多其他模块的例子代码和学习资料可以给大家参考)

#ifndef _ONEWIRE_H
#define _ONEWIRE_H

#include "reg52.h"

#define OW_SKIP_ROM 0xcc
#define DS18B20_CONVERT 0x44
#define DS18B20_READ 0xbe

//IC引脚定义
sbit DQ = P1^4;

//函数声明
void Delay_OneWire(unsigned int t);
void Write_DS18B20(unsigned char dat);
bit Init_DS18B20(void);
unsigned char Read_DS18B20(void);

#endif

驱动文件代码onewire.c:

#include "onewire.h"

//单总线延时函数
void Delay_OneWire(unsigned int t)

    unsigned char i;
      while(t--)
    {
        for(i=0;i<12;i++);
    }
}

//DS18B20芯片初始化
bit Init_DS18B20(void)
{
    bit initflag = 0;
    DQ = 1;
    Delay_OneWire(12);
    DQ = 0;
    Delay_OneWire(80); 
    DQ = 1;
    Delay_OneWire(10); 
    initflag = DQ;    
    Delay_OneWire(5);
  
    return initflag;
}

//通过单总线向DS18B20写一个字节
void Write_DS18B20(unsigned char dat)
{
    unsigned char i;
    for(i=0;i<8;i++)
    {
        DQ = 0;                                    //DQ置为0
        DQ = dat&0x01;                            //检测要写的位数是0还是1
        Delay_OneWire(5);                        //大于15us即可开始采样,0就是0,1就是1,传送过去,写1的话电阻自动拉高
        DQ = 1;                                    //DQ置高为初始状态
        dat >>= 1;
    }
    Delay_OneWire(5);
}

//从DS18B20读取一个字节
unsigned char Read_DS18B20(void)
{
    unsigned char i;
    unsigned char dat;
  
    for(i=0;i<8;i++)
    {
        DQ = 0;
        dat >>= 1;                    //读0几乎可以忽略不计,读1大于1us就行,电平拉上去之后就等着控制器采样,即DQ反馈回来的值
        DQ = 1;
        if(DQ)                        //DQ反馈回来的值分析
        {
            dat |= 0x80;
        }        
        Delay_OneWire(5);
    }
    return dat;
}

主函数代码:

#include
#include
typedef unsigned char uchar;
typedef unsigned int uint;
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf,0xc6};    //sub=11  -   sub=12    c
uchar disbuff[]={10,10,10,10,10,10,10,10};
uchar discom,temp;
unsigned char temperature_process();
void init_timer0();
void temperature_display();

void main()
{        
    init_timer0();
     while(1)
     {     
         temp=temperature_process();
     }
}

void init_timer0()  
{  
    TMOD|=0x01;  
    TH0=(65536-1000)/256;  
    TL0=(65536-1000)%256;  
    EA=1;  
    ET0=1;  
    TR0=1;  
}
void timer0()interrupt 1     
{  

    TH0=(65536-1000)/256;  
    TL0=(65536-1000)%256;
    temperature_display();
}
unsigned char temperature_process()
{
    uchar low,high,temperature;
    init_ds18b20();
    Write_DS18B20(OW_SKIP_ROM);
    Write_DS18B20(DS18B20_CONVERT);
    Delay_OneWire(200);

    init_ds18b20();
    Write_DS18B20(OW_SKIP_ROM);
    Write_DS18B20(DS18B20_READ);
    
    
    low=Read_DS18B20();
    high=Read_DS18B20();
    
    temperature=(high<<4);
    temperature|=(low>>4);
    return temperature;
}
void temperature_display()  
{  
    
    disbuff[6]=temp%10;
    disbuff[7]=12;
    disbuff[5]=temp/10;
    disbuff[4]=10;
    disbuff[3]=10;
    disbuff[0]=11;
    disbuff[1]=4;
    disbuff[2]=11;

    P2=(P2&0x1f)|0xe0;  
    P0=0xff;  
    P2&=0x1f;
      
    P2=(P2&0x1f)|0xc0;  
    P0=1<     P2&=0x1f; 
     
    P2=(P2&0x1f)|0xe0;  
    P0=table[disbuff[discom]];  
    P2&=0x1f;  
    if(++discom==8)discom=0;  
      

这是CT107D实训台蓝桥杯的DS18B20数字温度传感器代码,如果有需要的小伙伴需要其他模块的代码可以私聊我,我会尽快写出其他几个模块的博客的。

你可能感兴趣的:(单片机开发)