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

📄 microt02.c

📁 本要求适用于Microcon-T02半导体冰箱控制板(以下简称控制板)。本控制板由电源板、显示控制板两部分组成。
💻 C
📖 第 1 页 / 共 3 页
字号:
/*-------------------------------------------------------------------------------
------------半导体制冷冰箱控制器-------------------------------------------------
------------Project:Microcon-T02
------------Mcu:PIC16F690
------------oscillation:Internal RC (8Mhz)
------------Author:  Wuqy
------------Date:  2006/04/05 
------------
-Ver1: 将原来的SEMIREF1 Ver3中的单片机EM78P458更改为PIC16F690 
-      温度传感器:NTSF0103GZ168  B25/85=3977K 25度=10K
---    更改为:日本芝浦 T25=10K  B25/85=3950K  检查温度表值可不变 
-Ver2: 将显示扫描更改为4次,一次一位的一半,以减少电流消耗-----     
-Ver3: 2006-7-19 8:27 
-      Dh01(RA4输出0,RA3检测为0)  
-      工作温度: -40~+80  设定/显示温度:-5~65  检测温度:-5~80 
-      1、低压:11.6V+-0.3 1min 恢复11.6V  显示 -- 带恢复功能 
       2、高压:18V+-0.3 5s 恢复13V  显示 -- 带恢复功能 
-      3、上电检测到电源反接: 一直显示 Pr
-      4、传感器断路/短路: 显示Er
-      5、传感器超温大于80: 显示rr   输出停止  散热风扇3分钟后停止
-      6、在待机状态,按UP键 进入加热状态,默认温度50  Down键制冷  默认温度0
-        
-      T02(RA3检测为高,上拉电阻10K): 
-       DC12V DC18V  工作温度:-40~+80  设定/显示温度:-9~65  检测温度:-9~80 
-      1、低压不检测   高压:20V+-0.3 5s 恢复18V  显示 -- 带恢复功能 
-      2、在待机状态,按UP键 进入加热状态,默认温度50  Down键制冷  默认温度5
-      3、电源切断或掉电时,系统延迟10分钟自动进入掉电前工作状态
-------------------------------------------------------------------------------*/

#include "pic.h"
#include "MicroT02.h"

void sInitPort(void);
unsigned char sRdAdVal(unsigned char);
void  sDelay(void);
void  sDelay500us(void);

void  sInitRam(void);
void  sKeyCheckIn(void);
void  sDecodeKey(void);
void  s2msTask(void);
void  sCheckTime(void);
unsigned char   sBin_Bcd(unsigned char);
void  sPushData(void);
unsigned char  sMpy(unsigned char rTemp);
void   sVolCheck(void);
void  sConCheck(void);
void  sDispTemp(void);

void  sOnDelayCheck(void);
void  sDh01DispDriver(void);
void  sT02DispDriver(void);

//----------显示温度范围-9~75度----------------------------------------------------------
//-------------------A/D ->-10
const char TempTab[]={
    //30   31  32   33   34   35   36   37   38   39  
      0x8F,0x8E,0x8E,0x8D,0x8D,0x8C,0x8C,0x8B,0x8B,0x8A, //30-39
   // -15  -14  -14  -13  -13  -12  -12  -11  -11  -10
   //   0x89,0x89,0x88,0x88,0x87,0x87,0x86,0x86,0x85,0x85, //40-49
       0x8A,0x8A,0x8A,0x8A,0x89,0x89,0x88,0x88,0x87,0x87, //40-49
    //-9    -9   -8   -8   -7  -7   -6  -6    -5  -5  
   //  0x84,0x84,0x83,0x83,0x82,0x82,0x81,0x81,0x81,0,    //50-59
       0x86,0x86,0x85,0x85,0x84,0x84,0x83,0x83,0x83,0x82, 
   //  0,1,1,1,2,2,3,3,4,4,5,5,5,6,6,6,7,7,7,8,       //60-79
       0x82,0x81,0x81,0x81,0,0,1,1,2,2,3,3,3,4,4,4,5,5,5,6, 
   //  8,8,9,9,9,10,10,10,11,11,11,12,12,13,13,13,14,14,14,15, //80-99
       6,6,7,7,7,8,8,8,9,9,9,10,10,11,11,11,12,12,12,13,

     15,16,16,16,17,17,17,18,18,18,19,19,19,20,20,20,21,21,21,22,  //100-119     
     22,22,23,23,24,24,24,25,25,25,26,26,26,27,27,28,28,28,29,29,  //120-139
     29,30,30,30,31,31,32,32,32,33,33,33,34,34,34,35,35,36,36,37,  //140-159
     37,37,38,38,39,39,39,40,40,41,41,42,42,43,43,44,44,45,45,46,  //160-179
     46,47,47,48,48,48,49,49,50,50,51,51,52,52,53,53,54,54,55,56,  //180-199
     56,57,57,58,58,59,60,61,62,63,63,64,65,66,67,68,69,70,70,70,  //200-219 
     70,70,70,70,70,70,70,70,70,70,70,70   
 
   //72,73,74,75,75,75,75,75,75,75,75,75
   // 0  1  2  3  4  5  6  7  8  9 10  1  2  3  4  5  6  7  8  9      
         };
         
const char Dh01TempTab[]={
    //30   31  32   33   34   35   36   37   38   39  
     0x8A,0x8A,0x8A,0x8A,0x8A,0x8A,0x8A,0x8A,0x8A,0x8A, //30-39
   // -15  -14  -14  -13  -13  -12  -12  -11  -11  -10
    0x89,0x89,0x88,0x88,0x87,0x87,0x86,0x86,0x85,0x85, //40-49
   //-9    -9   -8   -8   -7  -7   -6  -6    -5  -5  
    0x84,0x84,0x83,0x83,0x82,0x82,0x81,0x81,0x81,0,    //50-59
   //     0x85,0x85,0x85,0x85,0x84,0x84,0x83,0x83,0x83,0x82, 
    0,1,1,1,2,2,3,3,4,4,5,5,5,6,6,6,7,7,7,8,       //60-79
   //     0x82,0x81,0x81,0x81,0,0,1,1,2,2,3,3,3,4,4,4,5,5,5,6, 
   8,8,9,9,9,10,10,10,11,11,11,12,12,13,13,13,14,14,14,15, //80-99
   //      6,6,7,7,7,8,8,8,9,9,9,10,10,11,11,11,12,12,12,13,

     15,16,16,16,17,17,17,18,18,18,19,19,19,20,20,20,21,21,21,22,  //100-119     
     22,22,23,23,24,24,24,25,25,25,26,26,26,27,27,28,28,28,29,29,  //120-139
     29,30,30,30,31,31,32,32,32,33,33,33,34,34,34,35,35,36,36,37,  //140-159
     37,37,38,38,39,39,39,40,40,41,41,42,42,43,43,44,44,45,45,46,  //160-179
     46,47,47,48,48,48,49,49,50,50,51,51,52,52,53,53,54,54,55,56,  //180-199
     56,57,57,58,58,59,60,61,62,63,63,64,65,66,67,68,69,70,70,71,  //200-219 
     72,73,74,75,75,75,75,75,75,75,75,75
     
   // 0  1  2  3  4  5  6  7  8  9 10  1  2  3  4  5  6  7  8  9      
         };         
         
//----------C: -10~37 => 14~99
const char FTempTab[]={14,16,18,19,21,23,25,27,28,30,32,34,36,37,39,41,43,45,46, 
      48,50,52,54,55,57,59,61,63,64,66,68,70,72,73,75,77,79,81,82,84,86,88,90,91, 
      93,95,97,99
         };
//-----共阳极点亮数码管-------0~9 -PHrE都不亮----7-1  E D F A G B C------ 
//A~F 0x40,0x14,0x0E,0x30,0x06,0x46                      
const  char DispTab[]={0x08,0xF8,0x22,0xA0,0xD0,0x84,0x04,0xE8,0x00,0x80,0xF6,0x42,0x50,0x76,0x06,0xFE};
            
void sInitPort()
{
    PIE1=0;    
    PIE2=0;
    OPTION = 0x82;		// prescale by 8 for TMR0  250*8=2ms
    
    ANSELH=0x00;
    ANSEL=0x06;      //RA1 2 is Analog

    WPUA=0;
    IOCA=0;  
    WPUB=0;
    
    TRISA = 0x0E;  //0000 1110  RA 321为输入 温度、电压、型号
    TRISB = 0x0F;   
    TRISC = 0x03;
    C1ON=0;
    C2ON=0;
    
    PORTA=0x21;  //PORTA,4输出低电平给RA3识别型号
    PORTB=0x80;
    PORTC=0xCC;    
}

void sInitRam()
{       
    	        
    rAdConCount=0;
    rTempAd.PICINT=0;
    rVoltageAd.PICINT=0;    
    rTaskJump=0;
    rOnDelay=0;
    rDispTimeBrush=21;
    rPORT6.BYTE=0x8F;
    rDispValue=0xFF; 
    rWorkFlag.BYTE=0;   
    rErrFlag.BYTE=0x00;
    rKeyFlag.BYTE=0x00;
    
	}

unsigned char sRdAdVal(unsigned char rAdChannel)
{
   ADCON1=0x20;
   sDelay(); 
   ADCON0=rAdChannel;
   sDelay();
   sDelay(); 
   sDelay();    
   sDelay(); 
   sDelay();   
   
	GODONE=1;
	while(GODONE);
	return ADRESH;
}

void  sDelay()
{
    rCount1=rCount1+1;
    rCount1=rCount1+2;
    rCount1=rCount1+3;	
	}
	

/*******************************************************************/
/* void  sKeyCheckIn()           					   */
/* 功能:键值处理                         */
/* 说明:根据键盘扫描程序返回的键值数据进行去抖动,连击键处理,串键处理有效时,keyprocess为1 */
/*******************************************************************/ 	
void  sKeyCheckIn()
{
//----------------------------------------------------------- 
         pTrisK1=1;
         pTrisK2=1; 
         sDelay();
         rCount1=PORTC;
         
         rCount2=0;
                  
         if(!(rCount1&0x01))
          {
          if(fModeDH01)rCount2|=0x04;
          else rCount2|=0x08;           
           }
           
         if(!(rCount1&0x02))
          { 
           if(fModeDH01)rCount2|=0x08; 
           else rCount2|=0x04;           
            }
            
         if(pKeyInK1)rCount2|=0x01; 
         if(pKeyInK2)rCount2|=0x02;

         pTrisK1=0;
         pTrisK2=0;
         sDelay();
       //  PORTC=0xFC;      //导致C F 同时亮                         
//----------------------------------------------------------- 
			if(!rCount2) //rCount2=0 无功能键按下 
				{
				  fenflash=1;
					rkeypre=0x00;
 					fkeyesc=0x00;  //为0,按键已释放  1为按键未释放
					rKeyFlag.BYTE&=0x3F; //ftask0=0 ftask1=0
					rkeycnt=0x00;
					}
			else if(!fkeyesc)  //键已释放
				{
          if(rCount2!=rkeypre)//本次功能按键键值和上次相同?
    		  	{
				  		rkeypre=rCount2;   //用本次键值更新上次键值
				  		rkeycnt=0x00;
				  		}
				  else 
				   	{
				   		rkeycnt++;   //2次功能键相同
	 
				   		 if(ftask0==0&&ftask1==0)     //去抖阶段
				   		 { 		
				   		     if(rkeycnt==N) //年龄=N
				   				  {
				   				    fenflash=1;
				   				  	fkeyprocess=1;
				   				  	
				   				  	if(!fTempSetS)fkeyesc=1; //不在温度设定状态,不允许连击
				   				  	  
				   				  	if(rCount2&constKeyMask)fkeyesc=1;  //该键不允许连击
				   				    else   
				   				    	{
				   				    		ftask0=1 ;   //按键状态转入重复延缓阶段
				   				    		rkeycnt=0; //年龄清0 
				   				    		}		
				   				  	}	
				   			   } 
				   		 else if(ftask0==1&&ftask1==0) 
				   				{
				   				  if(rkeycnt==constMaxRate)  //按键年龄=重复延缓阶段
				   				  	{
				   				  		fenflash=0;  //不允许闪烁
				   				  		fkeyprocess=1;
				   				  		rkeycnt=0;
				   				  		ftask1=1;
				   				  		}	
				   				  }
				   		  else
				   		  {
				   		  	 if(rkeycnt==constMinRate)
				   		  	 {
				   		  	 	fenflash=0;
				   		  	 	fkeyprocess=1;
				   		  	 	rkeycnt=0;
				   		  	 	} 
				   		  	}   
				 		
				   		
				   		}	
				  
					}
	   
	}
/*-------------------------------------------------------------------------------
K1=0x1 K2=0x2 K3=0x4 K4=0x8
-------------------------------------------------------------------------------*/ 
void  sDecodeKey(void)
{
  fkeyprocess=0;
  
	if(rkeypre&0x04)   //K3
	{
	  fNeedSaveE2=1;
	  
	  rSaveDelay=cDelaySave;
	  
	  if(fPowerOn)
	    {
	    	  fPowerOn=0;
	    	  fFDisp=0;
	        rFanDelay180s=cFanOff60s;	         
          rSetTemp=rE2Data[1];  //设定过程中断电,保持原来设置温度不变	        
	        fTempSetS=0;
	         }
	  else  
	    {
	      fPowerOn=1;
	      fTempSetS=0;
	      fInqPOwerOn=0;
	      }
	}
	
	if(fPowerOn&&rErrFlag.BYTE==0) //fSenError==0
	{	
	if(rkeypre&0x08)   //K4
	{
	  if(fTempSetS)
	  {
	  	fTempSetS=0;	
	  	sOnDelayCheck(); 
	  	if(rE2Data[1]!=rSetTemp)fNeedSaveE2=1;  	
	  	rSaveDelay=cDelaySave;  
	  	}
	  else 
	  {
	  	fTempSetS=1;
	  	rSetTemp5s=cSetTemp3s;
	  	rE2Data[1]=rSetTemp;    //2006-7-5 10:12 进入设定温度状态保存当前的设置
	  	}
	 } 
	
  	
	if(rkeypre&0x01)   //K1
	{
	  rSetTemp5s=cSetTemp3s;
	  if(fTempSetS)
	  {
	  	  if(fModeDH01)  //DH01与T02 反了
	  	  {
	  	  if(rSetTemp>cMinSetTempDh01)rSetTemp--;  //0  2006-6-21 14:51
    	   }
	   
	     else
	     {
	       if(rSetTemp<cMaxSetTemp)rSetTemp++;   
	      } 
     	
	 // 	else rSetTemp=cMaxSetTemp;	  	
	  	}
   
	  else 
	  {
	      //  if(fFDisp)fFDisp=0;
	      //  else  fFDisp=1;
	      //-----不在温度数字状态直接设定温度为50
	    if(fModeDH01)rSetTemp=cColdSetTemp;
	    else  	 rSetTemp=cHotsetTemp;
	    sOnDelayCheck(); 
	    if(rE2Data[1]!=rSetTemp)fNeedSaveE2=1;  	
	  	rSaveDelay=cDelaySave;  	
	  	}
	  	 
	 }
	 
	if(rkeypre&0x02)   //K2
	{
	  rSetTemp5s=cSetTemp3s;
	  if(fTempSetS)
	  {
	  	if(fModeDH01)
	  	{  
	  	if(rSetTemp<cMaxSetTemp)rSetTemp++;
	    }
	    else
	    {
	     if(rSetTemp>cMinSetTempT02)rSetTemp--;  //0  2006-6-21 14:51   
	      }  
	  //	else rSetTemp=0;	  	
	  	}
 
	  else 
	  {
	       // if(fFDisp)fFDisp=0;
	       // else  fFDisp=1;	
	   	      //-----不在温度数字状态直接设定温度为50
	    if(fModeDH01)rSetTemp=cHotsetTemp;  
	    else  	rSetTemp=cColdT02Set;
	    	   
	    sOnDelayCheck(); 	
	    
	    if(rE2Data[1]!=rSetTemp)fNeedSaveE2=1;  	
	  	rSaveDelay=cDelaySave;  
	  	}
	  	 
	   }	 

	}
  
	}
	
//-------------------------------------------------------------------------------	

//-------------------------------------------------------------------------------	
void   sSelfDecodeKey(void)
{
  fkeyprocess=0;
  
  rSelfTestTime=11;
  
  if(rkeypre)   //K3
  {
     if(fModeDH01)
       {
         if(fHotOut)
          {
             fHotOut=0;
             fColdOut=1;
             rDispValue=0x01;
            } 
         else if(fColdOut)
         {
           fColdOut=0;
           fFanOut=1;
           sDispTemp();

⌨️ 快捷键说明

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