在单片机中使用DS18B20温度传感器C语言程序》由会员分享,可在线阅读,更多相关在单片机中使用DS18B请在人文库网上搜索20温度传感器C语言程序(8页收藏版)。
用于单片机DS18B20温度传感器C语言程序(参考1) /*DS18B20 测温程序硬件:AT89S52 (1)单线ds18b20接 P2.二、七段数码管接P0口(3)使用外部电源ds18b20供电,寄生电源未使用 软件:Kei uVision 3*/#include reg52.h#include intrins.h#define uchar unsigned char#define uint unsigned intsbit ds=P22;sbit dula=P26;sbit wela=P27;uchar flag ;uint temp; /参数temp必须声明为 int 型 。
2、uchar code table=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71; /没有小数点数字编码uchar code table1=0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef; /带小数点数字编码/*延时函数*/void TempDelay (uchar us)while(us-);void delay(uint count) /延迟子函数uint i;while(count)i=200;while(i0)i-;coun。
3、t-;/*串口初始化,波特率9600,方式1 */void init_com()TMOD=0x20; /设置定时器1模式2TH1=0xfd; /安装初始值设置波特率TL1=0xfd;TR1=1; /启动定时器SM0=0; /串口通信模式设置SM1=1;/ REN=1; /串口允许接收数据PCON=0; /波特率不倍频/ SMOD=0; /波特率不倍频/ EA=1; ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////ES=1; /开串行中断//开串行中断/*显示数字管 */void display(uint temp)uchar bai,shi,ge;bai=temp/100;shi=temp0/10;ge=temp0;dula。
4、=0;P0=tablebai; /显示百位dula=1; /从0到1,有一个上升沿,解锁锁存,显示相应段 dula=0; /从1到0再次锁定wela=0;P0=0xfe;wela=1;wela=0;delay(1); /延时约2msP0=table1shi; /显示十位dula=1;dula=0;P0=0xfd;wela=1;wela=0;delay(1);P0=tablege; /显示个位dula=1;dula=0;P0=0xfb;wela=1;wela=0;delay(1);/* 时序:初始化时序、读时序、写时序。所有时间序列都以主机(单片机)为主设备,单总线设备为从设备。所有时间序列都以主机(单片机)为主设备,单总线设备为从设备。每个命令和数字。
5.据传输始于主机主动启动写时序。如果要求单总线设备返回数据,则主机需要在编写命令后启动读时序以完成数据接收。数据和命令的传输处于低位。 初始时序:复位脉冲 脉冲读;1. 或 0时序写;1 或 只有脉冲信号存在于18b20(从机)发出的其他信号由主机发出。脉冲:让主机(总线)知道从机(18)b20)已经准备好了。*/*-初始化:检测总线控制器发出的复位脉冲和ds18b20的任何通信都应该从初始化开始。初始化序列包括总线控制器发出的复位脉冲和从机发出的存在脉冲。初始化:复位脉冲 脉冲的具体操作:总线控制器发出(TX)复位脉冲 (一个至少保持4800s。
6、 然后释放总线,进入接收状态(RX)。单线总线由5K 上拉电阻拉到高电平。探测到I/O 上升沿后引脚DS1820 等待1560s,然后发出存在脉冲(60240)s 低电平信号)。具体看18b20 单线复位脉冲时序和1-wire presence detect 的时序图-*/void ds_reset(void)ds=1;_nop_(); /1usds=0;TempDelay(80); /当总线停留在低电平超过480时us,所以装置会在总线上复位,延迟/时约530us低电平超过480s,总线上的所有设备都将被复位。_nop_(); ds=1; /产生复位脉冲后。
7.微处理器释放总线,使总线处于空闲状态。原因是18b20中文资料TempDelay(5); /释放总线后,从机18b20通过降低总线来指示它是否在线/检测高电平时间:1560us, 所以延时44us,进行1-wire presence detect(单线检测)_nop_();_nop_();_nop_();if(ds=0)flag=1; /detect 18b20 successelseflag=0; /detect 18b20 failTempDelay(20); 检测低电平时间:60240us,所以延时约140us_nop_();_nop_();ds=1; /再次拉高总。
8.让总线处于空闲状态/*/原理解释:控制器 18B20 操作流程:1 , 复位 : 首先,我们必须正确 DS18B20 芯片复位 , 由控制器复位 ( 单片机 )给 DS18B20 单总线至少 480uS 低电平信号 。 当 18B20 收到此复位信号后,它将会 在1560uS 芯片存在脉冲后回发。2 , 存在脉冲 : 复位电平结束后 , 控制器应该拉高数据单总线 , 以便于 在1560uS 接收存在脉冲后,存在脉冲为一个 60240uS 低电平信号。到目前为止,通信双方已经达成了基本协议,接下来将是控制器和 18B20 间数据通信 。 /*-阅读/写作时间间隙:DS1820 的。
9.数据读写是通过时间间隙处理位和命令确认信息交换。-*/bit ds_read_bit(void) /读一位bit dat;ds=0; /单片机(微处理器)拉低总线_nop_(); /阅读间隙始于微处理器,总线至少拉低1usds=1; /拉低总线,然后释放总线,让从机18b20能接管总线,输出有效数据_nop_();_nop_(); /小延迟阅读18b20上的数据 ,因为从ds18b20上输出的数据/阅读时间间隙下降沿15us内有效dat=ds; /主机读从机18b20输出的数据,这些数据在读时隙的下降沿出现/15us内有效 TempDelay(10); /所有阅读间隙必须为6012。
10、0us,这里77usreturn(dat); /返回有效数据原理:图: 8读时间隙控制时采样时间应更准确 , 读时间间隙也必须先由主机产生 1uS 低电平表示阅读时间的开始。然后在总线释放后 15uS 中DS18B20 如果发现总线为高电平,将发送内部数据位 “ 1 ” ,如果总线为低电平,则表示读取数据 “ 0 ” 。在读取每个人之前,控制器添加一个起始信号。注意:如图 8 所示,必须从阅读间隙开始 15uS 内读数据位可以保证正确的通信。以通信为准 8 位 “ 0 ” 或 “ 1 ” 为一个字节 , 字节的读写始于高位 , 即A7 到 A。
11、0. 字节的读写顺序也如图所示 2 自上而下。uchar ds_read_byte(void ) /读一字节uchar value,i,j;value=0; /别忘了给初值for(i=0;i1); /这一步的解释是一个word文档里面 ? return(value); /返回一个字节的数据void ds_write_byte(uchar dat) /写字节uchar i;bit onebit; /不要忘记,onebit是一位for(i=1;i1; /从低到高传输数据if(onebit) /写 1ds=0;_nop_(); _nop_(); /看时序图,至少延迟1us,写作写作间隙才产生。
12、 ds=1; /写时间间隙开始后的15s允许数据线拉到高电平TempDelay(5); 所有写作间隙必须至少持续600uselse /写 0ds=0;TempDelay(8); /主机生成一个写0 时间间隙必须将数据线拉到低电平并保持至少60s,这里64usds=1;_nop_();_nop_();/* 主机(单片机)控制18B20完成温度转换需要三个步骤:每次读写前18B20复位操作,复位成功后发送一个ROM最后发送指令RAM指令,这样才能正确DS18b20预定操作。复位要求主CPU将数据线下拉500us,然后释放,当ds18B接到信号后等待1660us,后发出60。
13、240us低脉冲,主CPU收到此信号表示复位成功*/*-温度转换:先初始化,然后跳过ROM:跳过64位ROM地址,直接方向ds18B20发温度转换命令,适度转换命令适合单片工作-*/void tem_change()ds_reset(); delay(1); /约2msds_write_byte(0xcc);/单线情况,跳跃ROM指令ds_write_byte(0x44)*-获得温度:-*/uint get_temperature()float wendu;uchar a,b;ds_reset();delay(1); /约2msds_write_byte(0xcc);ds_write_byte(0xbe);/发送读温命令a=ds_read_byte()/读出温度低8位b=ds_read_byte()/阅读温度高8位temp=b;temp0;a-)display( get_temperature();。