LM75A程序解析数字式温度传感器_第1页
LM75A程序解析数字式温度传感器_第2页
LM75A程序解析数字式温度传感器_第3页
LM75A程序解析数字式温度传感器_第4页
LM75A程序解析数字式温度传感器_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、2011-01-2915:14:13|分类:默认分类|标签:lm75a工程师|字号订阅最近在测试LM75A的过程中出现的问题,从网上找来资料,调试发现都有问题,所以啊思路可以参考别人的具体程序还是自己写吧呵呵!网上的两个程序都有问题,都是数据处理过程中的问题:第一篇网上的帖子:在如今什么芯片都在涨价就是工资没涨价的情况下,看到LM75A比DS18B20还是便宜,有兴趣的朋友可以考虑下,这是网上资料,本人没测试LM75A是PHILPS公司生产的数字温度传感器及看门狗。通过片内集成的带隙温度传感器和工-数摸转换器来实现数字温度的测量,并通过该温度传感器为用户提供温度超限报警输出。LM75A内部包含

2、多个数据寄存器:配置寄器(Conf):用来存储器件的配置,如:器件工作模式、OS工作模式、OS极性和OS故障队列;(2)温度寄存器(Temp):用于存储读取的数字温度;(3)设定点寄存器(Tos&Thyst):用来存储可编程的过热关断和滞后限制。器件通过2线的串行I2C总线接口与控制器通信。LM75A包含一个开漏输出(OS),当温度超过编程限制的值时该输出有效。LM75A有3个可选的逻辑地址管脚,使得同一总线上可同时挂8个LM75A而无需其他硬件的支持CPU:STC89C54RD+晶震:11.0592MA0A1A2均接地地址设置为0OS脚和INTO相连并通过10K上拉到VCC;当转换温度超过极

3、限温度,输出中断蜂鸣器报警;刷新数码管显示温度共5位前一位表示正负温度后三位为温度125-55最后一位为0.1度最高可精确到0.125数码管图略(看程序应该会知道)定时器100MS采集温度一次#include#include#includesbitxiaoshu=P2A0;/COM口sbitge=P2A1;sbitshi=P2A3;sbitbai=P2A4;sbitfh=P2A5;sbitSDA_LM75=P1A0;数据sbitSCL_LM75=P1A1;sbitBP=P2A1;bitdp=0;unsignedcharJS=0;#defineLEDP0/8位数码管动态时时刷新#defineCO

4、NF0X01/配置寄存器#defineTEMP0X00/温度寄存器只读#defineALARM0X03超温关闭极限寄存器默认5000H#defineDELAY0X02滞后寄存器默认4B00H#defineWADDR0X90/写地址#defineRADDR0X91/读地址unsignedinttempdata=0;/全局变量申明温度unsignedcharcodetab=0 x3f,0 x30,0 x6d,0 x79,0 x72,0 x5b,0 x5f,0 x31,0 x7f,0 x7b,0 x40;共阴TOC o 1-5 h z/0,1,23456789/unsignedchartab=0 x

5、c0,0 xf9,0 xa4,0 xb0,0 x99,0 x92,0 x82,0 xf8,0 x80,0 x90;/共阳/0,1,23456789unsignedcharcodetabdp=0 xbf,0 xb0,0 xed,0 xf9,0 xf2,0 xdb,0 xdf,0 xb1,0 xff,0 xfb,0 xc0;/共阴带小数点/0,1,23456789/unsignedchartabdp=0 x40,0 x79,0 x24,0 x30,0 x19,0 x12,0 x02,0 x78,0 x00,0 x10;/共阳voiddelay_xms(unsignedintcount)/延时函数r

6、egisterunsignedcharj;while(count-)for(j=0;j125;j+)/约1MSvoidLed_Display(unsignedinti,bitmode)/显示函数if(mode)LED=0 x40;/共阴负/LED=0 xBF;elseLED=0 x00;/LED=0XFF;fh=1;bai=0;shi=0;ge=0;xiaoshu=0;delay_xms(1);LED=tabi/1000;i%=1000;fh=0;bai=1;shi=0;ge=0;xiaoshu=0;delay_xms(1);LED=tabi/100;i%=100;fh=0;bai=0;shi

7、=1;ge=0;xiaoshu=0;delay_xms(1);LED=tabdpi/10;/带小数点fh=0;bai=0;shi=0;ge=1;xiaoshu=0;delay_xms(1);LED=tabi%10;fh=0;bai=0;shi=0;ge=0;xiaoshu=1;delay_xms(1);voiddelay(void)/延时函数_nop_();_nop_();_nop_();_nop_();_nop_();voidstart_lm75(void)起始SDA_LM75=1;SCL_LM75=1;delay();SDA_LM75=0;delay();SCL_LM75=0;voidst

8、op_lm75(void)停止SDA_LM75=0;SCL_LM75=1;delay();SDA_LM75=1;delay();SCL_LM75=0;voidCheck_Ack(void)/检查应答信号SDA_LM75=1;SCL_LM75=1;F0=0;delay();if(SDA_LM75)/如果数据为高置位非应答标志FOF0=1;/通用标志位PSW状态寄存器SCL_LM75=0;/准备下一变化数据voidAck(void)/发响应信号SDA_LM75=0;delay();SCL_LM75=1;delay();SCL_LM75=0;voidno_Ack(void)/发非响应信号SDA_LM

9、75=1;SCL_LM75=0;delay();SCL_LM75=1;/迫使数据传输结束delay();voidsend_byte(unsignedchartemp)/发送一字节数据unsignedchari=8;while(i-)SDA_LM75=(bit)(temp&0 x80);SCL_LM75=1;delay();SCL_LM75=0;temp=1;SCL_LM75=0;delay();SDA_LM75=1;/释放SDA数据线unsignedcharread_byte(void)/读一字节数据unsignedchari=8;unsignedchartemp;while(i-)temp8

10、);datalow=(unsignedchar)(tempdata&0 x00FF);start_lm75();send_byte(WADDR);Check_Ack();if(F0)no_Ack();return;Ack();send_byte(addr);Check_Ack();if(F0)no_Ack();return;Ack();send_byte(datahigh);send_byte(datalow);Check_Ack();if(F0)no_Ack();return;Ack();delay();stop_lm75();unsignedcharread_chardata(unsign

11、edcharaddr)/读8位寄存器unsignedchartemp;start_lm75();send_byte(WADDR);Check_Ack();if(F0)no_Ack();return0;Ack();send_byte(addr);Check_Ack();if(F0)no_Ack();return0;Ack();send_byte(RADDR);Check_Ack();if(F0)no_Ack();return0;Ack();temp=read_byte();stop_lm75();return(temp);unsignedintread_intdata(unsignedchara

12、ddr)/读16位寄存器/unsignedchartemphigh,templow;原函数使用的是无符号字符型,8位unsignedinttemphigh,templow;/改成了无符号整形16位start_lm75();send_byte(WADDR);Check_Ack();if(F0)no_Ack();return0;Ack();send_byte(addr);Check_Ack();if(F0)no_Ack();return0;Ack();send_byte(RADDR);Check_Ack();if(F0)no_Ack();return0;Ack();temphigh=read_by

13、te();templow=(read_byte()&0 xe0;stop_lm75();if(!(temphigh&0 x80)dp=0;return(temphigh5);/如果使用的是8位字符型temphigh的话左移过程中数据已经全部丢了!elsedp=1;return(0 x800-(temphigh5);voidinitial()/初始化LM75AWrite_chardata(CONF,0X20);/0S中断模式,温度转换正常模式Write_intdata(ALARM,0 x3300);/100度极限由高9位有效位组成BIT15为1表示为负为0表示为正超过100度触发外部中断0Wri

14、te_intdata(DELAY,0X4A80);/95度后不报警voidint0_int()interrupt0using1/外部中断0服务函数BP=0;delay_xms(1000);BP=1;delay_xms(1000);voidt0_int()interrupt1using1/定时器0中断服务函数TR0=0;TH0=0 xdc;/10MS中断初值TL0=0 xff;TR0=1;JS+;if(JS10)/加到10为100MSJS=0;tempdata=read_intdata(TEMP);/采集数据tempdata=(tempdata/8)*10;/转换为温度voidmain()/入口

15、函数IP=0X01;TMOD=0X01;TH0=0 xdc;/10MS中断初值TL0=0 xff;IT0=0;/外部中断0采用电平触发ET0=1;TR0=1;/开放定时器0中断EX0=1;EA=1;initial();while(1)if(dp)Led_Display(tempdata,1);elseLed_Display(tempdata,0);第二个程序,问题同样出现在数据处理中!:/main主函数/*main.cLM75A数字温度计*/#includeDisp.h#includeI2C.h#include#include/*函数:Delay()功能:延时1ms65.536s参数:t0时,

16、延时(t*O.OO1)st=0时,延时65.536s*/voidDelay(unsignedintt)doTH0=0 xFC;TL0=0 x66;TR0=1;while(!TF0);TR0=0;TF0=0;while(-t!=0);/*函数:SysInit()功能:系统初始化*/voidSysInit()TMOD&=0 xF0;TMOD|=0 x01;设置TO为16位定时器DispInit();/数码管扫描显示初始化l2C_lnit();初始化I2C总线/*函数:ByteToStr()功能:字节型变量c转换为十进制字符串*/voidByteToStr(unsignedcharidata*s,u

17、nsignedcharc)codeunsignedcharTab=100,10;unsignedchari;unsignedchart;for(i=0;i2;i+)t=c/Tabi;*s+=0+t;c-=t*Tabi;*s+=0+c;*s=0;/*函数:LM75A_GetTemp功能:读出LM75A的温度值返回:LM75A温度寄存器的数值(乘以0.125可得到摄氏度值)*/intLM75A_GetTemp()unsignedcharbuf2;intt;I2C_Gets(0 x90,0 x00,2,buf);t=buf0;t=5;/去掉无关位右移8位后再左移高位始终是0正负将无法判断returnt;/*函数:DispTemp()功能:在数码管上显示出温度值参数:t:补码,除以8以后才是真正温度值*/voidDispTemp(intt)codeunsignedcharTab84=000,125,250,375,500,625,750,875;unsignedcharbuf4;bits;/符号位unsignedchari;/整数部分unsignedchard;/小数部分unsignedcharx;/

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论