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

📄 main.c

📁 这是一个多点温度测量系统
💻 C
字号:
#include "AT89X52.H"
#include "1602S51.H"
#include "DS18B20S51.H"
unsigned char tt[16]={"I:  .   II:  .  "};
unsigned char PP[16]={"III:  .         "};

unsigned char sSendComBuf[5]={0x55,1,35,23,0xff};
unsigned char sRecComBuf[5];

unsigned char timecount=0;
unsigned int TesTemperature1=0;//实测得到温度  4位,到达千
unsigned int TesTemperature2=0;//实测得到温度
unsigned int TesTemperature3=0;//实测得到温度
bit ID_choose1=1;     //第一路温度测量开关   1 开,0 关
bit ID_choose2=1;     //第二路温度测量开关
bit ID_choose3=1;     //第三路温度测量开关
 unsigned int sst;
 unsigned char count3;
unsigned char data bOut,bIn,bSout,bSin;


void initTimer(void); //初始化定时器0
int translate(unsigned int uiData,unsigned char ID);
void Key_Scan(void);//按键扫描
void PSendChar(unsigned char ch) ;
void PSendString(unsigned char *st)  ;


//向串口发送一个字符 
void send_char_com( unsigned char ch) 
{ 
SBUF=ch; 
while (TI== 0 ); 
TI= 0 ; 
} 

//向串口发送一个字符串,strlen为该字符串长度 
void send_string_com( unsigned char *str, unsigned char strlen) 
{ 
unsigned char k= 0 ; 
do 
{ 
  send_char_com(str[k]); 
  k++; 
} while (k < strlen); 
} 



//------------------------------
//串口-中断方式
//当要发送时,往SBUF里送值,设TI=1,设ES=1,就能发送了,
//UART init
void initUart(void)
{

SCON = 0x50 ; //SCON: serail mode 1, 8-bit UART, enable ucvr 
TMOD |= 0x20 ; //TMOD: timer 1, mode 2, 8-bit reload 
PCON |= 0x80 ; //SMOD=1; 
TH1 = 0xFa ; //Baud:9600 fosc=11.0592MHz 
IE |= 0x90 ; //Enable Serial Interrupt ES=1.EA=1
TR1 = 1 ; // timer 1 run 
}

 


//串口接收中断函数 
void serial () interrupt 4 using 3 
{ 
	static bit fist;
	if (RI) 
	{ 
		unsigned char ch; 
		RI = 0 ; 
		ch=SBUF; 
	//	PP[10]=ch+'0';
		if (ch==0x55 )  //第一字节 
		{ 
		fist=1;   //帧头
		count3= 0 ; 
		sRecComBuf[count3]=ch; 
		} 
	   if((fist==1)&&(count3==4)&&(ch==0xff))  //帧尾
	    {
		  fist=0;   //帧尾
		  switch(sRecComBuf[1]) //路数选择
		   {
		      case 1:
			         if(sRecComBuf[2]==0x01)  
					  {
					    ID_choose1=1;//启动第一路
					  }
					  else if(sRecComBuf[2]==0x02)
					  {
					    ID_choose1=0;//关闭第一路
					  }
                     
			         break;
			  case 2:
			         if(sRecComBuf[2]==0x01)  
					  {
					    ID_choose2=1;//启动第一路
					  }
					  else if(sRecComBuf[2]==0x02)
					  {
					    ID_choose2=0;//关闭第一路
					  }
			         break;
			  case 3:
			         if(sRecComBuf[2]==0x01)  
					  {
					    ID_choose3=1;//启动第一路
					  }
					  else if(sRecComBuf[2]==0x02)
					  {
					    ID_choose3=0;//关闭第一路
					  }
			         break;
			  default:break;
		   }
		}

        sRecComBuf[count3]=ch;
		count3++;
		
	} 
 
} 




void main()
{

    initUart();
     
    init_LCD();   //初始化LCD----来自1602S51.H文件
 
   display(0x80,tt,16);  //界面显示
   display(0xC0,PP,16);
  while(1)
   {
        display(0x80,tt,16);  //界面显示
        display(0xC0,PP,16);
        Key_Scan();
 
                  if(ID_choose1)
				   {
				     sst=Read_Temperature(1);   //第一路
				     TesTemperature1=translate(sst,1);	 
					  
				     sSendComBuf[1]=ID_choose1;     //路号
                     sSendComBuf[2]=TesTemperature1/100 ;     //整数位
					 sSendComBuf[3]=TesTemperature1%100;     //小数位

					 send_string_com(sSendComBuf,5);
					 delay_ms(50);
				   }
   
                  if(ID_choose2)
				   {
				     sst=Read_Temperature(2);   //第二路
				     TesTemperature2=translate(sst,2);		
			   
				     sSendComBuf[1]=2;     //路号
                     sSendComBuf[2]=TesTemperature2/100 ;     //整数位
					 sSendComBuf[3]=TesTemperature2%100;     //小数位

					 send_string_com(sSendComBuf,5);
					 delay_ms(50);

				   }

                  if(ID_choose3)
				   {
				     sst=Read_Temperature(3);   //第三路
				     TesTemperature3=translate(sst,3);	

				     sSendComBuf[1]=3;     //路号
                     sSendComBuf[2]=TesTemperature3/100 ;     //整数位
					 sSendComBuf[3]=TesTemperature3%100;     //小数位

					 send_string_com(sSendComBuf,5);
					 delay_ms(50);				
				   }


   }
  
}


//--------------------------------------------------------
//把读到的温度放到要显示缓存中
//输入:uiData 读到的数值 ID是温度的路号1表是第一路,2表示第二路,3表示第三路
//输出:通过给相应的数组赋值,达到输出
int translate(unsigned int uiData,unsigned char ID)
 {

	unsigned int uiInteger;					//数据的整数部分
	unsigned int uiDecimal;					//数据的小数部分
	unsigned int uiBai;						//显示温度的百位
 	unsigned int uiShi;						//显示温度的十位
 	unsigned int uiGe;						//显示温度的个位
 	unsigned int uiShi_d;					//显示温度的十分位
 	unsigned int uiBai_d;					//显示温度的百分位
// 	unsigned int uiQian_d;					//显示温度的千分位
	unsigned int uiResidue;					//数据的余数,作除法
	
	uiInteger = 0;
	uiDecimal = 0;
	
	if(uiData & 0x0400)
		uiInteger += 64;					//转换为整数部分
	if(uiData & 0x0200)
		uiInteger += 32;
	if(uiData & 0x0100)
		uiInteger += 16;
	if(uiData & 0x0080)
		uiInteger += 8;
	if(uiData & 0x0040)
		uiInteger += 4;
	if(uiData & 0x0020)
		uiInteger += 2;
	if(uiData & 0x0010)
		uiInteger += 1;
	
	if(uiData & 0x0008)
		uiDecimal += 5000;					//转换为小数部分
	if(uiData & 0x0004)
		uiDecimal += 2500;
	if(uiData & 0x0002)
		uiDecimal += 1250;
	if(uiData & 0x0001)
		uiDecimal += 625;
	
	 uiBai = uiInteger/100;					//小数点前面部分
	uiResidue = uiInteger%100;
	uiInteger = uiResidue;
	  uiShi = uiInteger/10;
	uiResidue = uiInteger%10;
	  uiGe = uiResidue;
	
	  uiShi_d = uiDecimal/1000;				//小数点后面部分
	uiResidue = uiDecimal%1000;
	uiDecimal = uiResidue;
	  uiBai_d = uiDecimal/100;
	uiResidue = uiDecimal%100;
	uiDecimal = uiResidue;

	
	//显示
  
   switch(ID)
    { 
       case 1:  
			 	tt[2]=uiShi+'0' ;
			 	tt[3]=uiGe+'0' ;
			 //	tt[4]='.';
			 	tt[5]= uiShi_d+'0';
			 	tt[6]= uiBai_d+'0' ;
                 break;
       case 2:  
			 	tt[11]=uiShi+'0' ;
			 	tt[12]=uiGe+'0' ;
			 //	tt[13]='.';
			 	tt[14]= uiShi_d+'0';
			 	tt[15]= uiBai_d+'0' ;
                 break;
       case 3:   
			 	PP[4]=uiShi+'0' ;
			 	PP[5]=uiGe+'0' ;
			 //	PP[6]='.';
			 	PP[7]= uiShi_d+'0';
			 	PP[8]= uiBai_d+'0' ;
                 break;
       default:break;
        
    }

  
 	return uiShi*1000+uiGe*100+uiShi_d*10+uiBai_d  ;
	 }



 void Key_Scan(void)//按键扫描
 {

 static unsigned char spo=0;
   P2_0=1;
   P2_1=1;
   P2_2=1;
   P2_3=1;
   if(P2_0==0)  //全开
    {
	   delay_ms(5);
       if(P2_0==0)
	    {
		   ID_choose1=1;
		   ID_choose2=1;
		   ID_choose3=1;
		   	while(P2_0==0)
		    {;}
		}
	}

   if(P2_1==0)  //开/关第一路
    {
	   delay_ms(5);
       if(P2_1==0)
	    {
		   ID_choose1=~ID_choose1;
		    while(P2_1==0)
		    {;}
		}
	}
   if(P2_2==0)  //开/关第二路
    {
	   delay_ms(5);
       if(P2_2==0)
	    {
		   ID_choose2=~ID_choose2;
		    
		    while(P2_2==0)
		    {;}
		}
	}
   if(P2_3==0) //开/关第三路
    {
	   delay_ms(5);
       if(P2_3==0)
	    {
		  spo++;
		  if(spo>8)
		   {
		    spo=0;
		   }
		   ID_choose3=~ID_choose3;
				     sSendComBuf[1]=ID_choose1;     //路号
                     sSendComBuf[2]=TesTemperature1/100 ;     //整数位
					 sSendComBuf[3]=TesTemperature1%100;     //小数位
					 send_string_com(sSendComBuf,5);

		   while(P2_3==0)
		    {;}
		}
	}
 }

 

⌨️ 快捷键说明

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