PIC单片机(PIC16F877A)DS18B20温度传感器驱动程序

发布者:jingyan最新更新时间:2018-06-22 来源: eefocus关键字:PIC单片机  PIC16F877A  DS18B20  温度传感器 手机看文章 扫描二维码
随时随地手机看文章

#include  

#define uchar unsigned char  

#define uint unsigned int  

#define rs_h (PORTC|=0x01)  

#define rs_l (PORTC&=0xfe)  

#define rs_o (TRISC&=0xfe)  

#define rw_h (PORTC|=0x02)  

#define rw_l (PORTC&=0xfd)  

#define rw_o (TRISC&=0xfd)  

#define en_h (PORTC|=0x04)   

#define en_l (PORTC&=0xfb)  

#define en_o (TRISC&=0xfb)  

#define temp_h (PORTC|=0x08)   

#define temp_l (PORTC&=0xf7)   

#define temp_o (TRISC&=0xf7)  

#define temp_i (TRISC|=0x08)  

#define led_o (TRISC&=0xef)  

#define led_l (PORTC&=0xef)  

#define led_h (PORTC|=0x10)  

#define LCD PORTB  

uchar dat1,dat2;//保存读出的温度z  

unsigned long int dat;  

void delayms(uint x) //4M晶振下,延时1ms  

{  

    uint y,z;  

    for(y=x;y>0;y--)  

        for(z=110;z>0;z--);  

}  

void Ds18b20_reset(void)//DS18B20初始化  

{  

    uint count;  

    uchar i,flag=1;  

    temp_o;  

    temp_l;  

    for(count=60;count>0;count--);//延时480us  

    temp_i;  

    while(flag)  

    {  

        if(RC3)  

            flag=1;  

        else  

            flag=0;   

    }  

    led_o;  

    led_l;//开指示灯  

    for(count=60;count>0;count--);//延时480us  

}  

void Ds18b20_write(uchar datt)//向DS18B20写一个字节  

{  

    uchar count;  

    uchar i;  

    temp_o;  

    for(i=8;i>0;i--)  

    {  

        temp_o;  

        temp_l;  

        for(count=1;count>0;count--);  

        if(datt&0x01==0x01)  

            temp_i;  

        else  

        {     

            temp_o;  

            temp_l;  

        }  

        for(count=23;count>0;count--);//延时60us  

        temp_i;  

        for(count=1;count>0;count--);  

        datt>>=1;   

    }     

}  

uchar Ds18b20_read(void) //从DS18B20读一个字节  

{  

    uchar i,datt;  

    uchar count;  

    for(i=8;i>0;i--)  

    {  

        datt>>=1;  

        temp_o;  

        temp_l;  

        for(count=1;count>0;count--);  

        temp_i;//改为输入方向时,上拉电阻把数据线拉高,释放总线,此语句必须有,参考datasheet的P15  

        for(count=1;count>0;count--);  

        if(RC3)  

            datt|=0x80;  

        for(count=23;count>0;count--);//延时60us     

    }  

    return datt;  

}  

void lcd_com(uchar com)//向LCD1602写命令  

{  

    rs_o;  

    rw_o;  

    en_o;  

    TRISB=0x00;//配置RB为输出方向  

    rs_l;     

    rw_l;  

    LCD=com;  

    delayms(1);  

    en_h;  

    delayms(1);   

    en_l;  

    delayms(1);       

}  

void lcd_dat(uchar dat)//向LCD1602写数据  

{  

    rs_o;  

    rw_o;  

    TRISB=0x00;//配置RB为输出方向  

    en_o;  

    rs_h;     

    rw_l;  

    LCD=dat;  

    delayms(1);  

    en_h;  

    delayms(1);  

    en_l;  

    delayms(1);   

}  

void lcd_write(uchar c,uchar r,uchar dat)//向LCD1602指定行、指定列、写数据  

{  

    lcd_com(0x80+0x40*c+r);  

    lcd_dat(dat);  

    delayms(1);  

}  

void lcd_init(void)//LCD1602初始化,初始化后第一行显示temperature:,第二行显示.C  

{  

    lcd_com(0x38);  

    lcd_com(0x0c);  

    lcd_com(0x06);  

    lcd_write(0,2,0x54);  

    lcd_write(0,3,0x65);  

    lcd_write(0,4,0x6d);  

    lcd_write(0,5,0x70);  

    lcd_write(0,6,0x65);  

    lcd_write(0,7,0x72);  

    lcd_write(0,8,0x61);  

    lcd_write(0,9,0x74);  

    lcd_write(0,10,0x75);  

    lcd_write(0,11,0x72);  

    lcd_write(0,12,0x65);  

    lcd_write(0,13,0x3a);  

    lcd_write(1,11,0xdf);  

    lcd_write(1,12,0x43);  

}  

void show(void)//把温度值送LCD1602显示  

{  

    uchar flag;  

    uchar t[4];  

    uint temp;  

    if(dat2>=240)  

    {  

        dat= (~(dat2*256+dat1)+1)*(0.0625*10);//取反加一,保留一位小数  

        flag=1;  

    }  

    else  

    {  

        dat=(dat2*256+dat1)*(0.0625*10);  

        flag=0;  

    };  

    temp=dat%10;  

    t[0]=(0x30+temp);  

    temp=dat%100;  

    temp=temp/10;  

    t[1]=(0x30+temp);  

    temp=dat%1000;  

    temp=temp/100;  

    t[2]=(0x30+temp);  

    temp=dat/1000;  

    t[3]=(0x30+temp);  

    if(flag==1)//负温度显示  

    {  

        lcd_write(1,10,t[0]);  

        lcd_write(1,9,0xa5);  

        lcd_write(1,8,t[1]);  

        lcd_write(1,7,t[2]);  

        lcd_write(1,6,t[3]);  

        lcd_write(1,5,0x2d);  

    }  

    if(flag==0)//正温度显示  

    {  

        lcd_write(1,10,t[0]);  

        lcd_write(1,9,0xa5);  

        lcd_write(1,8,t[1]);  

        lcd_write(1,7,t[2]);  

        lcd_write(1,6,t[3]);  

        lcd_write(1,5,0x20);//显示空格,刷掉负号  

    }  

}  

void main(void)  

{  

    lcd_init();  

    while(1)  

    {  

        Ds18b20_reset();  

        Ds18b20_write(0xcc);  

        Ds18b20_write(0x44);//发送温度转换命令  

        delayms(1000);//延时1s,等待温度转换完成  

        Ds18b20_reset();  

        Ds18b20_write(0xcc);  

        Ds18b20_write(0xbe);//发送读温度寄存器命令  

        dat1=Ds18b20_read();  

        dat2=Ds18b20_read();  

        show();  

        led_h;//关指示灯  

        delayms(2000);  

    }  

}  

//调试总结:  

//某IO口8位未全使用时,对整个IO口读取进行位运算无效  

关键字:PIC单片机  PIC16F877A  DS18B20  温度传感器 引用地址:PIC单片机(PIC16F877A)DS18B20温度传感器驱动程序

上一篇:PIC单片机(PIC16F877A)外部中断程序
下一篇:PIC单片机(PIC16F877A)DS1302芯片程序

推荐阅读最新更新时间:2024-03-16 16:06

STM32f103 ds18b20 驱动程序移植
span style= font-family:Arial;background-color: transparent; /span 头文件 *******************************************/ #ifndef __BSP_DS18B20_H #define __BSP_DS18B20_H #include stm32f10x.h #include SysTick.h /******************************DS18B20 函数声明**************************************/ void DS18B20_GP
[单片机]
PIC单片机对LED数码管矩阵键盘显示的设计
#include #include “。./head/config.h” __CONFIG(HS&WDTDIS&LVPDIS&PWRTEN);//对熔丝位进行设置 单片机LED共阳极段码表(带小数点) 0~9 const char table1[]={0X0A,0XFA,0X8C,0XA8,0X78,0X29,0X09,0XBA,0X08,0X28,0x18,0x49,0x0f,0xc8,0x0d,0x1d}; 数码管位码表 const char table[] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; unsigned int result = 0,lastresult = 0;
[单片机]
<font color='red'>PIC单片机</font>对LED数码管矩阵键盘显示的设计
浅析基于PIC单片机的逆变电源电路设计
针对现代 电源 变频调幅的要求,提出了利用PIC16F873产生SPWM波控制IR2136触发IGBT产生PWM波作用于 逆变器 产生标准的正弦波形,从而实现变频调幅。同时利用AD模块对逆变桥输出进行采样并进行滤波处理,实现对系统的PI闭环控制。通过MATLAB中的SIMULINK组件进行仿真分析,结果表明此方案输出电压动态响应速度快,具有良好的精度控制及实时性、波形失真小、可靠性高。 随着科学技术的进步,电源质量越来越成为各种电气设备正常和良好工作的基础。电源技术领域的一个持续的研究课题即是研究作为电子信息产业命脉的电源的可靠性和稳定性。 而逆变器作为电源的核心部分,其调制技术很大程度上决定了电源输出电压的质量。目前最常用的调制
[电源管理]
浅析基于<font color='red'>PIC单片机</font>的逆变电源电路设计
艾迈斯温度传感器帮助冷库设备设计师满足严苛的误差目标
艾迈斯半导体(ams AG,瑞士股票交易所股票代码:AMS)今日推出AS6200C,这款数字温度传感器IC能够在-20°C 至 +10°C的温度范围内提供高精度的测量。 AS6200C的卓越性能使冷链存储设备中的冰箱和数据记录器设计师更容易满足苛刻的系统级精度要求。 易腐货物储存设备的运行温度范围一般在-20°C至10°C内,而AS6200C在该温度范围内的测量精度误差仅为±0.2°C。在1.8伏至3.6伏的电源电压范围内,该传感器具备稳定的精确度。 在温度控制和温度记录应用中,总误差预算由多个元件组成。通过最小化测量过程中的误差,设计师为其他误差和噪音源争取了余量,比如板装元件所产生的热量。高精确度的AS6200C
[传感器]
艾迈斯<font color='red'>温度传感器</font>帮助冷库设备设计师满足严苛的误差目标
DS18B20的使用程序PIC单片机
#include pic.h __CONFIG(0x1832); //芯片配置字,看门狗关,上电延时开,掉电检测关,低压编程关,加密,4M晶体HS振荡 #define uch unsigned char //给unsigned char起别名 uch # define DQ RA2 //定义18B20数据端口 # define DQ_DIR TRISA2 //定义18B20D口方向寄存器 # define DQ_HIGH() DQ_DIR =1 //设置数据口为输入 # define DQ_LOW() DQ = 0; D
[单片机]
温度传感器主要形式和温度探头类型
温度传感器三种主要形式为热电偶、铂电阻和热电阻 热电偶由两种不同的金属丝焊接而成,例如:NiCr-Ni(K型),利用热电效应来工作的,两种不同的金属丝,构成一个闭合回路,不同的两种导体存在着温差,两者产生电动热。因而在回路中形成一个大小的电流,此现象称之为热电现象。 铂电阻测量原理不同于热电偶测量方法。铂电阻传感器本质上来讲属于PTC热敏电阻的一种。金属的电阻率会随着温度的升高而增大,因此这种特性被用来测量温度。薄膜式铂电阻,由于结构超薄,因此在电阻不被影响的前提下,配置了一个玻璃套管,用以保护。目前通用的铂电阻的电阻值为100Ohm(0℃时),这是目前国际通用的铂电阻。另外一种PT100传感器采用绕线陶瓷式,此种方法将铂
[嵌入式]
基于AT89C51和DS18B20的最简温度测量系统
l引 言 温度的测量和控制在激光器、光纤光栅的使用及其他的工农业生产和科学研究中应用广泛。温度检测的传统方法是使用诸如热电偶、热电阻、半导体PN结之类的模拟温度传感器。信号经取样、放大后通过模数转换,再交自单片机处理。被测温度信号从温敏元件到单片机,经过众多器件,易受干扰、不易控制且精度不高。因此,本文介绍一种新型的可编程温度传感器DS18B20,他能代替模拟温度传感器和信号处理电路,直接与单片机沟通,完成温度采集和数据处理。DS18B20与AT89C51结合实现最简温度检测系统,该系统结构简单,抗干扰能力强,适合于恶劣环境下进行现场温度测量,有广泛的应用前景。 2温度测量系统硬件 系统结构图如图1所示 。这里通过上拉电阻直
[应用]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved