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

📄 1820.c

📁 单片机与数字温度传感器DS4820接口驱动程序
💻 C
字号:
//#include <stdio.h>
#include <reg52.h>
#include <intrins.h>
///////////////////////////////////////////////////////////////
#define   uchar      unsigned  char
#define   uint       unsigned  int
sbit      DQ=P3^3	  ;
sbit  	  led0=P3^1		;
sbit  	  led1=P3^2	;
sbit  	  led2=P3^3	;
sbit  	  led3=P3^4	;
uchar temp[7];
///////////////////////////////////////////////////////////////
uchar data temp_data[2]={0x00,0x00};
uchar dispaly[6];
void ds_reset(void);
void write_byte(uchar value);
uchar read_byte(void);
void delay(uint i);
void read_temp();
void work_temp();
void StartUART( void );
void work_temp();
void R_S_Byte(uchar R_Byte);
//////////////////////////////////////////////////////////////
uchar seg[10]={0xC0,0xCF,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};         //0~~9段码
uchar seg1[10]={0x40,0x4F,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};         //0~~9段码
///////////////////////////////////////////////////////////////
delay1(uchar x)
{
	uchar i;
	while(x--)
	{
	for(i=0;i++;i<10);
	}
}

void StartUART( void )
{  							//波特率4800
     SCON = 0x50;
     TMOD = 0x20;
     TH1 = 0xFA;
     TL1 = 0xFA;
     PCON = 0x00;
     TR1 = 1;
}
///////////////////////////////////////////////////////
void R_S_Byte(uchar R_Byte)
{	
	 SBUF = R_Byte;  
     while( TI == 0 );				//查询法
  	 TI = 0;     
}
///////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////
void delay(uint i)
{
	for(;i>0;i--);   
}
///////////////////////////////////////////////////////////////////////////////
void ds_reset(void)
{
	char temp=1;
	while(temp)
{
 while(temp)
{
    DQ=1;_nop_();_nop_();
	DQ=0;
	delay(80);
	DQ=1;
	delay(9);
	temp=DQ;
  } 
  	delay(64);
 	temp=~DQ;  
}
DQ=1;
 }
/////////////////////////////////////////////////////////////////////////////////
void write_byte(uchar value)
{
	uchar i;
	for(i=8;i>0;i--)
{
 	DQ=1;_nop_();_nop_();
  	DQ=0;_nop_();_nop_();_nop_();_nop_();_nop_();
 	DQ=value&0x01;
  	delay(9);
    value>>=1;
} 
	DQ=1;
	delay(1);
}
///////////////////////////////////////////////////////////////////////////////////////
uchar read_byte(void)
{
	uchar i;
	uchar value1=0;
for(i=8;i>0;i--)
{
	DQ=1;_nop_();_nop_();
	value1>>=1;
	DQ=0;
	_nop_();_nop_();_nop_();_nop_();
	DQ=1;
	_nop_();_nop_();_nop_();_nop_();
	if(DQ) 
	value1|=0x80;
 	delay(9);
}
	DQ=1;
	return(value1);
}
////////////////////////////////////////////////////////////////////////
void read_temp()
{
	ds_reset();
	write_byte(0xcc);
	write_byte(0xbe);
	temp_data[0]=read_byte();
	temp_data[1]=read_byte();
	ds_reset();
	write_byte(0xcc);
	write_byte(0x44);
}
/////////////////////////////////////////////////////////////////////////////////////
void work_temp()
{
	uchar n=0;
if(temp_data[1]>127)
	{
	temp_data[1]=(256-temp_data[1]);
	temp_data[0]=(256-temp_data[0]);
	n=1;
	}
	dispaly[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4);
	dispaly[3]=dispaly[4]/100;				//百位
	dispaly[2]=dispaly[4]%100;				//
	dispaly[1]=dispaly[2]/10;				//十位
	dispaly[0]=dispaly[2]%10;				//个位	
	
	switch	(temp_data[0]&0x0f)
	{
	case 0x0f:dispaly[5]=9;break;
	case 0x0e:dispaly[5]=9;break;
	case 0x0d:dispaly[5]=8;break;
	case 0x0c:dispaly[5]=8;break;
	case 0x0b:dispaly[5]=7;break;
	case 0x0a:dispaly[5]=6;break;
	case 0x09:dispaly[5]=6;break;
	case 0x08:dispaly[5]=5;break;
	case 0x07:dispaly[5]=4;break;
	case 0x06:dispaly[5]=4;break;
	case 0x05:dispaly[5]=3;break;
	case 0x04:dispaly[5]=3;break;
	case 0x03:dispaly[5]=2;break;
	case 0x02:dispaly[5]=1;break;
	case 0x01:dispaly[5]=1;break;
	case 0x00:dispaly[5]=0;break;
	default:break;
	}
if(!dispaly[3])								//百位何?时不显示
	{
	dispaly[2]=0x0a;						
	if(!dispaly[1])							//十位为0时显示0				
	{
	dispaly[1]=0x0a;
	}
	}
if(n)										//负值时显示-
	{
	dispaly[3]=0x0B;
	}
}

////////////////////////////////////
void disdignit()
{
	char i;
	for(i=0;i<3;i++)
		{
			P2=0xC6;
			led0=0;
			delay1(450);
			led0=1;
			P2=seg[dispaly[1]];
			led1=0;
			delay1(450);
			led1=1;
				P2=seg1[dispaly[0]];
				led2=0;
			delay1(450);
			led2=1;
				P2=seg[dispaly[5]];
			led3=0;
				delay1(450);
				led3=1;
			}
}
//////////////////////////////////////////////////////////
main()
 {
 	StartUART();
	delay(500);
 	ds_reset();
 write_byte(0xcc);
 	write_byte(0x44);
while(1)
  {
 // 	R_S_Byte(0x00);
	read_temp();
//	R_S_Byte(temp_data[0]);
//	R_S_Byte(temp_data[1]);
	work_temp();
	R_S_Byte(	dispaly[1]);
	R_S_Byte(	dispaly[0]);
	R_S_Byte(	dispaly[5]);
	disdignit();
	delay(50000);
  }
}

⌨️ 快捷键说明

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