欢迎来到天天文库
浏览记录
ID:19769902
大小:60.50 KB
页数:6页
时间:2018-10-06
《ds18b20 接口c语言程序设计……》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、222002.7技术纵横TECHNOLOGYREVIEWDS18B20接口的C语言程序设计■天津大学顾振宇刘鲁源杜振辉摘要关键词DS18B20是DALLAS公司生产的一款数字温度传感器,具有精度高、全数字化、连线少等优点;但其I/O时序要求严格,使大多数编程人员不得不用汇编语言编写接口程序。本文介绍DS18B20数字温度传感器的C51接口程序及其编程方法和编程思路。DS18B20C51数字温度传感器接口引言DS18B20数字温度传感器是美国DALLAS公司推出的DS1820系列数字温度传感器中性能优异的一款,具有诸多优点:
2、①精度高。12位二进制转换结果,确保±0.5℃的精度和0.0625℃的分辨率。②全数字化。直接将数字信号传给CPU,传输可靠,避免了模拟方式的干扰问题。③连线少。仅有3根连线:+5V电源、地线和1根数字I/O总线。如采用寄生电源方式,DS18B20会从数字I/O总线获取寄生电源,则仅连接I/O线和地线即可。虽然DS18B20有诸多优点,但使用起来并非易事。由于采用单总线数据传输方式,DS18B20的数据I/O均由同一条线完成,因此,对读写的操作时序要求严格。一般情况下需要用汇编语言编写接口程序[1],而如今单片机编程已广泛
3、采用C语言。在分析了C51所编译生成的程序代码的基础上,依据C51的编译特点,采用C51编写了该数字温度传感器的接口程序。该程序采用KeilC51v6.12编译通过,在采用12MHz晶振的PHILIPSP89C51RD+单片机上试运行,完全可以满足单线数据传输的时序要求。1精确延时问题为保证DS18B20的严格I/O时序,需要作较精确的延时。在DS18B20的操作中,延时分两种:短时间延时和较长时间延时。短时间延时指10μs以下的延时,在汇编语言下采用若干个NOP指令即可。因C51提供了若干内部函数,_nop_()函数为其
4、中之一,其编译结果就是在对应位置嵌入一个nop汇编指令,因此,短时间延时可利用_nop_()函数实现。较长时间延时指10μs以上的延时。在DS18B20操作中,用到的较长时间延时有15μs、90μs、270μs、540μs等。因这些延时均为15μs的整数倍,因此可编写一个Delay15(n)函数,用该函数进行大约15μs×n的延时,源码如下://功能:延时,延时时间n×15μs//输入:延时时间//返回:无voidDelay15(n)unsignedcharn;//延时参数{do{_nop_();//01_nop_();/
5、/02_nop_();//13n--;}while(n);}该函数编译生成的汇编为:;函数_Delay15(开始);----变量'n'分配到寄存器'R7'----0000?C0003:000000NOP000100NOP000C00NOP001CDFE2DJNZR7,?C0003001E22RET;函数_Delay15(结束)从上面的C51源码与生成汇编的对比中不难发现,C51程序中的do{n--;}while(n);结构仅生成了一条DJNZR7指令。这样一条DJNZ指令用去2μs,加上13个NOP,正好15μs一个循环;
6、而共13个_nop();_共13个NOP2002.7Microcontrollers&EmbeddedSystems23TECHNOLOGYREVIEW技术纵横函数的循环圈数即为R7中的参数n。这样,就得到了一个大约15μs×n的延时。这里没有将函数的调用、返回及参数传递的时间计算在内,但足以满足使用要求。如果需要,可以作更精细的计算。2底层基本操作有了比较精确的延时保证,就可以对DS18B20进行底层基本操作了。DS18B20的底层基本操作有3个。(1)初始化初始化是DS18B20的底层基本操作之一。通过单线总线进行的所
7、有操作都从一个初始化序列开始。初始化序列包括一个由CPU发出的复位脉冲及其后由DS18B20发出的存在脉冲。存在脉冲让CPU知道DS18B20在总线上且已做好操作准备。有了前面的延时函数,初始化实现起来很简单,源码如下://功能:初始化DS18B20,读存在脉冲,无存在脉冲则置位错误标志//输入:无//返回:无voidRST18B20(void){DS18B20=0;//复位脉冲Delay15(36);//延时540μsDS18B20=1;//恢复Delay15(6);//延时90μsError_DS18B20=DS18B
8、20;//读存在脉冲Delay15(18);//延时270μs}(2)数据写数据写是DS18B20的底层基本操作之一,所有的指令、数据发送均由该操作完成。DS18B20的写操作都是逐位进行的,因此,采用C51中的位右移操作来实现。源码如下://功能:写DS18B20//输入:待写字节//返回:无void
此文档下载收益归作者所有