STC15系列读取DS18B20温度传感器串口显示代码
2017-07-15 14:28
1186 查看
STC15系列读取DS18B20温度传感器串口显示代码
调试通过,复制粘贴即编译可使用,无需调试,晶振:22.1184M,串口输出,波特率:115200
为方便大家调试,特附该程序的项目文件,下载打开即可调试,下载地址:
http://download.csdn.net/detail/liyu3519/9873187
stc15系列都可以直接用
调试通过,复制粘贴即编译可使用,无需调试,晶振: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 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< c080 /span>; } 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); }
相关文章推荐
- STC15F2K60S2/STC15系列读取MPU6050陀螺仪角度加速度串口显示程序代码
- 基于stc15芯片的温度传感器DS18B20的使用
- STC15系列读取MPU6050陀螺仪角度加速度串口显示代码
- STC15F2K60S2读取DS18B20温度串口显示
- STC15F2K60S2读取DHT11温湿度串口显示实例
- STC15系列4个串口的使用库函数
- DS18B20温度传感器测温显示在数码管上(29.9℃)
- STC89C58串口接收GPS信号(GPRMC)读取经纬度,时间。1604液晶(HD44780)显示
- 基于51单片机及DS18B20温度传感器数码管显示程序
- STC89C58串口接收GPS信号(GPRMC)读取经纬度,时间。1604液晶(HD44780)显示
- ATMEGA16读取DS18B20温度,1602显示,并用proteus仿真,成功。
- 读取温度传感器DS18B20的实例
- STM32中ADC的使用/printf函数重定向串口显示内部温度传感器测量值
- 基于stc15系列芯片的电子密码锁代码
- S3C6410 DS18B20温度传感器驱动(三) --- 驱动源代码
- 温度传感器18B20(串口显示)
- S3C6410 DS18B20温度传感器驱动(四) --- 读取温度的应用程序
- DS18B20温度传感器利用LCD显示室内温度
- DS18B20温度传感器,将实时温度用数码管显示
- CC2530 ADC实验1(读取片内温度并通过串口显示)