⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ds18b20.txt

📁 温度传感器ds18b20
💻 TXT
字号:
//========================================================
//    工程名称:    DS18B20
//    功能描述:    温度传感器
//    涉及的库:    spca061a.h
//    组成文件:    main.c
//    硬件连接:    IOA15S18B20的DQ脚
//                                                     IOB0-IO7EDa-h段位;IOB8-IOB13:位选。个位、十位、小数
//     标准化:             2007.4.19
//     Done by:         Doublears
//========================================================

#include "spce061a.h"

#define DQ *P_IOA_Data             //定义A口味DS18B20的DQ位

//     全局变量定义
unsigned int temp;
int table[10]={0x003f, 0x0006, 0x005b, 0x004f, 0x0066, 0x006d, 0x007d, 0x0007, 0x007f, 0x006f};
unsigned int sone,tens,point;

//     温度显示函数声明
void showtemp();

//========================================================
//    语法格式:    void delay(int t)
//    实现功能:    延时函数
//    参数:        延时时长,t*100微妙
//    返回值:    无
//========================================================
void delay(int t)
{
    unsigned int i;
    while(t--)
    {
        for (i=0;i<=70;i++)                             //when t=1                 100us
             *P_Watchdog_Clear=0x0001;
    }         
}

//========================================================
//    语法格式:    void showdelay()
//    实现功能:    延时显示函数,启动温度转换时用此延时函数,
//                                                     一延时,二在这段时间也显示温度。
//    参数:        无
//    返回值:    无
//========================================================
void showdelay()
{
    int i;
    i=35;                                                                             //延时约1s
    while(i--)
        showtemp();     
}

//========================================================
//    语法格式:    void TxReset(void)
//    实现功能:     产生复位脉冲 初始化DS18B20
//    参数:        无
//    返回值:    无
//========================================================
void TxReset(void)
{
    unsigned int i;
    
    *P_IOA_Dir=0xffff;                                                                             //置A为输出端
    
    DQ=0x0000;
    delay(8);                                                                                                                 //拉低约900微秒
    DQ=0x8000;                                                                                                                 
    i=30;                                                                                                                                 //延时30微秒
    while (i--);
}


//========================================================
//    语法格式:    void RxWait(void)
//    实现功能:     等待应答脉冲
//    参数:        无
//    返回值:    无
//========================================================
void RxWait(void)
{
    unsigned int i;
    
    *P_IOA_Dir=0x0000;
    
    while((DQ&0x8000)==0x8000);                 
    while((DQ&0x8000)==0x0000);                         //等待应答脉冲

    i=4;
    while (i--);
}

//========================================================
//    语法格式:    unsigned int RbBit(void)
//    实现功能:     读取数据的一位,满足读时时隙要求
//    参数:        无
//    返回值:    b:读时隙后读取数据的一位(0或1),0x000b
//========================================================
unsigned int RbBit(void)
{
    unsigned int i,b;
    
    *P_IOA_Dir=0xffff;         //置A口为输出口
    
    DQ=0x0000;
    i++;
    i++;
    i++;
    i++;                                                             //拉低后延时1us,然后释放总线
    DQ=0x8000;
    
    *P_IOA_Dir=0x0000;         //置A口为输入口,接受数据
             
             i=10;                                                         
             while(i--);
             
    b=(DQ&0x8000)>>15;             //15us内读数据 
    
    i=60;
    while (i--);     //延时60us

    return(b);
    
}

//========================================================
//    语法格式:    unsigned int RbByte(void)
//    实现功能:     读取数字的两个字节
//    参数:        无
//    返回值:    从暂存器读取16位温度值
//========================================================
unsigned int RbByte(void)
{
    unsigned int i,j,b;
    b=0;
    for (i=1;i<=16;i++)
    {
        j=RbBit();
        b=(j<<15)|(b>>1);    
    }
    return (b);
}

//========================================================
//    语法格式:    void WrByte(unsigned int b)
//    实现功能:     写数据的一个字节
//    参数:        DS18B20的一字节操作命令
//    返回值:    无
//========================================================
void WrByte(unsigned int b)
{
    unsigned int     i,j,btmp;
    for (j=1;j<=8;j++)
    {
        btmp=b&0x0001;
        b=b>>1;
                             *P_IOA_Dir=0xffff;                                                         //置A口为出入口
        if (btmp==0x0001)
        {
            //写1
            DQ=0x0000;                                                                 //拉低15us
            
            i=13;
            while(i--);
            
            DQ=0x8000;                                                                 //15us内必须将总线了拉高
            i=55;
            while (i--);
            i++;
            i++;
        }
        else
        {
             //写0
             DQ=0x0000;
             i=64;
             while (i--);
             DQ=0x8000;
             i++;
             i++;
        }
    }
}

//========================================================
//    语法格式:    void convert(void)
//    实现功能:     启动温度转换
//    参数:        无
//    返回值:    无
//========================================================
void convert(void)
{
    TxReset();                                                                         //初始化
    RxWait();                                                                             //应答脉冲
    delay(10);
    WrByte(0x00cc);                                                     //skip rom命令
    WrByte(0x0044);                                                     //温度转换
    *P_Watchdog_Clear=0x0001;
}

//========================================================
//    语法格式:    void RdTemp(void)
//    实现功能:     读取温度值,将温度值赋予temp
//    参数:        无
//    返回值:    无
//========================================================
void RdTemp(void)
{
    TxReset();                                                             //初始化
    RxWait();                                                                 //应答脉冲
    delay(10);
    WrByte(0x00cc);                                         //skip rom命令
    WrByte(0x00be);                                         //读暂存器温度
    temp=RbByte();                                             //读取温度
}

//========================================================
//    语法格式:    void showtemp()
//    实现功能:     温度显示函数,通过三位LED
//    参数:        无
//    返回值:    无
//========================================================
void showtemp()
{
    *P_IOB_Data=table[tens]+0xfe00;                                     //显示十位
    delay(50);
    *P_IOB_Data=table[sone]+0xfd00;                                     //显示个位
    delay(50);
    *P_IOB_Data=table[point]+0xfb00;                                 //显示小数
    delay(50);
    *P_IOB_Data=0xffff;
}

//========================================================
//    语法格式:    void main()
//    实现功能:     主函数
//    参数:        无
//    返回值:    无
//========================================================
void main()
{
    unsigned int i;
    
    *P_IOA_Dir=0x0000;                     //初始化端口,先定义A口为悬浮式输入端,以后须设置输出口时,只需将Dir改变即可
    *P_IOA_Attrib=0xffff;
    *P_IOA_Data=0x0000;
    *P_IOB_Dir=0xffff;                     //B口味带数据缓存的输出端
    *P_IOB_Attrib=0xffff;
    *P_IOB_Data=0x0000;
    
    *P_SystemClock=0x0040;         //设置系统时钟,Focs选择32.768MHz,CPUCLOCK选择Focs
    
    while(1)
    {
        delay(10);
        convert();                                         //启动温度转换
        showdelay();                                 //延时750ms以上
        RdTemp();                                             //读取温度值
        
        tens=((temp&0xfff0)>>4)/10;                     //取十位
        sone=((temp&0xfff0)>>4)%10;                     //取个位
        i=(temp&0x000f)*0.625;                                         
        point=(int) i;                                                                         //取小数点后第一位
        if (((int) (i*10))%10>=5 )                         //取小数点后第二位,四舍五入
            point++;
        
        showtemp();                                             //显示温度
        showtemp();
        showtemp();
        showtemp();
        showtemp();
        *P_Watchdog_Clear=0x0001;         //清狗
    }

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -