历史上的今天
返回首页

历史上的今天

今天是:2025年06月20日(星期五)

正在发生

2018年06月20日 | STC15系列读取DS18B20温度传感器串口显示代码

2018-06-20 来源:eefocus

STC15系列读取DS18B20温度传感器串口显示代码 
调试通过,复制粘贴即编译可使用,无需调试,晶振:22.1184M,串口输出,波特率:115200 
为方便大家调试,特附该程序的项目文件,下载打开即可调试,下载地址: 
http://download.csdn.net/detail/liyu3519/9873187 
stc15系列都可以直接用

//**************************

//程序说明:stc15系列采集ds18b20温度数据,并从串口输出

//采用的是22.1184M晶振,用传感器中间那个脚连接单片机的P2.0口

//**************************


#include  //调用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);

}



推荐阅读

史海拾趣

旌芯半导体(GN)公司的发展小趣事

机顶盒,全称数字视频变换盒(Set Top Box,简称STB),是连接电视机与外部信号源的关键设备。它不仅能接收来自有线电缆、卫星天线、宽带网络及地面广播的数字电视信号,还能将这些信号转换成适合电视机播放的格式,极大地丰富了电视节目的选择,提升了观看体验。

从技术层面看,机顶盒具备强大的媒体处理能力和交互功能。它能接收高清乃至4K的超高清电视节目,并通过内置的解码器将数字信号转换为电视可识别的视频和音频流,实现细腻的画面和震撼的音效。此外,机顶盒还支持数据广播、电子节目指南(EPG)、因特网接入、视频点播等多种增值服务,使电视机成为了一个互动的智能终端。

随着技术的不断进步,机顶盒正朝着高清化、智能化方向发展。智能化技术如人工智能(AI)的集成,使机顶盒具备了语音助手、智能推荐等功能,为用户提供了更为便捷、智能的使用体验。同时,云计算和边缘计算技术的应用,也进一步提升了内容分发和管理的效率。

综上所述,机顶盒作为连接电视与外部世界的桥梁,不仅是现代家庭娱乐不可或缺的一部分,也是推动数字电视技术发展的重要力量。随着技术的持续进步和市场需求的不断增长,机顶盒的未来将更加丰富多彩,为用户提供更加优质、便捷的观影体验。

Captive Fastener公司的发展小趣事

随着环保意识的日益增强,Captive Fastener公司积极响应国家环保政策,推动生产方式的绿色转型。公司引进先进的环保生产设备和技术,减少生产过程中的污染排放。同时,公司还研发出可回收再利用的紧固件产品,为电子行业的可持续发展做出了贡献。

Hokuriku公司的发展小趣事

90年代初期,随着全球化进程的加速,Hokuriku Electric开始将目光投向国际市场。公司首先在欧洲和北美设立了销售分支机构,随后又逐步拓展至亚洲其他地区。通过参加国际展会、建立合作伙伴关系等多种方式,Hokuriku Electric成功将其优质产品推向全球市场。这一过程中,公司不仅积累了丰富的国际销售经验,还提升了品牌知名度和影响力,为后续的全球化发展奠定了坚实基础。

常州能动(ENDRIVE)公司的发展小趣事

随着环保意识的日益增强,常州能动积极响应国家政策,加大环保投入。公司引进了先进的环保设备和技术,对生产过程中的废弃物进行无害化处理。同时,公司还注重节能减排和资源循环利用,推动公司向绿色、低碳、可持续发展的方向迈进。这些努力不仅提升了公司的社会形象,也为公司的长远发展打下了坚实基础。

Hpc Technology Inc公司的发展小趣事

随着产品的不断成熟,常州能动开始积极拓展市场。公司参加各类电子展会,与国际知名企业建立合作关系,不断提升品牌影响力。同时,公司还加大了对市场营销的投入,通过广告、公关等手段提升品牌知名度。这些努力使得常州能动逐渐在电子行业中崭露头角,成为了一家备受瞩目的企业。

芯旺微电子(ChipON)公司的发展小趣事

在汽车电子领域,AEC-Q100品质认证是衡量MCU产品质量的重要标准。芯旺微电子通过不懈的努力和技术创新,成功研发出满足AEC-Q100品质认证的MCU产品,并广泛应用于汽车前装市场。这一突破不仅证明了芯旺微电子的技术实力,也为其赢得了国内外众多知名汽车厂商的信赖和合作。

问答坊 | AI 解惑

关于编程器测试集成块的问题

我想问下像top853,TOP2007等这些编程器写的支持器件有很多型号,如____RAM-WINBOND W2465, W24128, W24257A, W24257AC, W24M257, 等等,那么我现在有个集成块型号是W24257S-70LL,我想测试下我手里的几百个这个是不是好的能不能测试?W24257S-70LL ...…

查看全部问答>

模拟串口的问题

接收的脚是LPC2136 ARM的2脚,此脚需要模拟接收。波特率9600,时钟:14.745600M。 我用定时器0定了两个值:第一:T0MR1=14745600/9600,这个用于定时接收数据位.第二:T0MR0=14745600/(9600*2) 这个用于起始位的定时检测。2脚设置为捕获输入, ...…

查看全部问答>

如何从串口输入中文?急

访问服务器,用telnet方式,在vi编辑器下能进行中文输入,但是用串口连接访问时在vi编辑器下,输入中文时变成一个一个的点:如:“........”串口输出中文没有问题,请教能否让串口输入中文?…

查看全部问答>

请教

请问海信HDP3406M数字高清电视高压包ABL脚打火是何故障?…

查看全部问答>

求救,PB内核定制问题

我在PB下定制CE内核的时候,出现如下错误: Failed to find a range for data of size 1370072 Error: Ran out of space in ROM for Profile section size 1370072Fatal error hit, exiting... makeimg: FATAL ERROR: Command returned non-zer ...…

查看全部问答>

请问lm3s8962每个管脚宽度是多少mil

请问lm3s8962每个管脚宽度是多少mil,…

查看全部问答>

想申请MSP430做个浇花器

本人今年大四,爱好养花,怎奈何寒假花多无人照顾,所以设计了一个浇花器。考虑到430的超低功耗~决定采用TI强大的430做个小浇花器,一个月之内帮我浇浇水~希望430可以圆满完成^^…

查看全部问答>

LM3S811学习体会—LED-USART-TIMER-GPIOINT

上例程,本例程主要包括:1.LED 2.USART 3.TIMER0溢出中断 4.GPIO端口中断    1.LED  主要实现六个小灯的轮流闪烁    2.USART 主要是为了能够输出 以便于以后调试(这里调用了UARTprintf函数)    3.TIMER0 ...…

查看全部问答>

如何用FPGA测量一个脉冲的宽度

使用FPGA测量外部脉冲的宽度,FPGA的主频一定,可以分频,但是不能提高频率。但是外部脉冲的宽度可能大于FPGA主频的时钟周期,但是也可能小于这个周期。需要测量脉冲的宽度,求教前辈们如何实现?…

查看全部问答>