历史上的今天
返回首页

历史上的今天

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

正在发生

2018年06月20日 | STC15F2K60S2读取DS18B20温度串口显示

2018-06-20 来源:eefocus

这里写图片描述

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

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

//为方便大家调试,特附该程序的项目下载地址:

//采用的是22.1184M晶振

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


#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);

}


推荐阅读

史海拾趣

智浦欣(Chipstar)公司的发展小趣事

在2010年4月的上海张江高科技园区,一群志同道合的工程师和创业者聚集在一起,共同创立了上海智浦欣微电子有限公司。他们怀揣着对模拟及数模混合IC技术的深厚理解和热爱,立志要在消费类电子市场占据一席之地。起初,公司面临着资金紧张、技术挑战和市场压力等多重困难,但团队成员凭借对技术的执着和对市场的敏锐洞察,逐步攻克难题,研发出了几款性能优越的音频放大器和电源管理产品,为公司赢得了初步的市场认可。

Bussmann (Eaton)公司的发展小趣事

随着电子技术的快速发展,对电路保护的要求也越来越高。为了满足市场需求,Bussmann于1992年开始研发芯片保险丝。这款新型保险丝将可熔性材料沉降到陶瓷基底上,具有体积小、安装方便等优点,能够广泛应用于印刷电路板等电子设备中。芯片保险丝的推出不仅进一步提升了Bussmann的技术实力,也为其在电子行业打开了新的市场空间。

法思特(FAST)公司的发展小趣事
避免同时启动带来的电流冲击和电压波动对设备造成的损害,从而延长设备的使用寿命。
Bipolarics Inc公司的发展小趣事

在快速发展的过程中,Bipolarics Inc始终重视人才培养和团队建设。公司注重从高校和研究机构引进优秀人才,同时加强内部员工的培训和晋升机制。通过打造一支高效、专业的团队,Bipolarics Inc在技术研发、市场营销等方面取得了显著成绩。此外,公司还积极营造良好的企业文化氛围,激发员工的创新精神和团队凝聚力。

Advanced Microelectronic Products Inc公司的发展小趣事

AMP公司深知人才是企业发展的核心动力。因此,公司高度重视人才培养和团队建设。公司建立了一套完善的人才培养机制,通过内部培训、外部引进等方式,不断提升员工的专业技能和综合素质。同时,公司还注重团队建设,鼓励员工之间的合作与交流,营造积极向上的工作氛围。这些举措为AMP公司的持续发展提供了有力的人才保障。

Fillfactory Nv公司的发展小趣事

2015年,FIDELIX迎来了一个重要的转折点。在这一年,东芯半导体有限公司(以下简称“东芯半导体”)正式收购了FIDELIX 25.3%的股权,成为其第一大股东及实际控制人。这一收购标志着FIDELIX开始进入一个新的发展阶段。

通过与东芯半导体的合作,FIDELIX获得了更多的资金支持和市场资源。东芯半导体是一家专注于中小容量存储芯片研发、设计和销售的中国企业,在半导体领域拥有丰富的经验和资源。双方的合作不仅为FIDELIX带来了更多的发展机会,同时也加速了FIDELIX在国际市场上的扩张步伐。

在上述两个故事的基础上,可以根据FIDELIX公司的具体发展历程、重要事件、技术创新、市场策略等方面进行进一步的拓展和补充,以形成完整、详细的故事内容。

问答坊 | AI 解惑

单片机的片内寄存器如何使用

这是个AD转换器 本来是信号经运放放大后接入AD的差分输入端 但是片内有可编程放大器(1-128倍) 我却不知道如何对AD片内的寄存器编程 有谁用过么?…

查看全部问答>

模拟电路版块又有了一位新版主

今天早上发现我们模拟版块又多了一位新版主ttianjiao,欢迎啊!…

查看全部问答>

加载驱动DLL

奇怪了,请问各位 我在CE的工程文件夹Release中修改platform.reg和platform.bib 然后make image 来向内核添加DLL驱动 之后在CE系统下的注册表编辑器中查看buildIn 发现已经添加成功 但是为什么驱动不能打开呢?…

查看全部问答>

关于MicrosoftActiveSync 同步文件夹

大家好,MicrosoftActiveSync 我设置文件同步后,我的桌面会有“WM_Administrat My Documents”这个文件, 可是,我电脑重启以后,我还要重新设置文件同步,“WM_Administrat My Documents”就已经没用了, 这是怎么回事啊,我现在需要一个固定的 ...…

查看全部问答>

印制板短路检测电路

本帖最后由 jameswangsynnex 于 2015-3-3 20:00 编辑 …

查看全部问答>

STM8,PA2外部输入高,GPIO_ReadInputPin(GPIOA,GPIO_PIN_2)返回多少?

函数原型是 BitStatus GPIO_ReadInputPin(GPIO_TypeDef* GPIOx, GPIO_Pin_TypeDef GPIO_Pin)…

查看全部问答>

关于2812数据存储的问题

请问大家,2812是一个32位的处理器,是不是意味着再想起内部saram存取数据时都是一次存取32位吗?如果是的话,我现在用的AD是16位的,那存进ram时是不是2812的高16位清0啊,还是分两个字节存取阿?还有就是2812的数据线只有16根,这就意味着2812访 ...…

查看全部问答>

运放稳定性-(第三第四部分)

本帖最后由 dontium 于 2015-1-23 13:28 编辑 第三部分:Ro与Rout 第四部分:环路稳定性主要技巧与经验 …

查看全部问答>

【M4开发板Hanker试用狂-Shower.Xu】-10、《寄人》-从SD卡更新字库到Flash

最近学习遇到障碍了,换了个方向,捣鼓了一下汉字库的更新,方法很多,从SD更新可能方便些。谁知道本以为简单的一个程序,也花费了快一周的时间....老规矩,图,视频,代码$(\'swf_dyb\').innerHTML=AC_FL_RunContent(\'width\', \'550\', \'height ...…

查看全部问答>

2600-PCT-x/4200-PCT-x参数曲线跟踪仪配置

  可配置功率电平 : – From 200V to 3kV – From 1A to 100A • 动态范 围宽: – From μV to 3kV – From fA to 100A • 电容-电压方法: – ±400V多 频C-V – 200V斜 坡速率 C-V – 20V甚 低频 (VLF ) C-V R ...…

查看全部问答>