📄 microt02.c
字号:
/*-------------------------------------------------------------------------------
------------半导体制冷冰箱控制器-------------------------------------------------
------------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 + -