PORTA&=~BIT(DQ); //拉低总线,启动输入 PORTA|=BIT(DQ); //释放总线
DDRA&=~BIT(DQ); //DQ 为输入状态 if(PINA&BIT(DQ)) Temp|=0x80;
Delay_1us(45); //延迟45 微妙(最大45 微妙) }
return Temp; }
//读温度函数
unsigned int Read_Temperature() {
unsigned int Temp1,Temp2;
DS1302_Reset(); //DS1302 复位 DS1302_Write(0xCC); //跳过ROM DS1302_Write(0x44); //温度转换 DS1302_Reset(); //DS1302 复位 DS1302_Write(0xCC); //跳过ROM DS1302_Write(0xbe); //读取RAM
Temp1=DS1302_Read(); //读低八位,LS Byte, RAM0 Temp2=DS1302_Read(); //读高八位,MS Byte, RAM1 DS1302_Reset(); //DS1302 复位,表示读取结束
return (((Temp2<<8)|Temp1)*6.25); //0.0625=xx, 0.625=xx.x, 6.25=xx.xx }
void main() {
unsigned int Temp;
LED7_Init(); //初始化数码管引脚 while(1) {
Temp=Read_Temperature(); //调用读取温度函数 Number_Show(Temp); //显示温度 Delay_1us(100); //稍微延迟 } }
AVR单片机与DS18B20多点温度 获取序列号(64位ROM代码)
操作单总线数字温度传感器必须严格按规定的协议操作,即应按以下顺序操作: 初始化、ROM操作命令、暂存存储器操作命令、数据传输。在ROM操作命
令中,有两条命令专门用于获取传感器序列号: 读ROM命令( 33H)和搜索ROM命令( F0H) 。读ROM命令只能在总线上仅有一个传感器的情况下使用。搜索ROM命令则允许总线主机使用一种“消去”处理方法来识别总线上所有的传感器序列号。为了建立64位ROM代码和测量位置点传感器之间的关系,我们选
21
用读ROM命令(33H) 。DS18B20的64位ROM代码结构如图2所示:8位CRC代码48位序列号8位产品类型号
执行如下程序即可读取DS18B20的64位ROM代码并按编号存入其内部的E2 PROM中,从而建立测量位置点和传感器64位ROM代码之间的关系表。64位序列号用8个字节单元来存储,位置号为n的DS18B20,其64位序列号在E2 PROM中从( n - 1) ×8开始的单元存放。
由于已经在上面获取了多个DS18B20的ROM代码并在AVR 单片机内部的E2 PROM中建立了测量位置点和传感器64位ROM代码之间的关系表,因此对多个温度的巡回 测量的步骤如下:
(1) 发跳过ROM命令CCH。
(2) 发启动所有在线的DS18B20进行温度转换命令44H。 (3) 延迟1 s。
(4) 发匹配ROM命令55H。
(5) 按照E2 PROM中建立的关系表的顺序取出64位ROM代码发送到单总线。 (6) 发读温度值命令BEH,读取温度值。
(7) 进行CRC校验和数据处理后送LCD显示器显示。
(8) 重复第4步到第7步,直到所有的DS18B20测量处理完。 (9) 再重复第1步到第8步,进行下一轮的巡回测量。
第4章 系统软件设计
4.2 测温模块流程图