作业帮 > 综合 > 作业

请教关于DS18B20温度传感器的温度读取

来源:学生作业帮 编辑:拍题作业网作业帮 分类:综合作业 时间:2024/04/28 16:45:02
请教关于DS18B20温度传感器的温度读取
我想用P1口的8个引脚每个引脚挂1个DS18B20传感器,然后从P1.0开始顺序读取温度数值,温度读取的程序我有,请大侠们帮助给些端口轮流读取数据的例程,
我的程序中只有如下定义1个端口,请帮助改写:
sbit DQ=P3^7; //ds18b20 端口
我这有个现成的C源程序,你参考一下吧!
三通道18B20温度测量数码管显示.-55-+125℃,用1位数码管显示当前通道号,4位数码管显示18B20当前通道温度值(一位小数),负号位与正温度百位1用同一位数码管显示,该位为0不显示,如:0 27.9、1 123.1、2 -35.6.连接方法:三个18B20均接P3.7,P0口(JP10)接8位数码管段码口(J12).
#include
#include
typedef unsigned char uint8;
typedef unsigned int uint16;
sbit ADDR0 = P2^2;
sbit ADDR1 = P2^3;//定义38译码器地址
sbit ADDR2 = P2^4;
uint8 x,h;//定义通道
uint16 ans,ansb[3],f,g,p; //ans各通道温度值,f符号值,g为小数部分,p为1秒的计数变量
code uint8 number[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67,0x40,0x00,0x80};//0,1,2,3,4,5,6,7,8,9,-,灭,小数点
sbit DQ = P3^7; //温度DQ一线输入口
#define nops(); {_nop_(); _nop_(); _nop_(); _nop_();} //定义空指令
uint8 romid[3][8]={//romid二维数组存放每个芯片ROM编号
\x05{0x28,0xA2,0xb4,0x0A,0x00,0x00,0x00,0x83},//0通道
\x05{0x28,0xA2,0xb4,0x0A,0x03,0x00,0x00,0x83},//1通道
\x05{0x28,0xA2,0xb4,0x0A,0x05,0x00,0x00,0x83},//2通道
\x05\x05\x05\x05};
// 定时器初始化
void T1_init(void)
{
TMOD = 0x10; //定时器1工作在方式1(显示扫描定时)
TH1 = 0xfc;
TL1 = 0x67;//T1定时1ms初值
TR1 = 1;//启动T1
}
void delay(uint16 n)
{
\x05while (n--);
}
// 18B20复位函数
void DS18b20_reset(void)
{
\x05bit flag=1;
\x05while (flag)
\x05{
\x05\x05while (flag)
\x05 \x05{
\x05 \x05\x05DQ = 1;
\x05\x05\x05delay(1);
\x05 \x05\x05DQ = 0;
\x05 \x05\x05delay(50); // 550us
\x05 \x05\x05DQ = 1; //给18B20发出复位信号
\x05 \x05\x05delay(6); // 66us
\x05 \x05\x05flag = DQ; //检测18B20发出的存在脉冲"0",判断复位是否成功
\x05\x05}
\x05\x05delay(45); //延时500us
\x05\x05flag = DQ;\x05//18B20存在脉冲过后变"1",取反后仍为"0"
\x05}
\x05DQ=1;
}
//18B20写1个字节函数 * 向1-WIRE总线上写一个字节
void write_byte(uint8 val)
{
\x05uint8 i;
\x05for (i=0; i>= 1; //右移一位
\x05}
\x05DQ = 1;
\x05delay(1);
}
//18B20读1个字节函数 * 从1-WIRE总线上读取一个字节
uint8 read_byte(void)
{
\x05uint8 i,value=0;
\x05for (i=0; i>= 1;
\x05\x05DQ = 0;
\x05\x05nops(); //4us
\x05\x05DQ = 1;
\x05\x05nops(); //4us
\x05\x05if (DQ)
\x05\x05\x05value|=0x80;
\x05\x05delay(6); //66us
\x05}\x05\x05\x05\x05
\x05DQ=1;
\x05return(value);
}
// 启动温度转换
void start_temp_sensor(void)
{
\x05DS18b20_reset();
\x05write_byte(0xCC); // 发Skip ROM命令
\x05write_byte(0x44); // 发转换命令
}
// 读出温度,多点多个18B20测温主程序:
void read_temp() //读取通道x的温度值
{
uint8 i,temp_data[2];//读出温度暂放
uint16 temp;
for(x=0;x