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

📄 zpfinaln.c

📁 AT89S/C52,11.0592MHz,DS18B20和6位数码管
💻 C
字号:
/******************************************************************************/
/**
/** 功能描述:通过AT89S/C52,11.0592MHz,DS18B20和6位数码管,采集温度并在数码管上实时显示。
/**			  并有相应的不同颜色的led和蜂鸣器指示。
/** 创 建 人:chiusir@yahoo.cn	日期:2008-04-06   							  */
/** 修 改 人:                 	日期:2008-04-18   							  */ 
/** 其他说明: 
/******************************************************************************/
#include<regx51.h>
#include <intrins.h>

#define U8  unsigned char
#define U16 unsigned int

sbit SIO = P2^0;
sbit redled =P3^0;
sbit greenled =P3^1;
sbit blueled =P3^2;
sbit BZ =P3^3;
 
					//0,1,2,3,4,5,6,7,8,9,-
U8 code LED_IMG[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};

/*******************************************************************************
*** 函 数 名: void DLY_us(U8 x)
*** 功能描述: 微秒级延时;
*** 全局变量: NO !
*** 输		入: x !
*** 输		出: NO !  
*** 修 改 人:			 							日期:2008-04-18
*** 函数说明:
*** //1-5,2-7,3-9 ,5--16.5us,10-30.4,22-52,25-58,35-78,61-125,125-250,250--500us 
/******************************************************************************/
void DLY_us(U8 x)		//x取值1~255;
{
	while(--x);	 		
}
/*******************************************************************************
*** 函 数 名: void DLY_ms(U16 x)
*** 功能描述: 毫秒级延时;
*** 全局变量: NO !
*** 输		入: U16 x !
*** 输		出: NO !  
*** 修 改 人:			 							日期:2008-04-18
*** 函数说明: 
/******************************************************************************/
void DLY_ms(U8 x)		//x取值1~255;
{
	U8 i,j;
	for(i=0;i<x;i++)
		for(j=0;j<200;j++)
		{
			_nop_();
			_nop_();
		}
} 

/*******************************************************************************
*** 函 数 名: void Init1820()
*** 功能描述: 
*** 全局变量: NO !
*** 输		入: NO !
*** 输		出: NO !  
*** 修 改 人:			 							日期:2008-04-18
*** 函数说明: 
/******************************************************************************/
void Init1820()
{
	 SIO = 1; 
	 _nop_();
	 SIO = 0;      //拉低数据线,准备Reset OneWire Bus;
	 DLY_us(125);  //延时500us,Reset One-Wire Bus.
	 DLY_us(125);
	 
	 SIO = 1;      //提升数据线;
	 DLY_us(15);   //延时35us;
	 
	 while(SIO)    //等待Slave 器件Ack 信号;
	 {
	 	_nop_(); 
	 }
	 DLY_us(60);   //延时125us; 
	 SIO = 1;      //提升数据线,准备数据传输;
}

/*******************************************************************************
*** 函 数 名: static void DS18B20_WR(U8 cmd)
*** 功能描述: 写一个字节;
*** 全局变量: NO !
*** 输		入: cmd:8bit;
*** 输		出: NO !   
*** 函数说明: cmd主要有Rom操作指令和E2Ram操作指令两种;
/******************************************************************************/
void WR1820(U8 cmd)
{
    U8 i;
	for(i=0;i<8;i++)
	{
		if(cmd & 0x01)  	//低位在前;
	    {
			SIO = 0;    	//结束Recovery time;
	    	_nop_();
			_nop_();
			_nop_();
	    	SIO = 1;   
		} 					//发送数据;
	   else
	   		SIO = 0;    	//结束Rec time;
	   _nop_();
	   _nop_();
	   _nop_();  
	    //SIO = 0;  } 		//发送数据;
	   DLY_us(30);  		//等待Slave Device采样;
	   SIO = 1;      		//Recovery;
	   _nop_();      		//Recovery Time Start;
	   cmd >>= 1;
	} 
}

/*******************************************************************************
*** 函 数 名: U8 RD1820(void)
*** 功能描述: 读取一个字节;
*** 全局变量: NO !
*** 输		入: NO !
*** 输		出: 8bit data;*
*** 函数说明: 读之前必须首先写1;
/******************************************************************************/
U8 RD1820(void)
{
	U8 i;
	U8 tmp=0;
	SIO = 1;  
	_nop_();     			//准备读;
	for(i=0;i<8;i++)
	{
	  tmp >>= 1;    		//低位先发;
	  SIO = 0;     			//Read init;
	  _nop_();     			//1us;
	  SIO = 1;      		//必须写1,否则读出来的将是不预期的数据;
	  DLY_us(2);   			//延时7us;
	  _nop_();
	  if(SIO)      			//在12us处读取数据;
	   	tmp |= 0x80;
	  DLY_us(30);  			//延时55us;
	  SIO = 1;   
	  _nop_();   			//恢复One Wire Bus;
	}
	return tmp; 
 }

/*******************************************************************************
*** 函 数 名: U16 RD_T();
*** 功能描述: 读取温度;
*** 全局变量: NO !
*** 输		入: NO !
*** 输		出: 16bit data;
*** 函数说明: 读之前必须首先写1;
/******************************************************************************/
U16 RD_T()
{  
	U16 tp;
	U8 tmbuf[2];
    Init1820();
    WR1820(0xcc);
 	//delay_ms(2);
    WR1820(0x44);
  	// _nop_();
	// SIO=1;
	// delay_ms(250);     //多个1820时要延时,单个就不用,数据手册里看
	// delay_ms(250);
	// delay_ms(250);
    Init1820();
    WR1820(0xcc);
    WR1820(0xbe);
    tmbuf[0]=RD1820();
    tmbuf[1]=RD1820();
    Init1820();
    tp=tmbuf[1]*256+tmbuf[0];    
    return(tp);    
}

/*******************************************************************************
*** 函 数 名: void Show_8LED(U16 dig)
*** 功能描述: 把数字转化为5位LED显示
*** 全局变量: NO !
*** 输		入: 从DB18B20读取的16位原始数据:低11位数据位,高5位为符号位!
				//0,1,2,3,4,5,6,7,8,9,-
				U8 code LED_IMG[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};
				P0.0--4依次为符号位,百位,十位,个位,十分为,百分位
				P1接8段数码管
*** 输		出: NO ! 
*** 函数说明: 
/******************************************************************************/ 
void Show_8LED(int tmv)
{  	
	U8 ge,shi,bai,shifen,baifen,neg=0; 
	
	if(tmv<0)
	{
		tmv=-tmv;
		neg=1;
	}		 
	bai=tmv/10000;
	shi=(tmv%10000)/1000;
	ge =(tmv%1000)/100;
	shifen=(tmv%100)/10;
	baifen=tmv%10;
	for(tmv=0;tmv<80;tmv++)  
	{
		if(neg)
		{
			P0=0x01; 					//符号位 	
			P1=LED_IMG[10];
			DLY_ms(3);				    //this is the smallest interval
		}
		P0=0x02;  	
		P1=LED_IMG[bai]|0X80;
		DLY_ms(3);
		P0=0x04;  	
		P1=LED_IMG[shi]|0X80;
		DLY_ms(3);
		P0=0x08; 
		P1=LED_IMG[ge]&0x7f;			//dot always.
		DLY_ms(3);
		P0=0x10; 
		P1=LED_IMG[shifen]|0X80;
		DLY_ms(3);
		P0=0x20; 
		P1=LED_IMG[baifen]|0X80;
		DLY_ms(3);
		P1=0xff; 
	}
}
/*******************************************************************************
*** 函 数 名: void Beep(U16 cnt)
*** 功能描述: 蜂鸣器鸣响
*** 全局变量: NO !
*** 输		入: CNT-时间长短 !
*** 输		出: NO ! 
*** 函数说明: 
/******************************************************************************/
void Beep(U16 cnt) 
{	  	
	while(cnt--)
	{
		BZ=1;
		DLY_us(200);	   //
		BZ=0;
		DLY_us(50);
	} 
}

/*******************************************************************************
****                              main()
*******************************************************************************/ 
void main(void)
{	   		
	U16 y;
	float x;
	U8 neg_flag=0,i;
	P0=0xff;
	P1=0x00;
	P3=0xff;
	DLY_ms(250);
	P3=0x00;					//cancel noise
	for(i=0;i<6;i++)   			//1.5s	    
	{
		DLY_ms(250);		
	}	
	Show_8LED(-12345);
	DLY_ms(250);
	DLY_ms(250);
	Show_8LED(-6789);		
	DLY_ms(250);
	DLY_ms(250); 		
	while(1)
	{ 			
		y=RD_T();
		if(y<2001)
		{
			neg_flag=0;
			y&=0x07ff;
		}
		else
		{
			neg_flag=1;
			y=~y+1;
		}	
			x=y*6.25;
		if(neg_flag)	
			x=-x;
		Show_8LED((int)x);
		P3|=0x07;
		if(y<480)					//30--480
			greenled=0;
		else if(y<615)				//40--615
			blueled=0;
		else if(y<2001){			//60--960,
			redled=0;
			Beep(1000); 	
		}
		else
			greenled=0;	
		for(i=0;i<8;i++)   			//2s	    
		{
			DLY_ms(250);		
		}
	}

}  

/*******************************************************************************
****                              End Of File
*******************************************************************************/

⌨️ 快捷键说明

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