哪位高手帮忙解释下这几段ds18b20代码的程序

DS18B20 测温程序完全解读_文档下载
&当前位置:
& DS18B20 测温程序完全解读
DS18B20 测温程序完全解读
相关文档:
更多文档:
我要评论:
本站所有资源均来自互联网,本站只负责收集和整理,均不承担任何法律责任,如有侵权等其它行为请联系我们.
文档下载 Copyright
All Rights Reserved.&& <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
您的访问请求被拒绝 403 Forbidden - ITeye技术社区
您的访问请求被拒绝
亲爱的会员,您的IP地址所在网段被ITeye拒绝服务,这可能是以下两种情况导致:
一、您所在的网段内有网络爬虫大量抓取ITeye网页,为保证其他人流畅的访问ITeye,该网段被ITeye拒绝
二、您通过某个代理服务器访问ITeye网站,该代理服务器被网络爬虫利用,大量抓取ITeye网页
请您点击按钮解除封锁&哪位高手解释一下这段程序 start:mov ax,datasg mov ds,ax mov si,0 mov di,16后两句是什么意思?谢谢!_百度知道汇编程序求解释???急急急_百度知道*&+-------------+-------------------------------------+& *&|&-1(GND)&|&GND(ground)&|& *&+-------------+-------------------------------------|& *&|&Pin-2(DQ)&|&通过240欧姆的连接到ATmega8的&|& *&|&|&PD3引脚,同时用一个3K的电阻上拉到&|& *&|&|&V(5V)。&|& *&+-------------+-------------------------------------+& *&|&Pin-3(VD)&|&GND(ground)&|& *&+-------------+-------------------------------------+& *&说明:很显然,我采用的是"总线窃电"模式,这是DS-18B20数据手册认可的工作模式之一。串联240欧姆电阻的用意& *&是为了防止有缺陷的用户程序损坏DS18B20的可能性。例如,& *&如果用户没有正确地用OC(集电极开路)或OD(漏极开路)结构去& *&驱动DS18B20,而是错误地选择了推挽式结构,则DS18B20会立& *&即或在"被虐待"一段时间后"死翘翘"(^_^)。当然,240欧姆的& *&取值未必是最恰当的,设计者可自己去优化。这需要设计者仔细& *&阅读数据手册。& *& *&此外,我采用了DS18B20的默认精度(12位),并未修改,我& *&也没有使用它的其它功能。简而言之,这只是一个简单的读取温度& *&的实例。用户可以自己去改进,自己去研究数据手册(我并未完全& *&看,只看了想看的一点点&^_^&)。但是我可以肯定一点,这个程& *&序我是实践过的!并且成功地读取了温度值!& *& *&请注意我是如何驱动DS18B20的:我是用AVR
的方向寄存器& *&而不是输出端口寄存器!&同时预先在输出端口寄存器中写入0。& *&这实际上相当于一个三态门:只不过输入被接地,使它成了一& *&个OC门,使能端成了这个OC门的实际输入!& *& *&1-wire总线的电气特性与I2C总线相似,具有线与功能,所& *&以,总线上的任一设备都可在合适的时间强行拉低总线,但是总线& *&要呈现高,则必须是每一个设备都释放了总线。就像我下面的& *&宏DQ_TO_1(),它只是释放了总线,但不是说总线一定被强行驱动& *&至高电平,总线的高电平是由实现的。& */& #define&DQ_18B20&(1&&3)&//&PD3& #define&DQ_TO_0()&(DDRD&|=&DQ_18B20)&//&PD3=’0’& #define&DQ_TO_1()&(DDRD&&=&~DQ_18B20)&//&PD3=’float’& #define&DQ_status()&(PIND&&&DQ_18B20)&//&read&PD3&pin& /*&请认真检查你的AVR微控制器的时钟!&特别注意:频率& *&定义的单位是M!&并且请使用浮点数!&假如你的是12MHz,& *&你应该写成12.之类。& *&我的实验的晶振是:11.0592MHz& */& #ifndef&CPU_CRYSTAL& #define&CPU_CRYSTAL&(11.0592)& #endif& /*&请包含WinAVR系统提供的延时头文件"delay.h",其中给出& *&两个延时模块,我用16位的那个(16-bit&count,&4&cycles/l-& *&oop.),细节请看这个头文件。& */& #define&wait_us(us)\& _delay_loop_2((INT16U)((us)*CPU_CRYSTAL/4))& /*----------------&函数原型声明&------------------*/& //&1个初始化模块& void&ds18b20_config(void);&//&配置端口& //&3个基本模块& BOOL&ds18b20_reset(void);&//&复位DS18B20& void&ds18b20_write(INT8U&dat);&//&写字节到DS18B20& INT8U&ds18b20_read(void);&//&读字节从DS18B20& //&2个应用模块& void&convert_T(void);&//&启动温度转换& INT16U&read_T(void);&//&读取转换值& /*-------------------------------------------------------& *&配置(使能)AVR 单片机 与DS18B20的接口& */& void&ds18b20_config(void)& {& DDRD&&=&~DQ_18B20;&//&输入模式(上电时为高电平)& PORTD&&=&~DQ_18B20;&//&输出锁存器写0,以后不再更改& }& /*------------------------------------------------------& *&复位1-wire总线,并探测是否有温度芯片DS18B20(TO-92& *&封装)挂在总线上,有返回SUCC,没有返回FAIL& */& BOOL&ds18b20_reset(void)& {& BOOL&bus_& DQ_TO_0();&//&设置1-wire总线为低电平(占领总线)...& /*&现在延迟480us~960us,&与硬件密切相关,但应尽可能选小值(480us),& 把抖动留给系统(比如在延迟期间发生中断导致延迟变长)。& */& wait_us(490);&//&490us& cli();&//&下面这段时间要求比较严格,为保险起见,关中断& DQ_TO_1();&//&设置1-wire总线为高电平(释放总线)& /*&这个浮点数是由编译器计算好的,而不是由你的MCU在运行时临时计算的,& 所以不会占用用户MCU的时间,不必担心(看看前面的宏你就可以确定了)& */& wait_us(67.5);&//&最佳时间:&60us+7.5us!(忙延时,只是一种策略)& //&探测总线上是否有器件& if(DQ_status())&bus_flag=FAIL;&//&复位单总线但没有发现有器件在线& else&bus_flag=SUCC;&//&复位单总线并发现有器件在线& sei();&//&退出临界代码区(开中断)& /*&保证Master释放总线的时间(不是说总线处于高电平的时间)不小于& 480us即可,这一时间从读总线状态之前就开始了,所以这里把这个& 时间计算在内。在Master释放总线的前半段,也是被动器件声明它& 们在线之时。& */& wait_us(490-67.5);&//&490-67.5us& return(bus_flag);& }& /*------------------------------------------------------& *&写命令或数据到温度芯片DS18B20(发送一个字节)& */& void&ds18b20_write(INT8U&dat)& {& INT8U&& //&每个字节共8位,一次发一位& for(count=0;&count&8;&count++)&{& cli();&//&保证绝对不会发生中断!& DQ_TO_0();&//&设置1-wire总线为低电平& wait_us(2);&//&about&2us& if(dat&0x01)&DQ_TO_1();&//&并串转换,先低位后高位& else&DQ_TO_0();& dat&&&=&1;&//&下一位做好准备& //&60us~120us(实际不能到120us,&因为其它语句也用时间了!)& wait_us(62);&//&62us& DQ_TO_1();& sei();&//&恢复系统中断& wait_us(2);&//&2us& }& }& /*---------------------------------------------------------& *&从温度芯片DS18B20读配置或数据(接收一个字节)& */& INT8U&ds18b20_read(void)& {& INT8U&count,& dat&=&0x00;&//&数据接收准备& //&每个字节共8位,一次收一位& for(count=0;&count&8;&count++)&{& cli();&//&保证绝对不会发生中断!& //&从总线拉低到读总线状态,不能大于15us!& DQ_TO_0();&//&设置1-wire总线为低电平(拉低总线以同步)& wait_us(2);&//&2us& DQ_TO_1();&//&设置1-wire总线为高电平(释放总线)& wait_us(4);&//&4us& dat&&&=&1;& if(DQ_status())&dat|=0x80;&//&读取总线电平,先收低位再收高位& sei();&//&恢复系统中断& wait_us(62);&//&必须大于60us& }& return(dat);& }& /*-------------------------------------------------------& *&我的电路中只有一个器件DS18B20,所以不需要多个器件的ID& *&识别,跳过之后,启动温度转换,但在启动后,用户应等待几百个& *&毫秒,才能读到这次的转换值,这是DS18B20的数据手册规定的。& *&因为温度转换是需要时间的嘛!(^_^)& */& void&convert_T(void)& {& if(ds18b20_reset()==SUCC)&{&//&如果复位成功& ds18b20_write(0xcc);&//&跳过多器件识别& ds18b20_write(0x44);&//&启动温度转换& }& }& /*-------------------------------------------------------& *&读取转换后的温度值& *&我假定DS18B20一定是正确的,所以没有返回有关状态。当你故意& *&把DS18B20从电路中拔下而能让程序告诉你出错时,你可以自己修& *&改这段代码!& */& INT16U&read_T(void)& {& INT16U&value=0;& if(ds18b20_reset()==SUCC)&{&//&如果复位成功& ds18b20_write(0xcc);&//&跳过多器件识别& ds18b20_write(0xbe);&//&读暂存器& value&=&(INT16U)ds18b20_read();&//&低字节& value&+=&(INT16U)(ds18b20_read())&&8;&//&高字节& }& return(value);& }& #endif& /*&文件ds18b20.c结束&*/&
本网站试开通微、小企业商家广告业务;维修点推荐项目。收费实惠有效果!欢迎在QQ或邮箱联系!
试试再找找您想看的资料
资料搜索:
查看相关资料 & & &
   同意评论声明
   发表
尊重网上道德,遵守中华人民共和国的各项有关法律法规
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
本站管理人员有权保留或删除其管辖留言中的任意内容
本站有权在网站内转载或引用您的评论
参与本评论即表明您已经阅读并接受上述条款
copyright & &广电电器(中国梧州) -all right reserved& 若您有什么意见或建议请mail: & &
地址: 电话:(86)774-2826670&

我要回帖

更多关于 ds18b20代码 的文章

 

随机推荐