⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rount4.c

📁 一个温度采集系统的单片机程序与WINDOWS 串口通信程序
💻 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 + -