📄 rount4.c
字号:
#include<rount3.h>
#include<reg51.h>
#include<intrins.h>
//???????????????????????????????????????????????????????
//???????????????????????????????????????????????????????
bit page_ch_flg;
unsigned char sla_adr0;
unsigned char sla_adr1;
unsigned char init_adr0;
unsigned char init_adr1;
//////////////////////////////////////////
//名称:测温子程序
//功能:读取64个DS18B20温度值,存放到扩展RAM区
//////////////////////////////////////////
void read_one_tmp(vs_rom) //读取ONE DS18B20温度值
unsigned char data *vs_rom;
{
unsigned char i;
unsigned char id_rom[8];
if(page_ch_flg==1)
{
sla_adr0|=pagel;
rdadr(&id_rom[0],sla_adr0,init_adr1,8);
goto next;
}
if(init_adr1==0xf8) //判断是否页溢出?
page_ch_flg =1;
rdadr(&id_rom[0],sla_adr0,init_adr1,8); //第一次发送EEPROM中DS18B20 ID存放首地址
next:init_adr1+=8;
if(!OWReset())
{
OWWriteByte(0x55); //写匹配ID命令
for(i=0;i<8;i++)
OWWriteByte(id_rom[i]); //发送8字节DS18B20 ID
OWWriteByte(0xBE);
for(i=0;i<2;i++)
*(vs_rom+i) =OWReadByte(); //读取2字节温度数据
// *(vs_rom+i) =0x01;
_nop_();
}
_nop_();
}
//////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////
void do_one_tmp(us_rom,us_rom_bcd) //将读取的温度数据转换成十进制数
unsigned char data *us_rom;
unsigned char data *us_rom_bcd;
{
unsigned char i =0;
unsigned char temp,shift,mode;
unsigned char us_rom_var[2];
unsigned char us_bcd_var;
float us_tmp_bcd,mode_f;
unsigned char flag;
us_rom_var[0] =*us_rom; //温度整数位
us_rom_var[1] =*(us_rom+1); //温度小数位
flag =(us_rom_var[1]>>3)&0x01;
us_rom_var[1] =((us_rom_var[1]&0x03)<<4)|((us_rom_var[0]&0xf0)>>4);
us_rom_var[0] =us_rom_var[0]&0x0f;
while(1) //计算整数值,结果存tmp_rom_bcd[1]
{
shift =0x01;
mode =1;
while(i<6)
{
temp=us_rom_var[1]&shift;
if(temp) //此位为1,加上权值
us_bcd_var+=mode;
mode=mode*2;
shift=shift<<1;
i++;
}
if(flag) //判断是否为负数?yes,整数最高位置1
us_bcd_var|=0x80;
break;
}
*(us_rom_bcd+1) =us_bcd_var; //求得温度整数位
i =0;
shift =0x01; //计算小数值,结果存tmp_rom_bcd[0]
mode_f =6.25;
while(i<4)
{
temp=us_rom_var[0]&shift;
if(temp)
us_tmp_bcd+=mode_f;
mode_f=mode_f*2;
shift=shift<<1;
i++;
}
*us_rom_bcd=us_tmp_bcd; //求得温度小数位
}
void wr_tmp_ram(vs_rom_bcd) //将BCD码温度数据存EEPROM,小数在低地址
unsigned char data *vs_rom_bcd;
{
unsigned char *p;
p =vs_rom_bcd;
wradr(p,sla_adr1,init_adr0,2);
init_adr0+=2;
}
void read_all_tmp(void) //读取64个DS18B20温度值
{
unsigned char i;
unsigned char tmp_rom[2];
unsigned char tmp_rom_bcd[2];
//unsigned char test_rom[8];
init_adr0 =0x00; //EEPROM存放首地址0x0000/0x0200
init_adr1 =0x00;
sla_adr0 =0xA0; //24C02硬件地址
sla_adr1 =0xA0;
sla_adr1 =sla_adr1|pageh;
page_ch_flg =0; //初始化相关变量
for(i=0;i<64;i++)
{
read_one_tmp(tmp_rom);
do_one_tmp(tmp_rom,tmp_rom_bcd);
wr_tmp_ram(tmp_rom_bcd);
}
// init_adr0 =0x00; //test
// sla_adr1 =0xA4;
// rdadr(&test_rom[0],sla_adr1,init_adr0,8);
// _nop_();
}
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////
//名称:温度采集
//功能:定时命令DS18B20采集温度数据,存入EEPROM中
//////////////////////////////////////////////////
void collect_ds_tmp(void)
{
if(!OWReset()) //命令DS18B20温度转
{
OWWriteByte(0xCC);
OWWriteByte(0x44);
}
delay_time_1s();
_nop_();
delay_time_1s();
read_all_tmp(); //读取温度转换数据,存入EEPROM中
}
//???????????????????????????????????????????????????????
//???????????????????????????????????????????????????????
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -