/* PIC16F73
----------------
-|1 RB7 28|- (加热)
IGBT Temperature -|2 RA0 RB6 27|- (弱加热)
Voltage -|3 RA1 RB5 26|- (保温)
REAL Temperature -|4 RA2 RB4 25|- (关机)
Current -|5 RA3 RB3 24|- Beep
-|6 RA4 RB2 23|-
-|7 RA5 RB1 22|- Test Plus
-|8 RB0 21|- (中断)
-|9 20|-
-|10 19|-
-|11 RC0 RC7 18|-
PWM Output -|12 RC1 RC6 17|-
Capture/Fan -|13 RC2 RC5 16|-
-|14 RC3 RC4 15|-
----------------
*/
//包括的头文件
#include <pic.h>
#include <math.h>
//定义
#define uchar unsigned char
#define uint unsigned int
#define bPLUS RB1 //发试探脉冲的管脚
#define bBEEP RB3
#define bSDATA RC7 //SER
#define bSDCLK RC5 //SRCLK
#define bSCLK RC6 //RCLK
#define Turnoff_PWM_Output() {CCP2CON &= 0x0F0; T2CON &= 0x0FB;} //停止PWM的输出
#define Low_PWM_Output() { RC1 = 0; bPLUS = 0;} //并把PWM管脚拉低
#define High_Test_Output() {bPLUS = 1;} //把测试脉冲管脚电平拉高
#define Open_Fan() { RC4 = 1;} //打开风扇
#define Turnoff_Fan() { RC4 = 0;} //关闭风扇
#define DEFus 252
#define DEF20us 225
#define DEF10ms 61
#define PLUSCOUNT 3
#define TRUE 1
#define FALSE 0
#define MAXPLUSNUM 12
#define MINIREAD 15
#define IPOINTS 5
#define TMR1LOW 0X78
#define TMR1HIGH 0X0ec
#define T3RESTTIME 3 //300W时,工作3秒,休息5秒
#define T3WORKTIME 2
#define T6WORKTIME 4 //600W时,工作6秒,休息2秒
#define T6RESTTIME 1
#define gate_Voltage 0X88 //电压AD转化通道选择
#define gate_Current 0X98 //电流AD转化通道选择
#define gate_Pan_Warm 0X90 //锅底温度AD转化通道选择
#define gate_IGBT_Warm 0X80 //IGBT温度AD转化通道选择
#define gate_Key 0X0a0 //按键AD转化通道选择
#define switchTURNOFF 0x10
#define switchKEEPWARM 0x20
#define switchWEAKWARM 0x40
#define switchCOOKING 0x80
#define switchSHIELD 0x0F0
#define PWM_period 0x0a0 //PWM的周期
void Send_Test_Plus(void); //发脉冲宽度为6us的试探脉冲
void Send_IGBT_Plus(unsigned int PWM_hi); //发IGBT的驱动脉冲,是PWM的正脉冲宽度
void Check_Machine_Wave(void); //发出试探脉冲后,检测机器返回的振荡波
void interrupt INT_Service_Prog(void); //中断服务程序
void PIC_Timer(uchar uKind,uchar uNum); //定时程序
void Mcu_init(void); //单片机初始话程序
void Power_control(uchar iPower); //功率档位控制,间隙工作,连续工作
void DISPLAY1(uchar shu1, uchar shu2); //显示子程序
void Display(void); //显示档位,错误代码
void Judge_Switch_State(void); //中断后,对开关状态进行判断
void Read_Switch_State(void); //读开关状态,如与档位不一样,立即中断
void Power_adjust(void); //功率控制,与工作档位有关,连续工作,间隙工作
void work_condition_check(void); //对工作条件进行检测,主要是电压,温度传感器
void Voltage_check(void); //在电磁炉工作的情况下,测试电压,查表得出电流,以横功率
uchar ad_out(uchar uchannel); //AD转化子程序,参数是各AD通道的选择
//定义标志位
bit gTimerOver; //定时器Tmr0定时是否结束,1:Yes,0:No
bit gWorkNow; //间隙工作模式下,是否在工作,1:Yes,0:No
bit bDCLoff; //电磁炉关机标志,用于关机后1MIN延时,然后等待
bit bDCLon; //用在打开加热档的一个标志
bit bSwitch; //用在读开关状态的标志,发现开关状态与工作档位不一样,置标志,延时5MS,在读一次
bit bKeyChange; //多个循环标志,若开关状态改变,产生中断,置标志,这样,主程序中的某些循环条件就不满足了
bit bNopan; //无锅标志,在发试探脉冲后,检测到无锅
bit bLVoltage; //检测到电压太低标志
bit bHVoltage0; //检测到电压太高标志0
bit bHVoltage1; //检测到电压太高标志1
bit bHpan_tem; //检测到锅底温度太高的标志
bit bHigbt_tem; //检测到IGBT温度太高的标志
bit bL_Current; //检测到电流太小的标志,是无锅状态
bit bH_Current; //检测到电流太大的标志,是电路故障
bit bProtect0; //用在条件的子程序中,如果在条件检测时,发生有错误,置标志
bit bProtect1; //在检测电流过程中,电流过大或过小,置标志
bit bErro; //只要有一个错误发生,就关机,去不断检测条件
uchar gDoCircle; //是否持续工作
uchar gTimerDur; //定义20us延时,还是10ms延时
uchar gTimerNum; //定义延时的时间因子
uchar gPlusNum; //定义在取试探脉冲时,多少个就可以满足要求
uchar gPlusNo; //用于数组的下标
uchar gRevPlus; //表示发出试探脉冲后,机器返回的脉冲个数
uchar gOldSwitch; //开关原来的状态
uchar gNowSwitch; //开关现在的状态
uchar iPower; //功率档的标志,1关机,8加热,4弱加热,2保温
uchar uWorkTime; //间隙工作时,工作的时间
uchar uRestTime; //间隙工作时,休息的时间
uchar bCirCndit; //在条件检测过程中,每次只检测哪一个的标志
uchar x,a; //横功率控制,查表用的下标
uchar d01ms,d10ms,d100ms,d01s,d60s,d01h; //中断的时间单元
uchar t1s,w,t750ms,t10ms,t1ms,t120ms,t2s,t3s,t01s; //程序控制中需用的时间
uint PWM_hi; //PWM的占空比
uint gCPLZ[PLUSCOUNT]; //此数组用于记录捕获到的信号的时间量
union tUNION //定义了一个联合体
{
uint iX;
uchar uY[2];
}gCAPU;
//调试中,显示用
//0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f
const unsigned char table[20]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0X07,0x7F,
0x6F,0x77,0x7C,0x58,0x5E,0x79,0x71,0x7f,0xbf,0x89,0xff};
const unsigned char current_table[22]={0x52,0x4F,0x4B,0x49,0x46,0x44,0x41,0x3F,
0x3D,0x3A,0x38,0x3F,0x3D,0x3A,0x38,0x36,0x34,0x32,0x30,
0x2E,0x2C,0x2A};
//程序开始了...
void main(void)
{
uchar uAD;
uint iRecordVoltage,u,u1,uHi1,ss1;
uchar uNum;
uchar uAD2,uAD0,uADy;
uchar j,p,t,i;
uint uUad ;
Mcu_init();
bBEEP=1; //蜂鸣器长叫一声。时间2秒
t3s = 0;
while(t3s<2);
bBEEP=0;
INTF = 1; // 强行中断,读开关状态,与00比较
gOldSwitch = 0x00; //开关的初始状态为0
while(1)
{
if(bKeyChange == 1) //开关状态改变
{
bKeyChange = 0 ;
Turnoff_PWM_Output(); //关闭PWM的输出
Low_PWM_Output(); //PWM管脚拉低
for(j=256;j>0;j--); //延时一会
Judge_Switch_State(); //判开关的状态
gWorkNow=0; //确保在切换开关后,能马上工作起来
t1s=20; //间隙工作时,马上工作的条件
}
if(RB2==0) //显示
{ Display(); }
if(bDCLoff == 1) //关机动作,风扇再工作一分钟
{
Turnoff_PWM_Output(); //关闭PWM的输出
Low_PWM_Output(); //PWM管脚拉低
t2s=0; //延时一分钟
while((bKeyChange == 0)&&(t2s<90))
{ Read_Swi
评论1