完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
碰到个问题,很久了一直没调通,求高手帮忙,将整个工程文件附上。多谢了!因为单总线上挂接有两个DS18B20测温芯片,所以发出温度转换指令后(0x44),需先进行匹配序列号指令(0x55),才能读取(0xBE)指定DS18B20的温度值。
对于单总线上只有一个DS81B20的情况(此时可不进行序号号匹配),已经实现了温度测量。但单总线挂接有两个DS18B20的时候,匹配序列号指令MatchROM(0x55)根本不起作用。 请高手帮忙看看,万分感谢。 /*********************************************************************************/ 18b20.c #include #include "ds18b20.h" #include "delay.h" #include "typedef.h" //unsigned char code ROM1[]={0x28,0x73,0x16,0x29,0x40,0x00,0x00,0x42}; //ROM1:0x42,0x00,0x00,0x40,0x29,0x16,0x73,0x28 //unsigned char code ROM2[]={0x28,0xC9,0xC0,0x7E,0x40,0x00,0x00,0x16}; //ROM2:0x16,0x00,0x00,0x40,0x7E,0xC0,0xC9,0x28 /*------------------------------------------------ 18b20初始化 ------------------------------------------------*/ bit Init_DS18B20(void) { bit dat=0; DQ = 1; //DQ复位 DelayUs2x(5); //稍做延时 DQ = 0; //单片机将DQ拉低 DelayUs2x(200); //精确延时 大于 480us 小于960us DelayUs2x(200); DQ = 1; //拉高总线 DelayUs2x(50); //15~60us 后 接收60-240us的存在脉冲 dat=DQ; //如果x=0则初始化成功, x=1则初始化失败 DelayUs2x(25); //稍作延时返回 return dat; } /*------------------------------------------------ 读取一个字节 ------------------------------------------------*/ unsigned char ReadOneChar(void) { unsigned char i=0; unsigned char dat = 0; for (i=8;i>0;i--) { DQ = 0; // 给脉冲信号 dat>>=1; DQ = 1; // 给脉冲信号 if(DQ) dat|=0x80; DelayUs2x(25); } return(dat); } /*------------------------------------------------ 写入一个字节 ------------------------------------------------*/ void WriteOneChar(unsigned char dat) { unsigned char i=0; for (i=8; i>0; i--) { DQ = 0; DQ = dat&0x01; DelayUs2x(25); DQ = 1; dat>>=1; } DelayUs2x(25); } /*------------------------------------------------ 匹配序号号 ------------------------------------------------*/ /* void MatchROM(unsigned char a) //匹配ROM { unsigned char j; WriteOneChar(0x55); //发送匹配ROM命令 if(a==1) { for(j=0;j<8;j++) { WriteOneChar(ROM1[j]); //发送18B20的序列号,先发送低字节 } } if(a==2) { for(j=0;j<8;j++) { WriteOneChar(ROM2[j]); //发送18B20的序列号,先发送低字节 } } } */ /*------------------------------------------------ 读取温度 ------------------------------------------------*/ unsigned int ReadTemperature(unsigned char *ROM) { unsigned char a=0; unsigned int b=0; unsigned int Temper=0; /**/ Init_DS18B20(); WriteOneChar(0xcc); // 跳过读序号列号的操作 WriteOneChar(0x44); // 启动温度转换,对总线上所有18b20有效 Delay10ms_110592(); Init_DS18B20(); WriteOneChar(0x55); // 匹配号列号 //Match ROM /**/ WriteOneChar(ROM[0]); WriteOneChar(ROM[1]); WriteOneChar(ROM[2]); WriteOneChar(ROM[3]); WriteOneChar(ROM[4]); WriteOneChar(ROM[5]); WriteOneChar(ROM[6]); WriteOneChar(ROM[7]); // MatchROM(Num); WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度 a=ReadOneChar(); //低位 b=ReadOneChar(); //高位 b<<=8; Temper=a+b; /**/ if(Temper<0x0fff) { TemperFlag=0; } else { Temper=~Temper+1; TemperFlag=1; } return(Temper); } void ReadROM(void) //读ROM { unsigned char i; // Init_DS18B20(); // Delay20us_110592; WriteOneChar(0x33); Delay20us_110592; for(i=0;i<=7;i++) { Delay20us_110592; ROM_Num[i]=ReadOneChar(); } } /******************************************************************************/ 18b20.h #include #include #ifndef __DS18B20_H__ #define __DS18B20_H__ ***it DQ=P2^0; unsigned char ROM_Num[7]; unsigned char TemperFlag; bit Init_DS18B20(void); void WriteOneChar(unsigned char Data); void ConvertTemper(void); unsigned int ReadTemperature(unsigned char *ROM); unsigned char ReadOneChar(void); void ReadROM(void); void MatchROM(unsigned char a); #endif /************************************************************************************/ main.c #include #include "intrins.h" #include "typedef.h" #include "delay.h" #include "stdio.h" //#include "UART.h" #include "lcd1602.h" //#include "ds18b20.h" uint8 TX_Buf[19]; /**************************** // DS18b20 extern unsigned char ROM_Num[7]; unsigned char code ROM1[8]={0x28,0x73,0x16,0x29,0x40,0x00,0x00,0x42}; //ROM1:0x42,0x00,0x00,0x40,0x29,0x16,0x73,0x28 unsigned char code ROM2[8]={0x28,0xc9,0xc0,0x7e,0x40,0x00,0x00,0x16}; //ROM2:0x16,0x00,0x00,0x40,0x7E,0xC0,0xC9,0x28 unsigned char code ROM3[8]={0x28,0xcd,0xd0,0x2a,0x50,0x00,0x00,0xcb}; extern bit Init_DS18B20(void); extern void WriteOneChar(unsigned char Data); extern unsigned char ReadOneChar(void); extern unsigned int ReadTemperature(unsigned char *ROM); extern void MatchROM(unsigned char a); bit SampleFlag; uint8 DisplayTemp[6]={0};//定义显示区域临时存储数组 #define UARTComWidth 5 void Init_timer0() { TMOD|=0x01; TH0=(65536-50000)/256; TL0=(65536-50000)%256; EA=1; ET0=1; TR0=1; // IT0=1; } void main(void) { unsigned int Temp; unsigned char a=0; unsigned int b=0; float Temperature; Init_Timer0(); Init_DS18B20(); LCD_Init(); LCD_Write_String(0,0,"Temp1:");//显示第一行 LCD_Write_String(14,0,"C");//显示第一行 LCD_Write_String(0,1,"Temp2:");//显示第一行 LCD_Write_String(14,1,"C");//显示第一行 while (1) { if(SampleFlag) { SampleFlag=0; Temp=ReadTemperature(ROM3); Temperature=(float)Temp*0.0625; sprintf(TX_Buf,"%4.2f",Temperature);//通过sprintf函数将浮点值转换成字符串类型并 LCD_Write_String(7,0,TX_Buf);//显示第一行 /**/ Temp=ReadTemperature(ROM1); Temperature=(float)Temp*0.0625; sprintf(TX_Buf,"%4.2f",Temperature);//通过sprintf函数将浮点值转换成字符串类型并 LCD_Write_String(8,1,TX_Buf);//显示第一行 } } } void ISR_Timer0(void) interrupt 1 { static unsigned int Num; TH0=(65536-40000)/256; TL0=(65536-40000)%256; // SampleFlag=1; /**/ Num++; if(Num==10) { Num=0; SampleFlag=1; } } /* void ISR_UART() interrupt 4 { static unsigned char i; if(RI) { RI=0; UARTCom[i]=SBUF; i++; if(i>=UARTComWidth) { i=0; } */ /* SBUF=Temp[i]; if(TI) { TI=0; } */ // } // }
|
|
相关推荐
3 个讨论
|
|
我毕业设计做这个,现在刚做,问一下你的ROM1 ROM2是怎么知道的?
|
|
|
|
|
|
只有小组成员才能发言,加入小组>>
AVR Atmega16 Bootloader程序与上位机LabView程序
5175 浏览 6 评论
#include <ioavr.h>这个头文件我应该下什么编译器
7794 浏览 0 评论
3073 浏览 2 评论
3125 浏览 1 评论
10107 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 17:19 , Processed in 0.486440 second(s), Total 49, Slave 37 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号