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

📄 18b20liangwei.c.txt

📁 关于DSB20的程序
💻 TXT
字号:
#include <reg52.h>
#include <absacc.h>
#include <stdlib.h>
#include <stdio.h>

#define uchar unsigned char
#define uint unsigned int

/*HD7279*/	   //指令
#define CMD_RESET 0x0a4
#define CMD_TEST 0x0bf
#define DECODE0 0x80
#define DECODE1 0x0c8
#define CMD_READ 0x15
#define UNDECODE 0x90
#define RTR_CYCLE 0xa3
#define RTL_CYCLE 0xa2
#define RTL_UNCYL 0xa0
#define ACTCTL 0x98
#define SEGON 0xe0
#define SEGOFF 0xc0
#define BLINKCTL 0x88


/*	端口定义	*/
sbit clk=P1^1;
sbit dat=P1^0;
sbit keypad=P1^2;
sbit hd72a=P2^1;
sbit TMDAT = P2^0;	   //根据实实际情况设定	
//sbit TMDAT = P1^4;	//根据实实际情况设定	


	 /*函数声明	*/
void tmreset (void)	  ;
bit tmrbit (void)  ;
unsigned char tmrbyte (void) ;	
void tmwbyte (unsigned char dat)   ;
void tmstart (void)	;	
void tmrtemp (void)	;
void dmsec(void);

void long_delay(void);
void short_delay(void);
void write7279(unsigned char,unsigned char);
void send_byte(unsigned char);
void printdata(int datae);


	 /*	变量定义	*/
int TMP;		//读取后温度值存于TMP中,将其除以2即可得出实际温度;
uchar f;		//结果是否为负温,“0”为正温,“1”为负温。

/**************************   main  ***************************/
void main(void)
{
   
	unsigned int a;
     
	while(1)
	{
	     tmstart();						//
		long_delay();
			long_delay();
		long_delay();	  //如果是不断地读取的话可以不延时	//
		tmrtemp();	//读取温度,执行完毕温度将存于TMP中	//
		a=TMP;
         printdata(a);
	}
}
/*main*/
/////////////////////////////////////// 发送复位//////////////////////////
void tmreset (void)							//
{		                  		 			//
	unsigned int i;							//
	TMDAT = 0;							//
	i = 103;							//
	while (i>0) i--;         	// 延时 900 uS(11.0592Mhz时)	//
	TMDAT = 1;							//
	i = 4;								//
	while (i>0) i--;						//
}									//
//////////////////////////////////////////////////////////////////////////


//判断DS1820是否存在的子程序。最好不要用,因为当器件不存在时将会进入死循环

////////////////////////////////////// 等待存在脉冲///////////////////////
void tmpre (void)			//判断器件是否存在		//
{                     							//
	unsigned int i;							//
	while (TMDAT);							//
	while (~TMDAT);							//
	i = 4; while (i>0) i--;						//
}									//
//////////////////////////////////////////////////////////////////////////


///////////////////////////////////// 读一位//////////////////////////////
bit tmrbit (void)							//
{                   							//  
	unsigned int i;							//
	bit dat;							//
	TMDAT = 0; i++;							//
	TMDAT = 1; i++; i++;		//微量延时			//
	dat = TMDAT;							//
	i = 8; while (i>0) i--;		// 延时				//
	return (dat);							//
}									//
//////////////////////////////////////////////////////////////////////////


//////////////////////////////////////// 读一个字节///////////////////////
unsigned char tmrbyte (void) 			 			//
{         								//
	unsigned char i,j,dat;						//
	dat = 0;							//
	for (i=1;i<=8;i++)						//
	{								//
		j = tmrbit ();						//
		dat = (j << 7) | (dat >> 1);				//
	}								//
	return (dat);							//
}									//
//////////////////////////////////////////////////////////////////////////


/////////////////////////////////////// 写一个字节////////////////////////
void tmwbyte (unsigned char dat)					//
{                							//
	unsigned int i;							//
	unsigned char j;						//
	bit testb;							//
	for (j=1;j<=8;j++)						//
	{								//
		testb = dat & 0x01;					//
		dat = dat >> 1;						//
		if (testb)						//
		{							//
			TMDAT = 0;                           // 写0 	//
			i++; i++;                            		//
			TMDAT = 1;					//
			i = 8; while (i>0) i--;              		//
		}							//
		else							//
		{							//
			TMDAT = 0;                           // 写0 	//
			i = 8; while (i>0) i--;              		//
			TMDAT = 1;					//
			i++; i++;                            		//
		}							//
	}								//
}									//
//////////////////////////////////////////////////////////////////////////

/////////////////////////////////发送ds1820 开始转换//////////////////////
void tmstart (void)							//
{                   							//
	tmreset ();		//复位					//	
    	long_delay();
	long_delay();
   long_delay();		//延时			
	tmwbyte (0xcc);		//跳过序列号命令			//
	tmwbyte (0x44); 	//发转换命令 44H,			//
}									//
//////////////////////////////////////////////////////////////////////////


/////////////////////////////////// 读取温度//////////////////////////////
void tmrtemp (void)							//
{                   							//
	unsigned int a,b,xiaoshu1,xiaoshu2,xiaoshu;						//
	tmreset ();		//复位					//
    	long_delay();
	long_delay();
	long_delay();		  //延时	
	tmwbyte (0xcc); 	//跳过序列号命令			//
	tmwbyte (0xbe); 	//发送读取命令 				//
	 a= tmrbyte ();		//读取低位温度				//
	b= tmrbyte ();  	//读取高位温度				//
	f=b;			//若b为1则为负温			//
	if(b>0x7f) 								//
	{								//
		TMP=~a+1;	//如果为负温则去除其补码		//
	}								//
	else								//
    {								
	   TMP=a/16+b*16; 	  //整数
       xiaoshu1= (a&0x0f)*10/16; //小数第一位
	   xiaoshu2=(a&0x0f)*100/16%10;                      //小数第二位
	   xiaoshu=xiaoshu1*10+xiaoshu2;
	   TMP=TMP*100+xiaoshu; 
	}								//

}									//
//////////////////////////////////////////////////////////////////////////

/*************************  HD7279  ***************************/
void printdata(int datae)
{
	idata unsigned char ls;
	ls=0;
	write7279(DECODE0+ls,datae/1000);ls++;
	write7279(DECODE0+ls,(datae%1000/100)|0x80); ls++;
	write7279(DECODE0+ls,(datae%1000%100/10)); ls++;
	write7279(DECODE0+ls,datae%1000%100%10);
}
void write7279(unsigned char cmd,unsigned char dat1)
{
	idata unsigned char i;
	hd72a= 0;  long_delay();
	for (i=0;i<8;i++)
	{
		 if (cmd&0x80) {   dat=1; }
		else          {   dat=0; }
		clk=1;  short_delay(); clk=0; short_delay();
		cmd=cmd*2;
	}
	for (i=0;i<8;i++)
	{
		if (dat1&0x80) {   dat=1; }
		else           {   dat=0; }
		clk=1;  short_delay(); clk=0; short_delay();
		dat1=dat1*2;
	}
	dat=0;
	hd72a = 1;
}

void send_byte(unsigned char out_byte)
{
	idata  unsigned char i;
	hd72a = 0;   long_delay();
	for (i=0;i<8;i++)
	{
		if (out_byte&0x80)  {   dat=1; }
		else                {   dat=0; }
		clk=1;  short_delay();  clk=0;  short_delay();
		out_byte=out_byte*2;
	}
	dat=0;
	hd72a = 1;
}

void long_delay(void)
{
   idata unsigned char i;   for (i=0;i<0xff;i++) { ;}
}

void short_delay(void)
{
    idata unsigned char i;   for (i=0;i<8;i++);
}


⌨️ 快捷键说明

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