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

📄 test.c

📁 此程序用于恒温箱控制
💻 C
字号:
 
#include <stdarg.h>///add,03-8-22,自定义printf
#include "main.h"
#include "x5045.h"   
#include "i2c.h"      
          
void            	UART();
void            	T0_int();
void            	init_CPU(); 
void            	Clear_rcv_buff(); 
uchar   	    printat(uchar *COMMAND,uchar *RESULT); 
void                  putunchar (char c);
void x9318(bit ud, uchar dat);
unsigned int cal_crc(unsigned char *ptr, unsigned char len);
uchar rcv_serch(uchar *serch);
void  rcv_data();
void reset_5045();

uchar  idata pr[10];
uchar  t50ms;
uchar rcv_point ; 
uchar idata rcv_buff[15];
uchar t1s1,t1s2,t1m1, heat_vale;
uint idata tem_value1, tem_value2;
uchar heating;
uint idata crc_value;
bit data_bit;
bit tem1_bit,tem2_bit,heat_bit;
bit  ctrcool_bit,ctrheat_bit;
uchar heat_value;    
void main()
 {   
      uchar    i;
      char  temp1;
      uint j;      
       
        data_bit=0;         
        ctrcool_bit=ctrheat_bit=0;
        init_CPU();
        WRSR_25045();
        write_7416C(0x00);
        write_7416C(0x02);
        WDT=1;
        REST_DOG();
        i=Byte_Read(0,10);
        if(i!=10) reset_5045();       
        Clear_rcv_buff(); 
        tem_value1=Byte_Read(0,1);         
          tem_value2=Byte_Read(0,3);          
          write_7416T( 0,0x02,tem_value1 );
          write_7416T( 0,0x03,tem_value1+6);
          write_7416T( 0x02,0x02,tem_value2);
          write_7416T( 0x02,0x03,tem_value2+6);          
           heat_value=0;              
           x9318(0,100);
           heat_value=0;          
           j=read_7416(0x00);
           if(j>tem_value1)
           {ctrcool_bit=1;P22=1;}
           else 
           ctrheat_bit=1;
       while(1)
         {
           WDT=1;
           REST_DOG();	
           if(t1s2>6)
           {        
           t1s2=0;
            }
       
       
         if(data_bit)
          {
          
            ES=1; 
             rcv_data();          
           } 
         if(ctrcool_bit&&(t1s1>4))
            {
             P32=1;
             if(P32)                
             { 
             	ctrcool_bit=0; P22=0;EX0 =1;
             	}
             t1s1=0;
           
          	
          	 
           }
         if(ctrheat_bit&& (t1s1>6))
           { 
           t1s1=0; 
           j=read_7416(0x00);
           putunchar(j);	
           temp1=tem_value1-j;
           putunchar(temp1);
           if(temp1>=0)
           {
           	if(temp1>20)
           	 {
           	  if(65<heat_value)
 	           {
 	            x9318(0, heat_value-65); 
 	          //heat_value=65;
 	         // putunchar (temvalue);    	    
                   }              //test
 	           else
 	            {
 	             x9318(1, 65-heat_value); 
 	            //heat_value=65;                	
                   } 
                   heat_value=65;  
                   putunchar (heat_value);                          
                 }
               else if((temp1<=20)&&(temp1>15))
                {
                if(20<heat_value)
 	           {
 	            x9318(0, heat_value-20);  	          	    
                   }              //test
 	           else
 	            {
 	             x9318(1, 20-heat_value); 	                        	
                   } 
                   heat_value=20; 
                   putunchar (heat_value);                     
                 }  
               else if((temp1<=15)&&(temp1>10))
                {
                if(15<heat_value)
 	           {
 	            x9318(0, heat_value-15);  	         	    
                   }              //test
 	           else
 	            {
 	             x9318(1, 15-heat_value);  	                        	
                   } 
                   heat_value=15; 
                   putunchar (heat_value);                     
                 }
                else if((temp1<=10)&&(temp1>5))
                {
                if(10<heat_value)
 	           {
 	            x9318(0, heat_value-10); 	          	    
                   }              //test
 	           else
 	            {
 	             x9318(1, 10-heat_value); 	                    	
                   } 
                   heat_value=10;  
                   putunchar (heat_value);    	                  
                 }
                else 
                {
                if(5<heat_value)
 	           {
 	            x9318(0, heat_value-5);  	           	    
                   }              //test
 	           else
 	            {
 	             x9318(1, 5-heat_value); 
 	             	                    	
                     }  
                    heat_value=5;  
 	             putunchar (heat_value);                
                 }
              }   
           else	
           {
           
 	            x9318(0, heat_value-0); 
 	          
 	           
                    heat_value=0;  
 	             putunchar (heat_value);    	
           }          
            }	
       
             
             	
         }	
          
          
 }
 
void init_CPU()
{

	WDTD=100;
	WDTC=0x0f;
	 
	SCON=0x50;
	TMOD=0x21; // T1:baut,T0:Time 16bit
	TCON=0x50; // TR0,TR1=1.低电平触发,IT0=IT1=0; 
	TH1=0xfd;TL1=0xfd;PCON=0; // Uart Baut=9600
    	TH0=0x4c;TL0=0x00;  // T0=50ms	
	IE=0x92; //开全局中断,定时器0。串口中断。/关两个外部中断EX0=EX1=0;
	IP=0x10; // UART高
	//AUXR=0x00;//内部XRAM,ALE为1/6FOSC,AUXR=0x10外部XRAM
	AUXR=0x01; //ALE IS common 
}
 
void Clear_rcv_buff()
{
	uchar i;
	for(i=0;i<BUFF_LEN;i++) rcv_buff[i]=0;
		rcv_point=0;///add,03-8-22
}
void putunchar (uchar c)///mod,03-8-22,自定义printf///mod,03-9-9可能更可靠
{
         TI = 0; 
         ES=0;///add,03-8-22,最后一次使用完需ES=1
         SBUF = c;
         while (!TI);
          ES=1;
}
void int_0() interrupt 0 using 3 
  {
     EX0=0;
     ctrcool_bit=1;
     P22=1;
  
  }
void int_1() interrupt 2 using 3 
  {
     EX1=0;
  //  cool2_bit=1;
    
  }  
void T0_int() interrupt 1 using 2
{	TR0=0;
	TH0=TH0+0x4c;//TL0=0xe0; // T0=5ms
	t50ms++;
	 
	if(t50ms>=20)
	{
		t50ms=0;
		t1s1++;
		t1s2++;
	 
		 
		 
	}
	 
	TR0=1;
}
void UART() interrupt 4 using 1
{
	uchar   i;
	if(TI) TI=0;
	if(RI)
	{
		RI=0;		
		  	if(rcv_point < BUFF_LEN )
		  	{
		  		rcv_buff[rcv_point]=SBUF;
		  		rcv_point++;		     	
		   	}
		  	else
			{
				for(i=0;i<(BUFF_LEN-1);i++) rcv_buff[i]=rcv_buff[i+1];
					rcv_buff[BUFF_LEN-1]=SBUF;		
			}
			    			
			 
			 if(rcv_buff[rcv_point-1]=='#') 
			 {
			 
			         data_bit=1;	
		        } 		
	}
}
void x9318(bit ud, uchar dat)
  {
    CS=0;
    if(ud) UD=1;//为UP
     else  UD=0;//为DOWN
      
     	for(;dat>0;dat--) 
     	{
     	  INC=1;
     	  delay(1);
     	  INC=0;
     	   delay(1);
     	 } 
     	 INC=1;
     	 delay(1);
     	  CS=1;
     		
  }
void delay(uint dat)
 { 
  
 	 uchar i;
        while(dat--)
        {
        	WDT=1;
           	for(i=0;i<120;i++)
           	{;}
        }
  
 }
uchar rcv_serch(uchar *serch)
{
	uchar i,j,k,lenth;
	lenth=strlen(serch);
	for(i=0;i<(BUFF_LEN-lenth);i++)
	{
		k=0;
		for(j=0;j<lenth;j++)
		{
			if(rcv_buff[i+j]==serch[j]) k=k+1;
		}
		if(k==lenth) return i;
	}
	i=BUFF_LEN+2;
	return i;
}     	 
void  rcv_data() 
  {     
  	uchar i,k,temp;    
         uint j;
        delay(1000);
         WDT=1;
        REST_DOG();
        data_bit=0;
 	i=rcv_serch("H"); 	  
 	if(i>BUFF_LEN) {       Clear_rcv_buff() ;    return;    }
 	ES=0;
 	temp=rcv_buff[i+1]; 	
 	pr[k]=0; 	
             putunchar (temp); 
            tem_value1=temp;             
            write_7416T( 0,0x02,tem_value1 );
           write_7416T( 0,0x03,tem_value1+6);
            Byte_Write(0,1,temp);	
             j=read_7416(0x00);
           if(j>tem_value1)
           {
             ctrcool_bit=1;P22=1;ctrheat_bit=0;            
           }
           else 
           {
           	ctrheat_bit=1;ctrcool_bit=0;P22=0;EX0=0;
           }
            x9318(0, 100); 
             heat_value=0;
 	 putunchar ('K');
 	  ES=1; 	
 	 Clear_rcv_buff(); 
 }
void reset_5045()
  { 
  	uchar i;
  	for(i=0;i<9;i++)
  	 {
  	 Byte_Write(0,i,0);	
  	 }	
  	 Byte_Write(0,10,10);	
  	  x9318(0,100);
   }	


/*====================================================================================================
   PID计算部分
=====================================================================================================*/

/*uchar  PIDCalc( PID *pp, uint NextPoint )
{
    int  dError,
            Error;
     unsigned long pid_value;
        Error = pp->SetPoint -  NextPoint;          // 偏差
        pp->SumError += Error;                      // 积分
        dError =  Error-pp->LastError ;     // 当前微分
         
        pp->LastError = Error;
        pid_value=100*(pp->Proportion * Error+ pp->Integral * pp->SumError 
                 + pp->Derivative * dError )/5600;
          if( pid_value <0)   pid_value=0;
           if(pid_value >95) pid_value=96;
         return (uchar)pid_value;
     
}/*

/*====================================================================================================
   Initialize PID Structure
=====================================================================================================*/

/*void PIDInit (PID *pp)
{
    memset ( pp,0,sizeof(PID));
}*/

/*====================================================================================================
    Main Program
=====================================================================================================*/

 

 
 
 
 

⌨️ 快捷键说明

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