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

📄 zpfinalok.c

📁 AT89S/C52,11.0592MHz,DS18B20和6位数码管
💻 C
字号:
/******************************************************************************/
/**
/** 功能描述: 
/**
/** 创 建 人: chiusir   		日期:2008-04-03   */
/** 修 改 人:                 	日期:2008-04-03   */ 
/** 其他说明: 
/******************************************************************************/
#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 !  
*** 修 改 人:			 							日期:2006-11-28
*** 函数说明:
*** //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 !  
*** 修 改 人:			 							日期:2006-11-28
*** 函数说明: 
/******************************************************************************/
void DLY_ms(U16 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 !  
*** 修 改 人:			 							日期:2006-11-28
*** 函数说明: 
/******************************************************************************/
void Init1820()
{
 SIO = 1; _nop_();
 SIO = 0;      //拉低数据线,准备Reset OneWire Bus;
 DLY_us(125);  //延时510us,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_();     //2ms;
  SIO = 1;      //必须写1,否则读出来的将是不预期的数据;
  DLY_us(2);   //延时9us;
  _nop_();
  if(SIO)      //在12us处读取数据;
   tmp |= 0x80;
  DLY_us(30);  //延时55us;
  SIO = 1;   _nop_();   //恢复One Wire Bus;
  }
 return tmp; 
 }

 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];
   //tp=tp>>4;
   return(tp);
   //tmbuf[0]=(U8)(tp/10);
   //tmbuf[1]=(U8)(tp%10);
}

/*******************************************************************************
*** 函 数 名: void Show_LED(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依次为符号位,百位,十位,个位,十分为,百分位
				P3接八段数码管
*** 输		出: NO ! 
*** 函数说明: 
/******************************************************************************/ 
void Show_LED(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(2);
		}
		P0=0x02;  	
		P1=LED_IMG[bai]|0X80;
		DLY_ms(2);
		P0=0x04;  	
		P1=LED_IMG[shi]|0X80;
		DLY_ms(2);
		P0=0x08; 
		P1=LED_IMG[ge]&0x7f;			//tmbuf dot always.
		DLY_ms(2);
		P0=0x10; 
		P1=LED_IMG[shifen]|0X80;
		DLY_ms(2);
		P0=0x20; 
		P1=LED_IMG[baifen]|0X80;
		DLY_ms(2);
		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);
	} 
 }


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

void main(void)
{	   		
	U16 y;
	float x;
	U8 neg_flag=0;
	P1=0xff;
	while(1)
	{ 			
		//Show_LED(-12345);
		//DLY_ms(200);
/*
		Show_LED(22222);
		DLY_ms(200);	
		Show_LED(12345);
		DLY_ms(200);
		Show_LED(-12345);
		DLY_ms(200);
		Show_LED(-6789);	
		DLY_ms(200);
		DLY_ms(200);		
		Show_LED(8888);
*/				
		DLY_ms(200);
		P3|=0x07;
		y=RD_T();
		if(y<2001){
			neg_flag=0;
			y&=0x07ff;
		}
		else{
			neg_flag=1;
			y=~y+1;	

		}
		if(neg_flag)	
			x=-(y*6.25);
		else
			x=y*6.25;
		Show_LED((int)x);
		if(y<480)					//30
			greenled=0;
		else if(y<960)	
			blueled=0;
		else if(y<2001){			//>60/0.0625=960,
			redled=0;
			Beep(1000); 	
		}
		else
			greenled=0;	
		DLY_ms(250);
		DLY_ms(250);
		DLY_ms(250);
	}
}  

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

⌨️ 快捷键说明

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