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

📄 temp_controlnew.c

📁 此为一个单片机多机通信的程序 有两个从机一个主机 从机1负责采集温度并上传给主机 从机2控制电机转动
💻 C
字号:
 #include "reg52.h"
#include "absacc.h"


#define display_single XBYTE[0x0000]
#define display_point XBYTE[0x0100]
#include <absacc.h>
#include <stdio.h>
#include <math.h>
#define uchar unsigned char 
sbit dq=P1^3; 


uchar code single[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchar code single_point[9]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xff};
uchar point,indiv,ten,hun;





 
 sbit key_1=P1^0;
 sbit key_2=P1^2;






uchar temp1,temp2,ready=0,flag=1;



uchar temp1,temp2;
void display(void);




void delay(unsigned int count)
  {
     unsigned int i;
	 while(count)
	 {
	   i=20;
	   while(i>0)
	   {
	     display();
	     i--;
		 }
	   count--;
	   }
   }



void _nop()
   {;
	}



   
	  
/***********************************************************\
|数码显示程序                                                |
|                                                            |
\***********************************************************/


void display(void)
   { 
      
	   display_single=single[point];
	   display_point=single_point[0];
	   _nop();
	   _nop();

       display_point=0xff;

       display_single=(single[indiv]&0x7f);
	   display_point=single_point[1];
	   _nop();
	   _nop();
	   
       display_point=0xff;
       
       display_single=single[ten];
	   display_point=single_point[2];
	   _nop();
	   _nop();

       display_point=0xff;
       
       display_single=single[hun];
	   display_point=single_point[3];
	   _nop();
	   _nop();

       display_point=0xff;


   }


/*******************************************************\
|	函数名		Reset_18B20								|
|	函数功能		复位18B20芯片							|
|	参数			无										|
|	返回值		无										|
\*******************************************************/
bit Reset_18B20()
{
	bit answer;
	unsigned char i;
	int j;

	//置总线为低电平并保持至少480us 
    dq = 0;
	for(i=0; i<7;i++)	//780us
	{
		display();
	}

	//等电阻拉高总线并保持15-60us 
   	dq=1;
	for(i=0; i<9; i++)	//65us
	{
		_nop();
	}

	//接受应答信号 
   	answer=dq;

	//延时60-240us 
	for(i=0; i<2;i++)	//240us
	{
		display();
		for(j=0;j<1;j++);
		


	}
    
	return(answer);
}

/*******************************************************\
|	函数名		read_byte_18B20							|
|	函数功能	从18B20中读出一位数据					|
|	参数		无										|
|	返回值		读出的数据								|
\*******************************************************/
bit read_bit_18B20(void)         
{ 
	bit bitval;
	unsigned char i;

	dq=0; 
	_nop();
	
	dq=1; 
	_nop();
	_nop(); 


	bitval = dq;

	for(i=0; i<8; i++)
	{
		_nop();
	}

	return(bitval); 
} 

/*******************************************************\
|	函数名		write_bit_18B20							|
|	函数功能		向18B20中写入一位数据				|
|	参数			bitval	:	待写入的数据			|
|	返回值		无										|
\*******************************************************/
void write_bit_18B20(unsigned char bitval)   
{     
	unsigned char i;

	dq=0; 
	for(i=0; i<1; i++)
	{
		_nop();
		_nop();
	}

	if (bitval==1)   
	{ 
		dq=1; 
	} 

	for(i=0; i<8; i++)
	{
		_nop();
	}

	dq=1; 
} 

/*******************************************************\
|	函数名		read_byte_18B20							|
|	函数功能		从18B20中读出一个字节的数据				|
|	参数			无										|
|	返回值		读出的数据								|
\*******************************************************/
unsigned char read_byte_18B20(void)        
{ 
	unsigned char i; 
	unsigned char j; 
	unsigned char value = 0; 

	for (i=0;i<8;i++) 
	{ 
		j = read_bit_18B20();

		if (j)					//如果是 1 置1,否则置 0 
		{ 
			value|= (0x01<<i);	//先读低位,再读高位 
		} 
		_nop(); 
		
	}							

	return(value);           
} 

/*******************************************************\
|	函数名		write_byte_18B20						|
|	函数功能		向18B20中写入一个字节的数据				|
|	参数			val	:	待写入的数据						|
|	返回值		无										|
\*******************************************************/
void write_byte_18B20(unsigned char val)     
{ 
	unsigned char i; 
	unsigned char temp; 

	for (i=0; i<8; i++) 
	{ 
		temp = val>>i; 
		temp&= 0x01; 
		write_bit_18B20(temp);
	} 
	_nop(); 
	
}   

/*******************************************************\
|	函数名		GetTemperat								|
|	函数功能		利用18B20芯片检测温度,并在LED上显示		|
|	参数			无										|
|	返回值		温度										|
\*******************************************************/
void GetTemperat()
{
	
	
		while(Reset_18B20());  	//复位等待从机应答 
		write_byte_18B20(0xCC);	//忽略ROM匹配 
		write_byte_18B20(0x44);	//发送温度转化命令 

		delay(300);		//延时 

		while(Reset_18B20());  	//再次复位,等待从机应答 

		write_byte_18B20(0xCC);	//忽略ROM匹配 
		write_byte_18B20(0xBE);	//发送读温度命令 

		temp1= read_byte_18B20();	//读出温度低8位
		temp2= read_byte_18B20();	//读出温度高8位 

		dq=1;				//释放总线 
		ready=1;

}



void reachmassege()interrupt 4 using 1
 {  
    uchar a;
    while(RI!=1);RI=0;
    ES=0;
    if(flag)
    {
    a=SBUF;
	if(a!=0x02){key_1=~key_1;goto reti;}
	else {
	
	flag=0;
	SM2=0;
    SBUF=0x02;
    while(TI!=1);TI=0;
    while(RI!=1);RI=0;}
	}
	if(SBUF==0xff){key_2=~key_2;SM2=1;ES=1;flag=1;goto reti;}
    a=SBUF;
    //key_2=~key_2;
	if(a==0x00)
	 {
	   if(ready==0x01)SBUF=0x01;
	   else SBUF=0x00;
	   while(TI!=1);TI=0;
       while(RI!=1);RI=0;
	   if(SBUF==0xff){SM2=1;ES=1;flag=1;goto reti;} 
	   else if(SBUF==0x01)
	          {SBUF=temp1;
	    	   while(TI!=1);TI=0;
		       SBUF=temp2;
			   while(TI!=1);TI=0;}
		else if(SBUF==0x02)
	         {SBUF=point;
		      while(TI!=1);TI=0;
		       SBUF=indiv;
		       while(TI!=1);TI=0;
		      SBUF=ten;
		      while(TI!=1);TI=0;
		      SBUF=hun;
			  while(TI!=1);TI=0;
		      }
		
	  }
	 flag=0;  
    reti:
    ES=1;
    
    
  }


/***************************************\
|温度值转换                             |
\***************************************/


 void tmpchangebcd(void)
   {float a;
    uchar c,d,f,e;
    c=temp2&0xf8;
    if(c)
    {temp1=~temp1+1;  //////
     temp2=~temp2;}//////////////////////
    d=temp1&0x0f;
    f=temp1>>4;
    e=temp2&0x07;
    e<<=4;
    f|=e;
    a=d*0.0625;
	point=(uchar)(a*10);
	indiv=f%10;
	ten=f%100/10;
	hun=f/100;
   }



   void main()
  {
   flag=1;
   TMOD=0x20;
   TL1=0xfa;
   TH1=0xfa;
   PCON=0x00;
   TR1=1;
   SCON=0xf0;
   ES=1;
   EA=1;
   key_1=0;
   key_2=0;
     while(1)
	  { 
	     GetTemperat();
		 tmpchangebcd();
		  //key_1=~key_1;
		}
	}


















 
    
  

⌨️ 快捷键说明

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