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

📄 inv-6(ok).c

📁 18b20 6010a 源程序 提供给大家交流
💻 C
字号:
/***********************************************************
Declaration:CPU is dspic30f6010a,crystal:10Mhz,ccpl:8,speed:20Mhz
            Author is Heri Cui
            Date is 22/09/07
            In order to replace 8xc196mc for inverter 
Attention:变量与数组写在一个文件中,直接包含就可以了
***********************************************************/ 
#include "p30f6010a.h"                           //这里包含过来就可以直接用了     
#include "math.h"           
#include "stdio.h"
#include "define.h"                              //定义部分
#include "initial.h"                             //初始化
/*************************************************************
 延时10us子程序
*************************************************************/
void delay(uint i)     //delay(1)最小延时14 us   延时子程序
{
	  uint i2;	  
	  i2=i*8;	  
    while(i2--);      	
}
/*************************************************************
 延时1us子程序
*************************************************************/
void delayy(void)      //delay   延时1.7us子程序
{	  
    ;	 
}




unsigned char ReadOneChar(void)  
{ //读一个字节
    unsigned char i=0;
    unsigned char dat = 0;
	  for (i=8;i>0;i--)   
		{
		    TRISE &=~0x0020;//输出
		    SomeNOP();
        LATE &=~0x0020; //给脉冲信号0
        SomeNOP();
        SomeNOP();
        SomeNOP();
        dat>>=1;
        LATE |=0x0020; // 给脉冲信号1
        SomeNOP();
        TRISE |=0x0020;//输入
        SomeNOP();
        if(_RE5) dat|=0x80;
        delay(7);
    }
    return(dat);
}
void WriteOneChar(unsigned char dat)  
{                          //写一个字节
    unsigned char i=0;
  	TRISE &=~0x0020;       //输出
    for (i=8; i>0; i--) 
    {
    		LATE  &=~0x0020;   //0
    		SomeNOP();    		        
        SomeNOP();
				SomeNOP();
        if(dat&0x01)      
        	 LATE |= 0x0020; //输入
        else           
        	 LATE &=~0x0020; // 给脉冲信号
        delay(8);
        LATE  |=0x0020; 
        SomeNOP();       
        dat>>=1;
    }    
}

/*************************************************************
 初始化DS18B20温度传感器子程序 
*************************************************************/
void Ini_ds18b20(void) 
{ 	 
 uchar yes_ds18b20=1; 
 TRISE=TRISE&0xffdf; 
 LATE=LATE|0x0020;
 asm("nop");
 asm("nop");
 asm("nop");
 LATE=LATE&0xffdf;
 delay(56);                                      //精确延时 大于 14*40=540us 
 LATE=LATE|0x0020; 
 delay(7);                                       //14*5us 15到60us,大于60us,肯定是低电平的
 ////// 
 TRISE=TRISE|0x0020;
 if(_RE5) yes_ds18b20=1;
 else	 yes_ds18b20=0; 
 delay(25);                                      //这里要大于240us
 TRISE=TRISE&0xffdf; 
 LATE=LATE|0x0020; 
 delay(25);                                      //delay(5)+delay(18)+delay(18)要超过480us
}
/*************************************************************
  从DS18B20写位到CPU子函数
*************************************************************/
void Write_bit(uchar b)
{
	TRISE=TRISE&0xffdf; 
	if(b)
		{
		LATE=LATE&0xffdf;	
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");				
		LATE=LATE|0x0020; 
		delay(7);	    //14*6=84
	}
	else				    //写0
	{	/*
    LATE=LATE|0x0020;
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");*/
		LATE=LATE&0xffdf;				
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		delay(7);     //14*6=84
		LATE=LATE|0x0020;	
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");				
	}	
}
/*************************************************************
  从DS18B20读位到CPU子函数
*************************************************************/
uint Read_bit()
{
	uchar b;
  TRISE=TRISE&0xffdf; 
  /*
  LATE=LATE|0x0020;   
	asm("nop");
	asm("nop");
	asm("nop");
	asm("nop");
	asm("nop");	
	asm("nop");
	asm("nop");*/
	asm("nop");
	asm("nop");
	asm("nop");	
  LATE=LATE&0xffdf;    //读开始	
	asm("nop");
	asm("nop");
	asm("nop");
	asm("nop");
	asm("nop");	
	asm("nop");
	asm("nop");
	asm("nop");
	asm("nop");
	asm("nop");	
 	LATE=LATE|0x0020;
  asm("nop");          //这时才开始读
  TRISE=TRISE|0x0020;
  asm("nop");
  asm("nop");
  asm("nop");
  asm("nop");
  asm("nop");
  if(LATE&0x0020)
  b=1;
  else	
  b=0;  	
	delay(7);            //14*6us=84us
	TRISE=TRISE&0xffdf; 
  LATE=LATE|0x0020; 	
	asm("nop");
	asm("nop");
	asm("nop");
	asm("nop");
	asm("nop");	
	asm("nop");
	asm("nop");
	asm("nop");
	asm("nop");
	asm("nop");	 
	return b;	
}  
/*************************************************************
  从DS18B20写字节到CPU子函数
*************************************************************/
void Write_ds18b20(uchar dat)
{
	uchar i;
	uchar k;
	for(i=8;i>0;i--)
	{  
	  k=dat&0x01;	  
	  dat=dat>>1;	  
	  Write_bit(k);
	}
}
/*************************************************************
  从DS18B20读字节到CPU子函数
*************************************************************/
uint Read_ds18b20()
{
	uchar i;
	uint dat;
	uchar k;
	dat=0;	
	for(i=16;i>0;i--)
	{
		k=Read_bit();		
		if(k){dat=dat>>1;dat=dat|0x8000;}
		else {dat=dat>>1;dat=dat&0x7fff;}							
	  return dat;	 
}
}
/*************************************************************
  读取温度子程序,转换精度在不编程的情况下,是默认的12位方式
  精确到0.0625度
*************************************************************/
uint ReadTemperature(void)                      
{
	uchar T,T1;   
 	Ini_ds18b20(); 
  WriteOneChar(0xcc);  
	WriteOneChar(0x44);    //启动温度转换
	delay(8000);            //750ms 76.8*10=768
	delay(8000);
	delay(8000);
	delay(8000);
	delay(8000);
	delay(8000); 
	delay(8000);
	delay(8000);
	delay(8000);
	delay(8000);
	delay(8000); 
	delay(8000);
	delay(8000); 
	delay(8000);	
	Ini_ds18b20();
	WriteOneChar(0xcc);
	WriteOneChar(0xbe);  
	T=ReadOneChar();  
	T1=ReadOneChar();
	T>>=4;
	T1<<=4;
	T1+=T;
  return T1;	
}
/*************************************************************
   数据送显示程序
*************************************************************/
void send_data(uchar data8)
{
	uchar data9= data8;
	uchar cont;		
	for(cont=0;cont<8;cont++) 
	{						
		if(data9&0x80)
			{
		_LATC13=1;
		 delay(5);		 			
	    }
	   else
	   	{
	 	_LATC13=0;	    
	   delay(4);	 
	   		}
	   	_LATD0=0;	           //时钟的跳变
	   delay(5); 		  
	   	_LATD0=1;
	   	data9<<=1;
	   	delay(4);			    
		}		
	}
/*************************************************************
   读DS18b20直接得到的温度数据转化成十进制数据
*************************************************************/
void data_deal(uint data4)  
{	
	uint data5=data4;
	data_100=(unsigned char)((data5/100)%10);	
	data_10=(unsigned char)((data5/10)%10);
	data_1=(unsigned char)(data5%10);
	}
/*************************************************************
   主程序
*************************************************************/
int main(void)                                               //主函数
{
_TRISC13=0; 
_TRISD0=0;
_TRISD10=0;
_TRISD1=0;                                                   //DS18B20数据线
//_RE5=0;
Ini_ds18b20();
  while(1)
{  
/*	delay(1);
	_RD10=1;	
	delay(1);
	//asm("nop");	
	//delay(8000);            //750ms 76.8*10=768	
	_RD10=0;
*/	
while(jj1>60000)	                                           //这种延时方式不在原地打转,所以不浪费系统时间
				{		                                                 //TRISDbits.TRISD10=0;
				jj1=0;		
				uint k;	
				k=ReadTemperature();	                                                                                                                  
        		data_deal(k);        							     
				send_data(smb[0]);								
				send_data(smb[data_100]);						
				send_data(smb[data_10]);				 
				send_data(smb[data_1]);								  
			  }
			  jj1++; 			             
}                                                
}

⌨️ 快捷键说明

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