📄 main.c
字号:
//-------------------------------------------------------------------------*
//工程文件名:Bake.prj *
//硬件连接: *
// TLC2543的CS,I/O CLOCK,DATA INPUT,DATA OUT分别接PTC0,PTD1~PTD3 *
// LCD的数据口为PTB0~PTB7,控制口为PTC1~PTC4 *
// 报警灯:红灯及蜂鸣器、绿灯、黄灯、Bake阀、Cool阀分别接PTA的第0~4脚 *
// 温度电位器、时间电位器、热敏电阻、红外传感器分别接TLC2543的第0~3脚
//程序描述:由TLC2543采集来的AD值确定设定时间、设定温度、当前温度和 *
// Cool箱中是否有物体 *
// 判断如果Bake炉内温度变化超过设定温度一定范围,则红灯闪并报警 *
// 否则等加热到设定时间后黄灯闪,切掉Bake炉电源,提示取出加热物体 *
// 放入Cool箱,冷却阀闭合,当物体移出Cool箱后,冷却阀断开 *
//日 期:2007.04.25 *
//-------------------------------------------------------------------------*
#include "Includes.h" //总头文件
//内部函数声明
void LightAlarm(INT8U Light); //通过不同颜色灯闪,提示进一步操作
INT16U ConvertCT(INT16U adv); //将AD值转换当前温度
INT16U ConvertT(INT16U adv); //将AD值转换设定温度
INT16U ConvertTime(INT16U adv); //将AD值转换设定时间
void ReFlash(void);
//主函数
void main()
{
INT16U ADValue[11]; //11路A/D采集数据
INT8U InitTime; //开始计时的基值
INT16U tmp;
//初始化
DisableMCUInterrupt(); //禁止总中断
MCUInit(); //芯片初始化
SPIInit(); //SPI初始化
LCDInit(); //Lcd初始化
SCIInit(); //串口初始化
Timer1init(); //定时器1初始化
SwitchOutput_Init(); //开关量输出初始化
EnTm1OverflowInt(); //开放Timer1溢出中断
EnableSCIReInt(); //开放串行中断
EnableMCUInterrupt(); //开放总中断
MainLoop:
//初始化标志
StateFlag=1; //初始状态为1:开绿灯、Bake炉
CoolFlag=0; //开始工作时,Cool箱中是没物体的
FlashFlag=0; //需要校准当前温度或修改MCU号时在串行中断里置1
//主循环
while(1)
{
//1 采集A/D值,转换为设定温度、设定时间、当前温度和红外传感器值
ADC11P(0,ADValue);
CurtTmp=ConvertCT(ADValue[0]); //第0路为当前温度
Temper=ConvertT(ADValue[1]); //第1路为设定温度
Time=ConvertTime(ADValue[2]); //第2路为设定时间
Infrared=ADValue[3]; //第3路为红外传感器的值
ADCurtTmp=ADValue[0]; //校准当前温度时写flash用
if(FlashFlag==1)
ReFlash();
//2 根据不同状态,作不同处理
switch(StateFlag)
{
case 1://状态1:绿灯亮,Bake炉通电工作
SwitchOutput(C_GreenLight,1); //系统开始工作后,绿灯常亮
SwitchOutput(C_BakeSw,1); //使Bake炉开始工作
StateFlag=2; //进入状态2
break;
case 2://状态2:等待炉内温度达到设定值
if(CurtTmp>=Temper) //温度达到设定值
{
InitTime=MntTim; //记录此刻时间,作为加热时间的基值
StateFlag=3; //进入状态3
}
break;
case 3://状态3:如果当前炉内温度偏离设定温度过大,则报警提示关闭系统
if(CurtTmp>Temper) //允许正负偏一定值,tmp为两者的差值
tmp=CurtTmp-Temper;
else
tmp=Temper-CurtTmp;
if(tmp>C_TmpPC) //如果当前温度与设定温度偏差大于5,作异常处理
{
SwitchOutput(C_BakeSw,0); //断开Bake阀
SwitchOutput(C_GreenLight,0);//绿灯灭
SwitchOutput(C_RedLight,1); //红灯亮并报警,直到掉电
}
else
{
StateFlag=4; //进入状态4
}
break;
case 4://状态4:如果加热到设定时间,黄灯闪
CurtTime=MntTim-InitTime;
if(CurtTime>=Time) //加热时间到,报警灯提示,直到Cool阀开
{
LightAlarm(C_YellowLight); //断开Bake阀、绿灯灭、黄灯闪
StateFlag=5; //进入状态5
}
else
{
StateFlag=3; //加热时间未到,回状态3,边判边等
}
break;
case 5://状态5:冷却箱中有物体放入,就闭合Cool阀,等到无物体时就断开
if(Infrared<=C_Exist)
{
SwitchOutput(C_CoolSw,1);
SwitchOutput(C_GreenLight,1);
CoolFlag=1; //有物体放入置此标志
}
else if(CoolFlag==0) //没物体放入,转状态4继续黄灯闪提示
{
StateFlag=4;
}
else //有物体放入并已经拿走,则断开Cool阀
{
SwitchOutput(C_CoolSw,0); //关冷却箱
SwitchOutput(C_GreenLight,0);//绿灯灭
CoolFlag=0;
goto MainLoop;
}
break;
}//switch
}//while
}
//**************************************************************************
// 内部函数 *
//**************************************************************************
//-------------------------------------------------------------------------*
//函数名:ConvertCT *
//参 数:AD值 *
//返 回:AD值对应的当前温度 *
//功 能:将AD值转换为当前温度 *
//-------------------------------------------------------------------------*
INT16U ConvertCT(INT16U adv)
{
INT32U tmp;
//防止溢出,限定最大最小值
if(adv<TADmin)
adv=TADmin;
else if(adv>TADmax)
adv=TADmax;
// TADmax-TADmin adv-TADmin
//计算公式: -------------- = ---------------
// Tmax-Tmin ?-Tmin
tmp=adv-TADmin;
tmp=(tmp*(Tmax-Tmin))/(TADmax-TADmin)+Tmin;
return(tmp);
}
//-------------------------------------------------------------------------*
//函数名:ConvertT *
//参 数:AD值 *
//返 回:AD值对应的设定温度 *
//功 能:将AD值转换为设定温度 *
//-------------------------------------------------------------------------*
INT16U ConvertT(INT16U adv)
{
INT32U tmp; //32位
tmp=adv;
//按线性关系,将AD值范围分为C_TmpBound等分
tmp=((tmp*C_TmpBound)/C_RADMax)/10+C_MinTmp;
return(tmp);
}
//-------------------------------------------------------------------------*
//函数名:ConvertTime *
//参 数:AD值 *
//返 回:AD值对应的设定时间 *
//功 能:将AD值转换为设定时间 *
//-------------------------------------------------------------------------*
INT16U ConvertTime(INT16U adv)
{
INT32U tmp; //32位
tmp=adv;
//按线性关系,将AD值范围分为C_TimBound等分
tmp=((tmp*C_TimBound)/C_RADMax/10+C_MinTim);
return(tmp); //显示可精确到0.1分,此处计时只精确到1分
/////////////////////////////////////////
//return(2);
//////////////////////////////////////////////////////////
}
//-------------------------------------------------------------------------*
//函数名:LightAlarm *
//参 数:无 *
//返 回:无 *
//功 能:切掉Bake炉电源、通过不同颜色灯闪,提示进一步操作 *
//-------------------------------------------------------------------------*
void LightAlarm(INT8U Light)
{
INT8U i,j;
//Bake炉内温度异常,切掉Bake炉电源
SwitchOutput(C_BakeSw,0);
//绿灯灭
SwitchOutput(C_GreenLight,0);
//灯亮
SwitchOutput(Light,1);
//延时
for(i=0;i<200;i++)
for(j=0;j<200;j++);
//灯灭
SwitchOutput(Light,0);
//延时
for(i=0;i<200;i++)
for(j=0;j<200;j++);
}
//校准当前温度,或修改MCU号,写flash函数
void ReFlash(void)
{
DisableMCUInterrupt();
EraseFlash(0x8000); //擦除0x8000为始址的一个页
WriteFlash(0x8000);
EnableMCUInterrupt();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -