STC15F2K60S2读取DS18B20温度串口显示

为方便大家调试,特附该程序的项目下载地址
STC15F2K60S2读取DS18B20温度实例下载地址
这里写图片描述

//**************************
//程序说明:stc15f2k60s2采集ds18b20温度数据,并从串口输出
//为方便大家调试,特附该程序的项目下载地址:
//采用的是22.1184M晶振
//**************************

#include<stc15fxxxx.h>  //调用stc15f系列头文件,下载地址:  http://pan.baidu.com/s/1eRUbjLS

//IO口声明

#define ds18b20_io P20   //P2.0口作为数据读取接口

//常量声明
#define MAIN_Fosc       22118400L       //主时钟
#define baud_rate       115200L         //波特率
#define Timer1_Reload   (65536UL -(MAIN_Fosc / 4 / baud_rate))      //Timer1重装值

//变量定义

u16 datas=0;//测试用


//函数声明

void  Delay3us();                                   //22.1184M晶振精确延时30微秒
void  Delay6us();                                   //22.1184M晶振精确延时30微秒
void  Delay24us();                              //22.1184M晶振精确延时40微秒
void  Delay30us();                              //22.1184M晶振精确延时40微秒
void  Delay300us();                             //22.1184M晶振精确延时40微秒
void  Delay600us();                             //22.1184M晶振精确延时30毫秒
void    Delay1000ms();                          //22.1184M晶振精确延时1000毫秒

bit  ds18b20_init();                                //初始化ds18b20
u8   ds18b20_read_one_char();               //从ds18b20读取一个字节
void ds18b20_write_one_char(u8 dat);//向ds18b20写入一个字节
void ds18b20_ready_read_temp();         //准备读取数据
u16  ds18b20_read_temp_val();               //读取数据,返回温度值,返回实际值的100倍,且万位为符号位,例:12556为-25.56度,2556为25.56度

void    serial_init();                          //串口初始化
void    serial_send_byte(u8 dat);       //串口发送一个字节的数据
void    serial_send_string(u8 *dat);//串口发送字符串

//主函数
void main()
{
    Delay1000ms();
    serial_init();//串口初始化
    ds18b20_io = 1;
    while(1)
    {
        datas=ds18b20_read_temp_val();
        serial_send_string("温度: ");
        if(datas/10000 == 1)                                            //如果万位为1,则表示温度为负
            serial_send_byte('-');                                  //输出负号
        serial_send_byte(datas%10000/1000+'0');     //十位
        serial_send_byte(datas%1000/100+'0');         //个位
        serial_send_byte('.');
        serial_send_byte(datas%100/10+'0');         //小数点后第一位
        serial_send_byte(datas%10+'0');                 //小数点后第二位
        serial_send_string("℃\r\n");
        Delay1000ms();
    }
}

//串口初始化
void serial_init()
{
    S1_8bit();              //8位数据
    S1_USE_P30P31();        //UART1 使用P30 P31口  默认
    TR1 = 0;
    AUXR &= ~0x01;     //S1 BRT Use Timer1;
    TMOD &= ~(1<<6);   //Timer1 set As Timer
    TMOD &= ~0x30;     //Timer1_16bitAutoReload;2
    AUXR |=  (1<<6);    //Timer1 set as 1T mode
    TH1 = (u8)(Timer1_Reload >> 8);
    TL1 = (u8)Timer1_Reload;
    TR1  = 1;
    PS = 1; //高优先级中断
    REN = 1;    //允许接收
    ES  = 1;    //允许中断

    EA = 1;     //允许全局中断
}


//ds18b20初始化
bit ds18b20_init()
{
    u8 init_success_tag=0;
    ds18b20_io=1;//拉高
    Delay6us();//6us
    ds18b20_io=0;//拉低
    Delay600us();//600us
    ds18b20_io=1;//拉高
    Delay30us();//30us
    init_success_tag=ds18b20_io;
    Delay600us();//600us
    return init_success_tag;
}

//读取一个字节
u8 ds18b20_read_one_char()
{
    u8 i=0;
    u8 dat=0;
    for(i=0;i<8;i++)
    {
        ds18b20_io=1;//拉高
        NOP1();
        ds18b20_io=0;//拉低
        dat>>=1;
        NOP1();
        ds18b20_io=1;//拉高
        Delay6us();//6us
        if(ds18b20_io==1)
            dat|=0x80;
        else
            dat|=0x00;
        Delay24us();//24us
    }
    return (dat);
}

//向传感器写入一个字节
void ds18b20_write_one_char(u8 dat)
{
    u8 i=0;
    for(i=0;i<8;i++)
    {
        ds18b20_io=1;//拉高
        NOP1();
        ds18b20_io=0;//拉低
        ds18b20_io=dat&0x01;
        Delay30us();//30us
        ds18b20_io=1;//拉高
        Delay3us();//3us
        dat>>=1;
    }
    Delay6us();
    Delay6us();//12us
}

//准备读取一个温度值
void ds18b20_ready_read_temp()
{
    ds18b20_init();                          //初始化
    ds18b20_write_one_char(0xcc);//忽略读序列号
    ds18b20_write_one_char(0x44);//启动温度转换
    Delay300us();                                   //300us,等待转换完毕
    ds18b20_init();                          //初始化
    ds18b20_write_one_char(0xcc);//忽略读序列号
    ds18b20_write_one_char(0xbe);//读取温度寄存器
}

//读取数据,返回温度值,返回实际值的100倍,且万位为符号位,例:12556
u16 ds18b20_read_temp_val()
{
    u16 temp_16_bit=0;
    u8  temp_L=0;
    u8  temp_H=0;
    ds18b20_ready_read_temp();
    temp_L=ds18b20_read_one_char();//读取温度低八位
    temp_H=ds18b20_read_one_char();//读取温度高八位
    if(temp_H>0x7f)
    {
        temp_L=~temp_L;                    //补码转换,取反加一
        temp_H=~temp_H+1;  
        temp_16_bit=100;
    }
    temp_16_bit=temp_16_bit+temp_H*16+temp_L/16;
    temp_16_bit=temp_16_bit*100;
    temp_16_bit=temp_16_bit+((temp_L&0x0f)*10/16)*10;
    temp_16_bit=temp_16_bit+(temp_L&0x0f)*100/16%10;
    return (u16)(temp_16_bit);
}

//串口发送一个字节数据
void serial_send_byte(u8 dat)
{
    SBUF=dat;
    while(!TI);
    TI=0;
}

//串口发送一串字符串
void serial_send_string(u8 *dat)
{
    while(*dat)
    {
        serial_send_byte(*dat++);
    }
}

/********************* 串口1中断函数************************/
void UART1_int (void) interrupt UART1_VECTOR
{
    if(RI)
    {
        RI = 0;
    }

    if(TI)
    {
    }
}

void Delay3us()     //@22.1184MHz
{
    unsigned char i;

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

void Delay6us()     //@22.1184MHz
{
    unsigned char i;

    _nop_();
    _nop_();
    _nop_();
    i = 30;
    while (--i);
}

void Delay24us()        //@22.1184MHz
{
    unsigned char i, j;

    _nop_();
    _nop_();
    _nop_();
    i = 1;
    j = 128;
    do
    {
        while (--j);
    } while (--i);
}

void Delay30us()        //@22.1184MHz
{
    unsigned char i, j;

    i = 1;
    j = 162;
    do
    {
        while (--j);
    } while (--i);
}

void Delay300us()       //@22.1184MHz
{
    unsigned char i, j;

    i = 7;
    j = 113;
    do
    {
        while (--j);
    } while (--i);
}

void Delay600us()       //@22.1184MHz
{
    unsigned char i, j;

    _nop_();
    _nop_();
    _nop_();
    i = 13;
    j = 229;
    do
    {
        while (--j);
    } while (--i);
}

void Delay1000ms()      //@22.1184MHz
{
    unsigned char i, j, k;

    _nop_();
    _nop_();
    i = 85;
    j = 12;
    k = 155;
    do
    {
        do
        {
            while (--k);
        } while (--j);
    } while (--i);
}




  • 5
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,这是一个关于STC15F2K60S2单片机使用ds18b20在1602显示显示温度的问题。下面是一个简单的程序示例,供参考: ```c #include <reg51.h> #include <intrins.h> #define DS18B20_PORT P2 #define DS18B20_DQ P2_0 #define LCD_RS P0_0 #define LCD_RW P0_1 #define LCD_E P0_2 #define LCD_DAT P0 unsigned char code LCD_INIT_TBL[] = {0x38, 0x0c, 0x06, 0x01, 0x80}; unsigned char code DS18B20_SKIP_ROM[] = {0xcc, 0x44}; unsigned char code DS18B20_READ_SCRATCHPAD[] = {0xcc, 0xbe}; void lcd_init(); void lcd_clear(); void lcd_write_cmd(unsigned char cmd); void lcd_write_data(unsigned char dat); void lcd_write_str(unsigned char *str); void delay_ms(unsigned int t); void ds18b20_reset(); void ds18b20_write_byte(unsigned char dat); unsigned char ds18b20_read_byte(); int ds18b20_read_temp(); void main() { unsigned int temp; lcd_init(); lcd_write_str("Temperature:"); while (1) { temp = ds18b20_read_temp(); lcd_write_cmd(0x80 + 0x0c); lcd_write_data(temp / 10 + '0'); lcd_write_data(temp % 10 + '0'); lcd_write_data('C'); delay_ms(1000); } } void lcd_init() { unsigned char i; LCD_DAT = 0x00; LCD_RW = 0; LCD_RS = 0; LCD_E = 0; delay_ms(15); for (i = 0; i < sizeof(LCD_INIT_TBL); i++) { lcd_write_cmd(LCD_INIT_TBL[i]); } } void lcd_clear() { lcd_write_cmd(0x01); delay_ms(2); } void lcd_write_cmd(unsigned char cmd) { LCD_DAT = cmd; LCD_RW = 0; LCD_RS = 0; LCD_E = 1; _nop_(); _nop_(); LCD_E = 0; delay_ms(2); } void lcd_write_data(unsigned char dat) { LCD_DAT = dat; LCD_RW = 0; LCD_RS = 1; LCD_E = 1; _nop_(); _nop_(); LCD_E = 0; delay_ms(2); } void lcd_write_str(unsigned char *str) { while (*str) { lcd_write_data(*str++); } } void delay_ms(unsigned int t) { unsigned int i, j; for (i = 0; i < t; i++) { for (j = 0; j < 110; j++); } } void ds18b20_reset() { DS18B20_DQ = 1; _nop_(); DS18B20_DQ = 0; delay_ms(20); DS18B20_DQ = 1; delay_ms(20); } void ds18b20_write_byte(unsigned char dat) { unsigned char i; for (i = 0; i < 8; i++) { DS18B20_DQ = 0; _nop_(); DS18B20_DQ = dat & 0x01; delay_ms(2); DS18B20_DQ = 1; dat >>= 1; } } unsigned char ds18b20_read_byte() { unsigned char i, dat = 0; for (i = 0; i < 8; i++) { DS18B20_DQ = 0; _nop_(); DS18B20_DQ = 1; _nop_(); dat |= DS18B20_DQ << i; delay_ms(2); } return dat; } int ds18b20_read_temp() { unsigned char high, low; int temp; ds18b20_reset(); ds18b20_write_byte(DS18B20_SKIP_ROM[0]); ds18b20_write_byte(DS18B20_SKIP_ROM[1]); ds18b20_write_byte(DS18B20_READ_SCRATCHPAD[0]); ds18b20_write_byte(DS18B20_READ_SCRATCHPAD[1]); low = ds18b20_read_byte(); high = ds18b20_read_byte(); temp = high; temp <<= 8; temp |= low; temp *= 625; temp /= 100; return temp; } ``` 这个程序使用的是STC15F2K60S2单片机,通过DS18B20温度传感器读取温度值,并在1602液晶显示屏上显示出来。程序中涉及到了LCD1602显示屏和DS18B20温度传感器的读写操作,需要根据具体的硬件连接进行修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值