📄 ds1820ds1822温度传感器函数.txt
字号:
Dallas Semiconductor DS1820/DS1822 Temperature Sensors Functions - DS1820/1822
温度传感器函数
只有商业版的CodeVisionAVR C Compiler才有这部分功能。
这些函数的原型放在“..\INC”目录的“ds1820.h”头文件中。使用这些之前必须用
“#include”包含头文件。
单线总线的函数原型自动在ds1820.h 中被包含。.
包含头文件之前,你必须先声明那些口线使用单线通讯协议与器件通讯。
例子:
/* 指定单线总线使用的口和口线 */
#asm
.equ __w1_port=0x18 ;PORTB
.equ __w1_bit=2
#endasm
/* 包含头文件 */
#include <ds1820.h>
int ds1820_temperature_10(unsigned char *addr) - 返回ROM 码存在地址addr处的数组
中的DS1820/DS1822 的温度。
温度的值为0.1 摄氏度。如果有错误,返回值为-9999。
如果只有1 个DS1820/DS1822,就不需要ROM 码,指针addr要设为NULL(0)。
如果有多个器件要首先读ROM 码对每一个器件进行识别,然后才能在调用
ds1820_temperature_10时对需要的器件通过ROM 码进行地址匹配。
例子:
#include <90s8515.h>
/* 指定用作单线总线的口和口线 */
#asm
.equ __w1_port=0x18 ;PORTB
.equ __w1_bit=2
#endasm
/* 包含单线总线的头文件 */
#include <1wire.h>
/* 包含有printf函数原型的头文件 */
#include <stdio.h>
/*包含有abc 函数原型的头文件*/
#include <math.h>
/* 单线总线上DS1820 的最大个数*/
#define MAX_DEVICES 8
/* DS1820/DS1822 的ROM 码存储区,每个器件9 字节,前8 字节是ROM 码,一个字
节是CRC */
unsigned char rom_codes[MAX_DEVICES,9];
main()
{unsigned char i,j,devices;int temp;
/* 初始化UART 波特率 */
UBRR=xtal/16/baud-1;
/* 初始化UART 控制寄存器 */
UCR=8;
/* 检测有多少个DS1820/DS1822,并存放它们的ROM 码到rom_codes 数组 */
devices=w1_search(0xf0,rom_codes);
/* 显示个数 */
printf("%-u DEVICE(S) DETECTED\n\r",devices);
/* 如果没有器件则系统挂起 */
if (devices==0) while (1);
/* 测量并显示温度 */
while (1) { for (i=0;i<devices;)
{temp=ds1820_temperature_10(&rom_codes[i,0]);
printf("t%-u=%-i.%-u\xf8C\n\r",++i,temp/10,
abs(temp%10));
};
};
}
unsigned char ds1820_set_alarm(unsigned char *addr,signed char temp_low,signed char
temp_high) - 设置DS1820/DS1822 的低温、高温报警温度。
如果设置成功返回1,否则返回0。
报警温度存在DS1820/DS1822 的暂存器SRAM 和EEPROM 中。
用来寻址器件的ROM 码放在addr指向的数组。
如果只有1 个DS1820/DS1822,就不需要ROM 码,指针addr要设为NULL(0)。
DS1820/DS1822 的温度报警状态可以用w1_search 函数发送报警搜索(Alarm Search)
- Ech 命令检测到。
#include <90s8515.h>
/* 指定用作单线总线的口和口线 */
#asm
.equ __w1_port=0x18 ;PORTB
.equ __w1_bit=2
#endasm
/* 包含单线总线的头文件
#include <ds1820.h>
/* 包含有printf函数原型的头文件 */
#include <stdio.h>
/*包含有abc 函数原型的头文件*/
#include <math.h>
/* 单线总线上DS1820 的最大个数*/
#define MAX_DEVICES 8
/* DS1820/DS1822 的ROM 码存储区,每个器件9 字节,前8 字节是ROM 码,一个字
节是CRC */
unsigned char rom_codes[MAX_DEVICES,9];
/* 给发生温度报警的器件分配ROM 码存储空间*/
unsigned char alarm_rom_codes[MAX_DEVICES,9];
main()
{unsigned char i,j,devices;
int temp;
/* 初始化UART 波特率 */
UBRR=xtal/16/baud-1;
/* 初始化UART 控制寄存器 */
UCR=8;
/* 检测有多少个DS1820/DS1822,并存放它们的ROM 码到rom_codes 数组 */
devices=w1_search(0xf0,rom_codes);
/* 显示个数 */
printf("%-u DEVICE(S) DETECTED\n\r",devices);
/* 如果没有器件则系统挂起 */
if (devices==0) while (1); /* loop forever */
/* 设置所有器件低温报警25 摄氏度,高温报警35 摄氏度*/
for (i=0;i<devices;i++)
{printf("INITIALIZING DEVICE #%-u ", i+1);
if (ds1820_set_alarm(&rom_codes[i,0],25,35))
putsf("OK"); else putsf("ERROR");
};
while (1)
{/* 测量并显示温度 */
for (i=0;i<devices;)
{temp=ds1820_temperature_10(&rom_codes[i,0]);
printf("t%-u=%-i.%-u\xf8C\n\r",++i,temp/10,
abs(temp%10));
};
/* 显示发生温度报警的器件的号码*/
printf("ALARM GENERATED BY %-u DEVICE(S)\n\r",
w1_search(0xec,alarm_rom_codes));
};
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -