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

📄 can18b20.c

📁 基于CAN总线的 温度采集方法。选用DS18B20温度传感器。
💻 C
📖 第 1 页 / 共 2 页
字号:
			PORTC &= ~DQ;					//	pull DQ low to start timeslot
			delay_us(10);
			PORTC |= DQ;
			delay_us(100);
		}
		else
		{
			PORTC &= ~DQ;					//	pull DQ low to start timeslot
			delay_us(100);
			PORTC |= DQ;
			delay_us(10);
		}
		value >>= 1;
	}
}

/*===================================================================
//	函数功能:	读取温度
//	形参:		*temperature	温度存储空间
//	返回:		unsigned char	true为有效
//	编写:		2004/8/25
===================================================================*/
/*unsigned char	Read_Temperature(unsigned int *temperature)
{
	unsigned char	i;
	union{
		unsigned char c[2];
		unsigned int x;
	}temp;
	unsigned char	temporary[9];

	while(!ds1820_ack());
	write_byte(0xCC);						//	Skip ROM
	write_byte(0x44);						//	Start Conversion
	//for(i = 0; i < 16; i++)
		//delay_us(50000);
	delay(20);
	while(!ds1820_ack());
	write_byte(0xCC);						//	Skip ROM
	write_byte(0xBE);						//	Read Scratch Pad
	for(i = 0; i < 9; i++)
		temporary[i] = read_byte();
	temp.c[0] = temporary[0];
	temp.c[1] = temporary[1];
	
	if(crccheck(temporary,9))
		return	0;
	else
	{	
		*temperature = temp.x;
		return	1;
	}
}
*/
/*===================================================================
//	函数功能:	读取Rom Code
//	形参:		*temp		DS18B20的Rom Code存储空间
//	返回:		unsigned char	true为有效
//	编写:		2004/8/25
===================================================================*/
/*unsigned char	Read_RomCode(unsigned char *temp)
{
	ds1820_ack();
	write_byte(0x33);
	temp[0] = read_byte();
	temp[1] = read_byte();
	temp[2] = read_byte();
	temp[3] = read_byte();
	temp[4] = read_byte();
	temp[5] = read_byte();
	temp[6] = read_byte();
	temp[7] = read_byte();
	if(crccheck(temp,8))
		return	0;
	else
		return	1;
}
*/
/*===================================================================
//	函数功能:	匹配DS18B20
//	形参:		*p	DS18B20的Rom Code
//	返回:		void
//	编写:		2004/8/25
===================================================================*/
/*void ds1820_match(unsigned char *p)
{
	unsigned char i;
	ds1820_ack();
	write_byte(0x55);	 
	for(i=0;i<8;i++)
		write_byte(p[i]);
}
*/


/*nms delay*/
void wait(unsigned int n)
{unsigned int i;
 for(i=0;i<n;i++)
 delay_1ms();
}

/*1ms delay*/
void delay_1ms(void)
{unsigned int i;
 for(i=0;i<1035;i++);
}

void delay(unsigned int n)
{ unsigned int i;
  for(i=0;i<n;i++)
   asm("nop");
}

/*595数据传输*/
void HC595_SENDDAT(unsigned char dat)
{unsigned char i;
  C_CS;  //cs 拉低
  asm("nop");
  for(i=0;i<8;i++)
  {C_CLK ;  //时钟拉低
     asm("nop");
     if((dat&0x80)!=0)
     S_DATA;
     else
     C_DATA; 
     dat<<=1;
	 asm("nop");
  S_CLK;  // 时钟拉高
 }
 S_CS;  //cs 拉高
}
//定时器1中断,1ms中断一次
#pragma interrupt_handler time0_ovf_isr:10
void time0_ovf_isr(void)
{
 TCNT0=0xF8; //重新装置
 count++;
 if(count>=100)  //100ms
    count=0;
   if(flag==0)
     {     flag=1;
	        //个位显示
	       PORTC&=(~0x18);
		   HC595_SENDDAT(table[ge]|0x80); //加小数点
		   PORTC|=0x10;
		   }
	else
	{     flag=0;		     
		   //十位显示
		   PORTC&=(~0x18);
		   HC595_SENDDAT(table[shi]); 
		   PORTC|=0x08;
		   }
		   
}

/*************************** 主机先发送,等待接收***************************/
/* 说明:外部中断0不使能,如果允许,显示保持不住。*/
void main( void )
{	unsigned char	i,j;
	unsigned char teml,temh;
    unsigned char a=0; 
    unsigned int m;
	unsigned char	temporary[9];
	 //M8 端口初始化
	 PORTB=0x07;  //MCP2515 disable(CS,PB2),PB1,PB0上、下行灯灭
     DDRB|=0x07; 
	 DDRD=0xC0;  //1100 0000 PD7、PD6输出保持,PD5、PD4按键输入	
	 PORTC=0x02;  //CS disable
	 DDRC|=0x1F;    //PC3为595的位选COM2(十位),PC4为595的位选COM1(个位)+595(PC0、PC1、PC2)
	 /*use int0*/
	// GICR|=0x40;   //int0 enable
	//MCUCR|=0x02;  //下降沿触发中断0
	//uart_init();  //串口初始化
	//初始化SPI
	 init_SPI();
	//reset mcp2515
   	 reset_MCP();  
	//初始化 CAN
     init_can();
	 minus_flag=0; //初始化负温度标志
	 CLI(); //关中断
	//矫正第一次数据,不矫正第一次显示85
	    while(!ds1820_ack());
	    write_byte(0xCC);						//	Skip ROM
	    write_byte(0x44);						//	Start Conversion
	    wait(750);
	    while(!ds1820_ack());
		write_byte(0xCC);						//	Skip ROM
	    write_byte(0xBE);						//	Read Scratch Pad
	 	teml = read_byte();	
		temh = read_byte();	
		m=temh*256+teml;
		  if ((m&0xf800)!=0)
             {minus_flag=1;
			  m=(~m)+1; //取反
              a=(unsigned char)((m*5)/80);}
          else
              a=(unsigned char)((m*5)/80);
		shi=a/10;
        ge=a%10;
		if(minus_flag==1)
		wendu=a|0x80; //暂时做 char处理
		else
		wendu=a;
	TCNT0=0xF8;//1ms
	TCCR0=5; //1024
	TIMSK=(1<<TOIE0);
	count=0;
	dot1=0;
	//开中断
	SEI(); 
	while(1)
	{ if(count==0)
	   { fill_msg_box_0(); //填充CAN数据
	     send_box_0(); //发送CAN信息
		 minus_flag=0;  //负温度标志清0
		 // 读取温度值
		CLI();
	    while(!ds1820_ack());
		SEI();
	    write_byte(0xCC);						//	Skip ROM
	    write_byte(0x44);						//	Start Conversion
		delay(20);
		CLI();
		while(!ds1820_ack());
		SEI();
		write_byte(0xCC);						//	Skip ROM
	    write_byte(0xBE);						//	Read Scratch Pad
		for(j = 0; j < 9; j++)
		temporary[j] = read_byte();
	     if(!crccheck(temporary,9))  //CRC校验正确
		   { 
		    teml=temporary[0];
		    temh=temporary[1];
		    // 处理小数第一位
			j=teml&0x0F;
			//温度十位个位处理
			 teml>>=4;
			 temh<<=4;
			 i=teml|temh;
			 if(i>=0x80) //是负温度
			  {minus_flag=1;
			   i=~i; //取反
			   j=(~j)&0x0F;
			   j=j+1;} //加1
			 switch(j) //小数第一位
			  {case 0:
			   case 1:{dot1=0;break;}
			   case 2:
			   case 3:{dot1=1;break;}
			   case 4:{dot1=2;break;}
			   case 5:
			   case 6:{dot1=3;break;}
			   case 7:{dot1=4;break;}
			   case 8:
			   case 9:{dot1=5;break;}
			   case 10:
			   case 11:{dot1=6;break;}
			   case 12:{dot1=7;break;}
			   case 13:
			   case 14:{dot1=8;break;}
			   case 15:{dot1=9;break;}
			   case 16:{dot1=0;i=i+1;break;}
			   default:break;
			  }
			shi=i/10; //十位
			ge=i%10; //个位
			if(minus_flag==1)//负温度
			wendu=i|0x80; //暂时做 char处理 
			else
			wendu=i;
		 }
	   }   
	} 
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -