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

📄 mainloop.c

📁 18b20检测温度 及7219显示 按键检测程序 等实际应用程序
💻 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 + -