内容发布更新时间 : 2024/12/25 2:26:09星期一 下面是文章的全部内容请认真阅读。
太阳能热水器控制器的设计 17
4.1 DS18B20驱动程序设计
DS18B20数字温度计提供9位(二进制)温度读数,指示器件的温度。信息经过单线接口送入DS18B20或从DS18B20送出,因此从主机CPU到DS18B20仅需一条数据线和地线,电源可以有数据线本身提供而不需要外部电源。DS18B20的测量范围从-55°C到+125°C。温度传感器的引脚如表4-1所示。
表4-1 DS18B20管脚连接
管脚号 1 2 3 名称 GND DQ VDD 功能 接电源地 数据输出 接+5V电源 电路连接情况 DGND P3.5端 VCC 每一个DS18B20包括一个唯一的64位长的序号,该序号存放在DS18B20内部的ROM中。开始8位是产品类型编码(DSl820编码均为10H)接着的48位是每个器件唯一的序号最后8位是前面56位的CRC(循环冗余校验)码DSl820中还有用于贮存测得的温度值的两个8位存贮器RAM编号为0号和1号1号存贮器存放温度值的符号如果温度为负,则1号存贮器8位全为1,否则全为00号存贮器用于存放温度值的补码LSB(最低位)的1表示0.5。DS1820用9位存贮温度值,最高位为符号位下表为DS18B20的温度存储方式负温度S=1正温度S=0。
表4-2 DS18B20温度存储 LSB MSB Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 26 Bit15 S 25 Bit14 S 24 Bit13 S 23 Bit12 S 22 Bit11 S 21 Bit10 S 20 Bit9 S 2?1 Bit8 S 4.1.1 DS18B20工作过程及时序
DS18B20 工作过程中的协议如下: 1. 初始化
单总线上的所有处理均从初始化开始。 2. ROM操作指令
主机检测到DS18B20的存在,便可以发出ROM操作命令之一,这些命令如
指令 代码 Read ROM(读ROM) [33H] Match ROM(匹配ROM) [55H] Skip ROM(跳过ROM] [CCH] Search ROM(搜索ROM) [F0H]
陕西科技大学毕业论文(设计说明书) 18
Alarm search(告警搜索) [ECH]
3. 存储器操作命令
指令 代码 Write Scratchpad(写暂存存储器) [4EH] Read Scratchpad(读暂存存储器) [BEH] Copy Scratchpad(复制暂存存储器) [48H] Convert Temperature(温度变换) [44H] Recall EPROM(重新调出) [B8H] Read Power supply(读电源) [B4H] 4. 时序
主机使用时间隙(time slots)来读写DSl820的数据位和写命令字的位[9]。 (1)初始化
时序见图2.25-2主机总线to时刻发送一个复位脉冲(最短为480us的低电平信号),接着在tl时刻释放总线并进入接收状态,DSl8B20在检测到总线的上升沿之后,等待15-60us接着DS1820在t2时刻发出存在脉冲(低电平持续60-240 us)如图中虚线所示
图4-2 初始化时序图
(2)写时间隙
当主机总线to时刻从高拉至低电平时就产生写时间隙见图,从to时刻开始15us之内应将所需写的位送到总线上DSl8B20在t后15-60us间对总线采样若低电平写入的位是0见图,若高电平写入的位是1见图,连续写2位间的间隙应大于1us。
图4-3 写0时序图 图4-4 写1时序图
(3)读时间隙
主机总线to时刻从高拉至低电平时,总线只须保持低电平l 7ts,之后在t1时刻将总线拉高,产生读时间隙,读时间隙在t1时刻后t2时刻前有效。t2距to为15u,s也就是说,t2时刻前主机必须完成读位,并在to后的60us一120 us内释放总线。读位子程序(读得的位到C中)[10]。
太阳能热水器控制器的设计 19
图4-5 读时序图
4.1.2 DS18B20的驱动程序
void delay(uint i) //延时函数 {
while(i--); }
Init_DS18B20(void) //初始化函数 {
uchar x=0;
DQ = 1; //DQ复位 delay(8); //稍做延时 DQ = 0; //单片机将DQ拉低 delay(80); //精确延时 大于 480us DQ = 1; //拉高总线 delay(14);
x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败 delay(20); }
Read(void) //读一个字节 {
uchar i=0; uchar dat = 0; for (i=8;i>0;i--)
{
DQ = 0; // 给脉冲信号 dat>>=1;
DQ = 1; // 给脉冲信号 if(DQ) dat|=0x80; delay(4); }
return(dat);
陕西科技大学毕业论文(设计说明书) }
Write(uchar dat) //写一个字节 {
uchar i=0; for (i=8; i>0; i--) { DQ = 0; DQ = dat&0x01; delay(5); DQ = 1; dat>>=1; }
}
ReadTemperature(void) //读取温度 {
uchar a=0; uchar b=0; uint t=0; float tt=0; Init_DS18B20();
Write(0xCC); // 跳过读序号列号的操作 Write(0x44); // 启动温度转换 Init_DS18B20();
Write(0xCC); //跳过读序号列号的操作
Write(0xBE); //读取温度寄存器等(共可读9个寄存器) a=Read(); b=Read(); t=b; t<<=8; t=t|a;
tt=t*0.0625; //将温度的高位与低位合并 t= tt*10+0.5; //对结果进行4舍5入 return(t);
20
前两个就是温度 }太阳能热水器控制器的设计 21
4.2串行AD转换器ADC0832程序设计
由于微机只能处理数字化的信息,而在实际应用中被控对象常常是连续变化的物理量,因此,微机用于控制系统是需要有能把模拟信号转换成数字信号的接口,以便能对被控制对象进行处理和控制。A/D转换器就是承担这样的任务,A/D转换就是把模拟量转化成为二进制的数字量,一般的A/D转换过程是通过采样、保持,量化,编码4个步骤完成的,这些往往是合并运行的。
输入配置可在多路器寻址时序中进行。多路器地址可通过DI端移入转换器。多路器地址选择模拟输入通道可决定输入是单端输入还是差分输入[11]。当输入是差分时,应分配输入通道的极性,并应将差分输入分配到相邻的输入通道对中。例如通道0和通道1可被选为一对差分输入。另外,在选择差分输入方式时,极性也可以选择。一对输入通道的两个输入端的任何一个都可以作为正极或负极。通常ADC0832在输出以最高位(MSB)开头的数据流后,会以最低位(LSB)开头重输出一遍(前面的数据流)。(因此,编程时要发两轮脉冲,第一次取数据,第二次若不要从低到高的数据,也要发一轮8 个脉冲将ADC0832中寄存器的数据移出。其工作时序如下所示:
图4-6 ADC0832读写时序图
ADC0832有8只引脚,CH0和CH1为模拟输入端,CS为片选引脚,只有CS置0才能对ADC0832进行配置和启动转换。CLK为ADC0832的时钟输入端。CS在整个转换过程中都必须为低,当CS为低时,在数据输入端DI(数据输入端)加一个高电平(这个高电平是算在送到DI的一位之中,那么后面就只要再送两位。这个高电平是作为起始标志),接着在CLK上加一个时钟,DI上的逻辑1就会使ADC0832的DI脱离高阻态,然后通道配置数据伴随着时钟通过DI端移入多路器,当最后一位数据移入多路器时(数据是三位,前一位标志输入开始,后两位是用来作通道设置和选择),DI变为高阻态,在这以前DO(数据输出端)都为高阻态(就是CS从高跳到低到现在)。在经过一个时钟(是指在最后一个数据从DI移入后,还要再经过一个时钟,当最后一位数据移入DI,需要再加一个时钟使DO脱离高阻态),DO脱离高阻状态并启动转换。接着