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

📄 a.c

📁 16B20 温度探测和两位共阴数码管用的是atm89s52
💻 C
字号:
#include <AT89X52.H>
#include <intrins.h>

unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};



char info=23;
sbit DQ =P3^7;   //定义通信端口 ;
bit  LOG =0;     //定义正负标志位;


unsigned char a[5]={11,11,11,11,11};
unsigned char temp_H,temp_L;//温度的高八位和低八位



void delay02s(void)
{
unsigned char i,j;
for(i=20;i>0;i--)
for(j=20;j>0;j--)
//for(k=248;k>0;k--)
;
}



/*************************延时程序段************************/
void Delay(unsigned char times)
{
do{;}while(--times);
}

void dispchar(char infotext)
{

	if (P3_0==0)
	{
		P3_1=0;
		P2=dispcode[infotext/10];
		delay02s();
		P3_0=1;

    } else
	{
		P3_0=0;
		P2=dispcode[infotext%10];
		delay02s();
		P3_1=1;
	}
	delay02s();

}


/******************复位时序或者说是初始化时序***************/
unsigned char reset(void)
{
  unsigned char Answerback;
  DQ = 0;           //拉低单总线
  Delay(240);       //至少480us
  DQ = 1;           //释放单总线
  Delay(15);        //等待响应
  Answerback=DQ;    //得到器件响应
  Delay(240);       // 延迟480us
  return(Answerback); //返回器件响应,0=有器件, 1 = 无器件
}  

/****************从 1-wire 总线上读取一个字节***************/
unsigned char read_byte(void)
{
 unsigned char i;
 for (i=8;i>0;i--)
 {
   DQ = 0;     //拉低 DQ,在15US之内就必须释放单总线。
   DQ = 1;     //再拉高,即释放单总线。
   CY=DQ;      //读取数据;
   CY=ACC&0x01;//将数据循环右移
   Delay(30);  //不管是读1还是读0都至少需要60us的时间 
 }
 return(ACC);//返回读出的数据
}

/*****************向 1-WIRE 总线上写一个字节*****************/
void write_byte(char val)
{
 unsigned char i;ACC=val;
 for (i=8;i>0;i--) 
 {
   DQ = 0;      //拉低单总线
   CY= ACC&0x01;//从低位向高位依取出ACC的值
  
   DQ =CY;      //把CY的值赋给单总线,?
   Delay(30);   //至少需要60us的时间 
   DQ = 1;
 }
 Delay(30);     //到120US之间。
}

/***********读取温度并且进行换算以及正负判断等***************/
void Read_Temperature(void)
{

   while(reset());      //初始化
   write_byte(0xCC);    //跳过序列号检测
   write_byte(0xBE);    //读内部单元
   temp_L=read_byte();  //低八位
   temp_H=read_byte();  //高八位
   while(reset());      //初始化

   write_byte(0xCC);    //跳过 ROM
   write_byte(0x44);    //开始温度转换

   if((temp_H&0xf8)!=0x00)//判断是否为负。 
   {
   LOG=1;               //为1表示为负数;
   temp_H=~temp_H; 
   temp_L=~temp_L; 
   if(temp_L==255)      //向高位进1;
   {temp_H++;temp_L=0;}
   else
   {temp_L+=1;}
   } 
 
   temp_H&=0x07;//由于最高可以测量125度所以只取temp_H的最高3位。
   temp_H<<=4;  //还原整数部分
   temp_H+=temp_L>>4; //还原整数部分
 
   temp_L=(temp_L&0x0f)*25/4;//小数部分0.06的整数倍

}


void main(void)
{
    unsigned char result;
    unsigned char x,n;
		


while(1)
{

	Read_Temperature();	

		

	  

     	result=temp_H;  
		Delay(40000);

//		for(n=2000;n>0;n--)
     {


		dispchar(result);
		}



	

	//		dispchar(info);



//	dispchar(info);


  /*
     while(result/10)//整数部分用数组A[0]~A[2]保存;
     {
      a[x]=result%10; 
      result/=10;x--;
     } 	  
     a[x]=result;	  
*/

/*
	 Read_Temperature();
     result=temp_H;  
     while(result/10)//整数部分用数组A[0]~A[2]保存;
     {
      a[x]=result%10; 
      result/=10;x--;
     } 	  
     a[x]=result;	  



	  
     for(n=0;n<6;n++)//清除显示。以便重新装入显示代码   
     a[n]=11;
     result=temp_H;  
     x=2;
     while(result/10)//整数部分用数组A[0]~A[2]保存;
     {
      a[x]=result%10; 
      result/=10;x--;
     }

     if(LOG==1) //为温度负数LOG等于1
     {
      a[x-1]=10;//显示字符-表示为负;
      LOG=0;    //正负标志复位。
     }
     a[3]=temp_L/10;//小数部分用数组A[4]来储存;
     a[4]=temp_L%10;//小数部分用数组A[5]来储存;
     for(n=200;n>0;n--)
     {Display();Display();
      Display();Display();
    }	*/ 
	  
	//dispchar(a[1]+a[0]*10);

	}
}


/*
void t0(void) interrupt 1 using 0
{
TH0=(65536-4000)/256;
TL0=(65536-4000)%256;
P1=dispcode[dispbuf[dispcount]];
P2=dispbitcode[dispcount];
dispcount++;
if(dispcount==8)
{
dispcount=0;
}
} 
*/

⌨️ 快捷键说明

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