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

📄 text1.c

📁 proteus调通的DS18B20
💻 C
字号:
#include <AT89X51.H>
#include <intrins.h>
//#define unchar unsigned char
typedef unsigned char unchar;

unchar show[4]={1,2,3,4};
unchar code showtap[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67,0x77,0x7c,0x39,0x5e,0x79,0x71};  //0,1,2...显示代码
unchar b=0;
sbit DQ=P2^5;
bit  flag_1820_1;
bit flag_1820_2;
void delay_ms(unsigned char time);
void ledshow(void);
void keypress(void);
void init(void);
void gettemp();
void init1820(void);
void write1820(unchar);
unsigned char read1820(void);
void delay_us(unchar);
main()
{ //unsigned char i;
   //init();
   
    while(1)
  {   gettemp();
      ledshow();
      keypress();
	  
     
    }
}

//****************LED显示程序**************
//led 是共阴的 ,P2.0,2.1,2.2,2.3分别控制1234
void ledshow()
{ 
  unchar i,j;
  j=0xf7;  //位选
  P0=0;
  P2=0xff;
  _nop_();
  _nop_();
  for(i=0;i<4;i++)
  {
     P0=showtap[show[3-i]];  //直接转换成显示的LED码
	 P2=j>>i;
	 delay_ms(2);
	 P2=0xff;
  }
 
}
//***********************************************


//////////*************键盘程序****************
void keypress()
{
    unchar a,i,j=0xfe;
	for(i=0;i<4;i++)
	{
	   P1=(j<<i)|(j>>(8-i));  //输出扫描码
	   delay_ms(2);
       a=P1;
	   if((a&0xf0)!=0xf0)
	   {
	      delay_ms(2);
		  a=P1;
		  if((a&0xf0)!=0xf0)
		  {
		    switch(~((j<<i)|(j>>(8-i))))
  		    {
			  case 1: switch(~((a>>4)|0xf0))
			           {
					      case 1: show[b]=0;break;
						  case 2: show[b]=1;break;
						  case 4: show[b]=2;break;
						  case 8: show[b]=3;break;
					    }
						break;
			  case 2: switch(~((a>>4)|0xf0))
			           {
					      case 1: show[b]=4;break;
						  case 2: show[b]=5;break;
						  case 4: show[b]=6;break;
						  case 8: show[b]=7;break;
					    }
						break;
             case 4: switch(~((a>>4)|0xf0))
			           {
					      case 1: show[b]=8;break;
						  case 2: show[b]=9;break;
						  case 4: show[b]=10;break;
						  case 8: show[b]=11;break;
					    }
						break;
			case 8: switch(~((a>>4)|0xf0))
			           {
					      case 1: show[b]=12;break;
						  case 2: show[b]=13;break;
						  case 4: show[b]=14;break;
						  case 8: show[b]=15;break;
					    }
						break;

			}
			b++;
			if(b==4)
			b=0;
		   }
	    }
		while((a&0xf0)!=0xf0)
		{
		   a=P1;
		}
	}
}

//***************************************
//*******************DS18B20***************

void gettemp()
{  unsigned int tp;
   init1820();
   write1820(0xcc);
 //  delay_ms(2);
   write1820(0x44);
  // _nop_();
  // DQ=1;
  // delay_ms(250);     //多个1820时要延时,单个就不用,数据手册里看
  // delay_ms(250);
  // delay_ms(250);
   init1820();
   write1820(0xcc);
   write1820(0xbe);
   show[0]=read1820();
   show[1]=read1820();
   init1820();
   tp=show[1]*256+show[0];
   tp=tp>>4;
   show[0]=(unsigned char)(tp/10);
   show[1]=(unsigned char)(tp%10);
}
//********************1820初始化,读和写的子程序,延时
//*******initial**********
void init1820()
{
 DQ = 1; _nop_();
 DQ = 0;      //拉低数据线,准备Reset OneWire Bus;
 delay_us(125);  //延时510us,Reset One-Wire Bus.
 delay_us(125);
 
 DQ = 1;      //提升数据线;
 delay_us(15);  //延时35us;
 
 while(DQ)     //等待Slave 器件Ack 信号;
 { _nop_(); }
 delay_us(60);  //延时125us; 
 DQ = 1;      //提升数据线,准备数据传输;
}

//******write********
void write1820(unchar a)
{
    unchar i;
 for(i=0;i<8;i++)
 {if(a & 0x01)  //低位在前;
   {DQ = 0;    //结束Recovery time;
    _nop_();_nop_();_nop_();
    DQ = 1;   } //发送数据;
  else
   DQ = 0;    //结束Rec time;
    _nop_();_nop_();_nop_();  
    //DQ = 0;  } //发送数据;
  delay_us(30);  //等待Slave Device采样;
  DQ = 1;      //Recovery;
  _nop_();      //Recovery Time Start;
  a >>= 1;
  }

}

//*******read************
unsigned char read1820(void)
{
unsigned char i;
unsigned char tmp=0;
 DQ = 1;  _nop_();     //准备读;
 for(i=0;i<8;i++)
 {
  tmp >>= 1;    //低位先发;
  DQ = 0;      //Read init;
  _nop_();     //2ms;
  DQ = 1;      //必须写1,否则读出来的将是不预期的数据;
  delay_us(2);   //延时9us;
  _nop_();
  if(DQ)      //在12us处读取数据;
   tmp |= 0x80;
  delay_us(30);  //延时55us;
  DQ = 1;   _nop_();   //恢复One Wire Bus;
  }
 return tmp; }
//**************************延时程序,一个是1us的延时。一个是1ms的延时 **************
void delay_us(unchar a)//when crystal is 12M ,a*2+5 us  ,子程序调用要5us,while 就等于DJNZ指令
{
while(--a);
}
void delay_ms(unchar a)
{
    unchar i,j;
	for(i=0;i<a;i++)
	for(j=0;j<200;j++)
	{
		_nop_();
		_nop_();
	}
}
//**********************************************************

⌨️ 快捷键说明

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