📄 mainloop.c
字号:
/*************************************
*** DS18B20处理函数
**************************************/
#include <reg52.h>
#include <Intrins.h>
#include <absacc.h>
//#include "Uarts1.h"
#include "main.h"
#include "DS18B20.h"
#include "Max7219.h"
#include "Display.h"
unsigned int DisDelay;
unsigned int ContrDelay; //控制延迟
unsigned char AlarmState;
unsigned int Count;
unsigned char KeyNum,key_state, Key_tmp, PressedKey, _key_delay;
unsigned char SetState; //设置状态
unsigned int Temp_Up,Temp,Temp_Down;
unsigned int DisTemp;
unsigned char Int_AcCount; //过零+1
unsigned char AC_Count100; //100次过零+1,应该是1s
unsigned int Pulse_Width; //在0~10ms之间,5245--0x1531=5ms,10850--0x2a62=10ms
//test
unsigned int Light_Count=0;
//test end
//硬件接口:
sbit ALARM =P3^4;
sbit AC_TEST =P3^2; //捕捉过零点
sbit AC_CONTROL =P0^7; //控制输出
sbit TEST =P0^6;
///////////////////////////////////////////////////////
//中断函数
//////////////////////////////////////////////////////
//显示更新中断(1s更新一次)显示
//定时器中断
void Timer0_int(void) interrupt 1 using 2 //1ms中断
{
if ( _key_delay > 0 ) //扫描按键定时20MS
--_key_delay;
if ( DisDelay > 0 ) //显示定时1S
--DisDelay;
if ( ContrDelay > 0 ) //显示定时1S
--ContrDelay;
TF0 =0;
TH0 = -(TCNT_1MS/256);
TL0 = -(TCNT_1MS%256);
}
//定时器中断
void Timer1_int(void) interrupt 3 using 1 //1ms中断
{
unsigned char i;
AC_CONTROL=AC_CONTROL_ON;
for(i=0;i<10;i++)
{
}
AC_CONTROL=AC_CONTROL_OFF;
TEST=0;
}
//显示更新中断(1s更新一次)显示
//定时器中断
void Interrupter0(void) interrupt 0 using 3 //1ms中断
{
EX0 = 0;
Int_AcCount++;
TH1 = -(Pulse_Width/256);
TL1 = -(Pulse_Width%256);
TEST=1;
EX0 = 1;
}
///////////////////////////////////////////////////////
//初始化函数与通用函数
//////////////////////////////////////////////////////
//MCU的串口与中断初始化,
void InitMcu()
{
//timer0
TMOD =0x11; //T1工作1态
TH0 = -(TCNT_1MS/256);
TL0 = -(TCNT_1MS%256);
TR0=1;
ET0=1; //系统定时器0中断
//TEST
TH1 = -(Pulse_Width/256);
TL1 = -(Pulse_Width%256);
TR1=1;
ET1=1; //系统定时器1中断
IT0=1; //外部中断,下降沿触发
EX0=1;
ES=0;
EA=1; //interrupt
}
//初始化数据,
void InitData()
{
Count=0;
DisDelay=1000;
key_state=0;
SetState=STATE_WORK;
Temp=0;
Temp_Up=300; //暂时定温度的上下限默认值为UP:300 Down:200
Temp_Down=200;
DisTemp=Temp;
ContrDelay=0;
ALARM=Alarm_OFF;
AlarmState=AlarmState_START;
Int_AcCount=0;
AC_Count100=0;
AC_CONTROL=AC_CONTROL_OFF;
Pulse_Width=6000;
TEST=0;
}
//------------------------------
//-------按键扫描---------------
unsigned char GetKey()
{
unsigned char cur_key; //临时按键值
unsigned char key; //
key = 0;
switch( key_state )
{
case 0:
// Waiting For Key Press
P1=0xff;
cur_key = P1;
if( (cur_key > 0) && (cur_key != 255) )
{
Key_tmp = cur_key;
_key_delay = 20;
key_state = 1;
}
break;
case 1:
// Delay 20 ms and ReScan Key Press
if ( _key_delay == 0 )
{
P1=0xff;
cur_key = P1;
if( cur_key == Key_tmp )
{
//key = cur_key; //送出键按下值
PressedKey = cur_key;
key_state = 2;
}
else
key_state = 0;
}
break;
case 2:
// Waiting for key release
P1=0xff;
cur_key = P1;
if( cur_key==PressedKey )
{
_key_delay = 20;
key_state = 3;
}
break;
case 3:
// Delay 20 ms Waiting For Key Release
if ( _key_delay == 0 )
{
P1=0xff;
cur_key = P1;
if( cur_key==PressedKey )
key_state = 2;
else
{
key_state = 0;
key = PressedKey | 0x80; //送出键松开值(按下值+0x80)
}
}
break;
default:
break;
}
return( key );
}
//--------------------------------------------------------------------------------
//--------------------------------------------------------------------------------
void main()
{
//unsigned char flag_led=0;
//P3=0xff;
InitMcu();
//UartInit(19200);
InitData();
MAX7219_Init();
while(1)
{
//TASK1:按键扫描及任务处理
KeyNum=GetKey();
switch(KeyNum)
{
case KEY_TEMP_SET:
{
if(SetState!=STATE_TEMPDOWN)
SetState++;
else
SetState=STATE_WORK;
}
break;
case KEY_TEMP_UP:
{
if(SetState==STATE_TEMPUP)
Temp_Up++;
else if(SetState==STATE_TEMPDOWN)
Temp_Down++;
}
break;
case KEY_TEMP_DOWN:
{
if(SetState==STATE_TEMPUP)
Temp_Up--;
else if(SetState==STATE_TEMPDOWN)
Temp_Down--;
}
break;
default:
break;
}
/**/
//TASK2:显示任务处理
if(DisDelay==0)
{
//设定延时值
DisDelay=DisplayDelay_TIME;
//Count++;
//1.温度数据处理
//Temp=DS18B20_ReadTemp(); //读取温度
//DS18B20_StartConvert(); //命令18B20转换
switch(SetState)
{
case STATE_WORK:
DisTemp=Temp;
break;
case STATE_TEMPUP:
DisTemp=Temp_Up;
break;
case STATE_TEMPDOWN:
DisTemp=Temp_Down;
break;
default:
break;
}
/**/
//Disp_Temperature(DisTemp); //显示
//Disp_Set(SetState,DIS_WORK);
//Disp_Hz(Int_AcCount);
Int_AcCount=0;
Light_Count++;
//Pulse_Width=+50; //10ms=10850
//Pulse_Width=6000;
if(Light_Count<=4)
{
//Light_Count=0;
Pulse_Width=3000;
}
else if((Light_Count>=4)&&(Light_Count<=8))
{
Light_Count=0;
Pulse_Width=6000;
}
/**/
}
/*
//TASK3:输出控制任务处理
if(ContrDelay==0)
{
ContrDelay=ContrDelay_TIME;
switch(AlarmState)
{
case AlarmState_START:
if(Temp>=Temp_Up)
AlarmState=AlarmState_UP;
else if(Temp<=Temp_Down)
AlarmState=AlarmState_DOWN;
else
{
AlarmState=AlarmState_START;
ALARM=Alarm_OFF;
}
break;
case AlarmState_UP:
if(Temp>=Temp_Up)
{
ALARM=Alarm_ON;
//CONTROLX=CONTROLX_OFF;
}
AlarmState=AlarmState_START;
break;
case AlarmState_DOWN:
if(Temp<=Temp_Down)
{
ALARM=Alarm_ON;
//CONTROLX=CONTROLX_ON;
}
AlarmState=AlarmState_START;
break;
default:
break;
}
}
*/
}
}
//end of file.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -