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

//**************************
//程序说明:stc15系列采集ds18b20温度数据,并从串口输出
//采用的是22.1184M晶振,用传感器中间那个脚连接单片机的P2.0口
//**************************#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 TimerTMOD &= ~0x30;     //Timer1_16bitAutoReload;2AUXR |=  (1<<6);    //Timer1 set as 1T modeTH1 = (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();//6usds18b20_io=0;//拉低Delay600us();//600usds18b20_io=1;//拉高Delay30us();//30usinit_success_tag=ds18b20_io;Delay600us();//600usreturn 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();//6usif(ds18b20_io==1)dat|=0x80;elsedat|=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();//30usds18b20_io=1;//拉高Delay3us();//3usdat>>=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);
}

STC15系列读取DS18B20温度传感器串口显示代码相关推荐

  1. STC15F2K60S2读取DS18B20温度串口显示

    为方便大家调试,特附该程序的项目下载地址 STC15F2K60S2读取DS18B20温度实例下载地址 //************************** //程序说明:stc15f2k60s2采 ...

  2. 51单片机读取DS18b20温度传感器LCD1602显示例程

    很久前测试过没问题,应该绝大部分来源于网络,供大家参考,后面会发简单的可以直接拿来用的自己瞎写的一看就明白的ds18b20库 #include <reg52.h> #include < ...

  3. 51单片机读取DS18B20温度传感器

    1.首先我们知道DS18B20是单总线协议,只有一根数据线.所以Data数据线即使发送端又是接收端,同时DS18B20内部接了弱上拉电阻(如图一所示),数据线默认为高电平.有了这些概念,我们就能进行下 ...

  4. STM32CubeMX 读取DS18B20温度传感器数据串口打印显示

    概述 本文要做的所有工作标题基本都包括了,读取温度传感器的温度数值,再通过串口打印到串口助手: 好多博主大神的教程我按步骤做了之后总是出现程序不报错并且检测不到传感器的情况,后来找到原因并且修改后调试 ...

  5. 51单片机+DS18B20+数码管显示+串口通讯+Proteus仿真

    51单片机+DS18B20+数码管显示+串口通讯+Proteus仿真 本实验通过51单片机读取DS18B20温度传感器的温度,然后通过数码管显示,并通过串口,将读取到的温度数据发送出去. 本案例需要使 ...

  6. STC89C52RC 单片机读取DHT22温湿度传感器串口显示程序调试经验总结

    DHT22例程获取到的途径很多,某宝商家那里,本站也可以.附件下载例程代码 例程如下: //****************************************************** ...

  7. Arduino控制超声波检测与0.96OLED及串口显示

    Arduino控制超声波检测与0.96OLED及串口显示代码使用库共享(包括超声波检测与U8glib): 使用元件: 0.96寸 12864 I2C OLED 128x64规格 超声波检测模块 湿度模 ...

  8. 51单片机DS18B20温度传感器使用及数码管温度计、LCD1602温度显示代码详解

    温馨提示:读者若要彻底理解并会灵活使用DS18B20温度传感器,请详细阅读中文手册,并且对照代码注释充分分析代码.请不要觉得中文手册内容繁多!如能静心分析,定能深有体会,获益匪浅! 一.DS18B20 ...

  9. 51单片机使用LCD1602显示DS18B20温度传感器温度

      使用LCD1602显示DS18B20温度传感器温度.关于DS18B20和LCD的原理,我就不再叙述了,大家自行查找,网上可以找到好多.   使用Proteus仿真.(需要仿真和Keil工程文件的可 ...

最新文章

  1. dotNET Core WebAPI 统一处理(返回值、参数验证、异常)
  2. python图像分割算法_OpenCV-Python 图像分割与Watershed算法 | 三十四
  3. java ztree json_java递归实现ztree树结构数据展示
  4. crc16码表的使用_查表法计算CRC16校验值
  5. 信息化与工业化融合的内涵、层次和方向
  6. Oracle树查询(查询所有子节点,父节点等等)_转载
  7. lucene造成磁盘空间不足的问题
  8. Window 浏览器窗口对象
  9. java内置的四大函数式接口
  10. latex 设置表格的字体大小和行高
  11. PHP 可变变量的使用
  12. 关于抽象和多态的总结
  13. excel如何批量制作二维码?
  14. 在ajax中幸运抽奖,JS实现幸运抽奖页面
  15. python漏洞扫描器爬虫_Python系列之——漏洞平台厂商列表爬虫
  16. 【灵修】应对“三季人”,多活十余年(2012-1-14)
  17. 高通骁龙处理器天梯排行榜2022 骁龙处理器发布时间排行
  18. 前端实现高效的海报系统
  19. Java、JSP网上教务评教管理系统(教学评价系统)
  20. 2021双非计算机保研之路(经验之谈)

热门文章

  1. EOQ的计算公式简化
  2. 期货交易到底是什么(期货是什么 怎样交易)
  3. HuaWei-面试题Traing-01
  4. C语言.内存管理malloc realloc calloc free memset bzero
  5. 学计算机会会恢复手机文件吗,恢复被删除的文件的方法是什么 四大办法轻松应对【图文教程】...
  6. fpu测试_【小加评测】性价比散热器?3700X吃鸡仅50度?利民TS120风灵 散热器实战测试分享...
  7. 关于矩形窗函数DFT和FFT的笔记
  8. python爬虫:词云分析最热门电影《后来的我们》
  9. RK3399应用开发 | 基于u8g2驱动oled显示系统基本信息(时间、IP、CPU负载、CPU温度)
  10. MTK分区案例2:adb reboot laf需求上层或内核实现