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

📄 aircondition.c

📁 基于H83664的空调控制模拟系统 aircondition.c、intprg.c
💻 C
📖 第 1 页 / 共 2 页
字号:
/***********************************************************************/
/*                                                                     */
/*  FILE        :aircondition.c                                        */
/*  DATE        :Wed, Sep 01, 2004                                     */
/*  DESCRIPTION :Main Program                                          */
/*  CPU TYPE    :H8/3664F                                              */
/*                                                                     */
/*  Program Function:												   */
/*				 Air Condition Control								   */
/*																	   */
/*	Group Members:													   */
/*               何剑	2001011091									   */
/*				 曹彬	2001011093									   */
/*				 蓝渝	2001011098									   */
/*				 陶涛	2001011108									   */
/*																	   */
/***********************************************************************/



#include <machine.h>
#include <header3664.h>

/*-----------------------------------------------------------------------
	
							端口连接如下:

端口5的P50--P57和LCD的DB0--DB7连接,端口1的P10,P11和P12连接LCD的E,RS,R/W;
端口PB0、PB1分别接收温度和湿度的A/D输入,PB2--PB5接收红外传输的4位数据;
端口P84连接蜂鸣器,P83连接电源指示灯,P82连接风扇,P81连接风叶电机
端口P14连接红外传来的中断
定时器V的端口P76负责输出占空比可调的方波,控制压缩机电机的转速。

------------------------------------------------------------------------*/


/*------------------------------------------------------------------------
							   宏定义
------------------------------------------------------------------------*/

#define E IO.PDR1.BIT.B0
#define RS IO.PDR1.BIT.B1
#define RW IO.PDR1.BIT.B2
//E、RS、RW均为选用的LCD控制端口

/*------------------------------------------------------------------------
							  函数声明
------------------------------------------------------------------------*/

void ADConvert(void);			//AD转换子程序
void LCDupdate(void);			//LCD显示子程序
void LCDinit(void);				//LCD初始化
void LCD_Busy(void);			//LCD判忙子程序
void LCD_Print(void);			//LCD写程序
void Interrupt(void);			//红外中断子程序
void Sysinit(void);				//系统初始化
void Sysclose(void);			//系统关闭
void LcdStrUpdate(void);		//LCD显示内容更新
void PressLoadControl(void);	//压缩机电机控制,调整占空比
void TimerAInterrupt(void);		//定时器A的中断子程序,负责定时关机


/*-------------------------------------------------------------------------
							  参数定义
-------------------------------------------------------------------------*/

int turn_on = 0;				//指示当前系统状态 1、开 2、关
int mode = 0;					//指示系统模式 1、温度调节 2、定时设置 3、风叶开关
int TemperatureNow = 0;			//当前实际温度
int TemperatureSet = 0;			//用户设定温度	10度 -- 30度
int WetNow = 0;					//当前实际湿度
int TimeSet = 0;				//用户定时设定值	0 -- 180分钟
int FanState;					//风叶显示状态1:开 2:关
int TimerCounter = 0;			//用于和定时器A共同控制定时关机
int TimeFlag = 0;				//标志是否已经开始倒计时
int LcdBusy = 0;				//LCD是否繁忙标志位
int delaya = 0;					//延时变量
int delayb = 0;
int delayc = 0;
unsigned int temp = 0;
unsigned char LcdStr[] = {"0123456789abcdef"};	//存储LCD显示内容


/*--------------------------------------------------------------------------
							 函数实现
--------------------------------------------------------------------------*/

#pragma section

/*--------------------------------------------------------------------------

Function:					void main(void)
Purpose:					初始化设置,启动AD转换程序,并等待红外中断

--------------------------------------------------------------------------*/

void main(void)
{
	set_imask_ccr(1);     		//关中断

/*******************************端口设置**********************************/

	IO.PMR1.BIT.TMOW = 0;		//设置端口1为输出端口
	IO.PCR1 = 0xff;
	IO.PCR8 = 0x0ff;			//把Port8设为输出端口
	IO.PDR8.BIT.B4 = 0;
	IO.PDR8.BIT.B3 = 0;
	IO.PDR8.BIT.B2 = 0;
	IO.PDR8.BIT.B1 = 0; 			
	IO.PMR1.BIT.IRQ3 = 1;		//选择为TRGV输入管脚
	IO.PMR1.BIT.IRQ2 = 0;		//选择为通用IO
	IO.PMR1.BIT.IRQ0 = 1;		//选择为IRQ0输入,等待红外中断	
	//IO.PCR1 = 0x40;			//选择P16为输出管脚
	IIC.ICCR.BIT.ICE = 0;		//选择端口5为通用IO
	IO.PMR5.BYTE = 0;


/******************************定时器V的设置*******************************/

	TV.TCRV0.BYTE = 0x0b;
	TV.TCRV1.BYTE = 0x0e3;
	TV.TCSRV.BIT.OS = 0x06;
	TV.TCORB = 0;				//禁止压缩机工作


/*****************************定时器A中断设置******************************/
 
	TA.TMA.BYTE = 0x18;			//设定溢出周期为1s
	IRR1.BIT.IRRTA = 0;			//清标志位
	IENR1.BIT.IENTA = 0;		//禁止定时器A中断

	
/******************************IRQ0中断设置********************************/

	IEGR1.BIT.IEG0 = 1;			//设置上升延触发
	IRR1.BIT.IRRI0 = 0;			//清标志位
	IENR1.BIT.IEN0 = 1;   		//允许IRQ0中断

	set_imask_ccr(0);			//开中断
	
	ADConvert();				//开始A/D转换

	return;
}

void abort(void)
{
	
}

/*--------------------------------------------------------------------------

Function:					void LCD_Busy(void)
Purpose:					判断LCD是否可写	

---------------------------------------------------------------------------*/

void LCD_Busy(void)
{
	RS = 0;
	RW = 1;
	
	IO.PCR5 = 0;				//选择端口5为输入端口
	E = 1;
	LcdBusy = IO.PDR5.BIT.B7;
	E = 0;

	for(;LcdBusy == 1;)
	{
		IO.PCR5 = 0;
		E = 1;
		LcdBusy = IO.PDR5.BIT.B7;
		E = 0;
	}
	return;
}

/*--------------------------------------------------------------------------

Function:					void LCD_Print(void)
Purpose:					LCD写程序	

---------------------------------------------------------------------------*/

void LCD_Print(void)
{
	RW = 0;
	E = 1;
	E = 0;
	for(delaya = 0;delaya++<1000;);
	return;
}

/*--------------------------------------------------------------------------

Function:					void LCDinit(void)
Purpose:					初始化LCD,准备接收输入	

---------------------------------------------------------------------------*/

void LCDinit(void)
{
	int i = 0;
	
//	set_imask_ccr(1);     			//关中断	
	RS = 0;
	RW = 0;
	
	IO.PCR5 = 0x0ff;				//选择端口5为输出管脚
	IO.PDR5.BYTE = 0x30;

	for(i = 3;i > 0;i--)
	{
		E = 1;
		E = 0;
		for(delayb = 0;delayb++<8000;);
	}
	
	IO.PCR5 = 0x0ff;
	IO.PDR5.BYTE = 0x38;
	LCD_Print();
	
	IO.PCR5 = 0x0ff;
	IO.PDR5.BYTE = 0x01;
	LCD_Print();

	IO.PCR5 = 0x0ff;
	IO.PDR5.BYTE = 0x06;
	LCD_Print();

	IO.PCR5 = 0x0ff;
	IO.PDR5.BYTE = 0x0c;
	LCD_Print();

//	set_imask_ccr(0);     			//开中断
	return;
}

/*--------------------------------------------------------------------------

Function:					void LCDupdate(void)
Purpose:					使LCD显示相应内容	

---------------------------------------------------------------------------*/

void LCDupdate(void)
{
	int i = 0;

//	set_imask_ccr(1);     			//关中断
	RS = 0;
	IO.PCR5 = 0x0ff;
	IO.PDR5.BYTE = 0x01;
	LCD_Print();

	for(i = 0;i < 16; i++)
	{
		LCD_Busy();
		
		RS = 1;

		IO.PCR5 = 0x0ff;
		IO.PDR5.BYTE = LcdStr[i];
		LCD_Print();
		

		if(i == 7)
		{
			for(delayc = 0;delayc++ <4000;);
			RS = 0;
			IO.PCR5 = 0x0ff;
			IO.PDR5.BYTE = 0x0c0;
			LCD_Print();
		}
	}
//	set_imask_ccr(0);     			//开中断
	return;
}

/*--------------------------------------------------------------------------

Function:					void ADConvert(void)
Purpose:					进行A/D转换,改变相应值,并等待中断	

---------------------------------------------------------------------------*/

void ADConvert(void)
{
	unsigned int *addr_ptr;
	unsigned char adc_data;
	unsigned int counter;
	int i = 0;
	int ChangeMark = 0;				
	//IO.PDRB.BYTE = 0;				//clear PDRB;	
	while(1)
	{
		ChangeMark++;
		if(ChangeMark > 50) ChangeMark = 1;

		addr_ptr = &AD.DRA;
		counter = 0;
		adc_data = 0x00;
		while (counter < 2)
		{
			AD.CSR.BYTE = adc_data;
			
	//		set_imask_ccr(1);     				//关中断
			AD.CSR.BIT.ADF = 0;					//初始化ADF
			AD.CSR.BIT.ADST = 1;				//启动AD
			while (AD.CSR.BIT.ADF == 0) 		//等待AD采样结束
			{
				;
			}
			AD.CSR.BIT.ADST = 0;			
	//		set_imask_ccr(0);					//开中断

			temp = *(addr_ptr + counter);
			temp &= 0x0ffc0;
			if(counter == 0)
			{
				TemperatureNow = temp / 1300;	//使当前温度在0到50之间变化
			}
			else
			{
				WetNow = temp / 660;			//使当前湿度在0%到99%之间变化
			}

			adc_data ++;
			counter ++;
		}
			if((ChangeMark == 50) && (turn_on == 1) )//每5次更新一次LCD显示,并改变转速
			{
				PressLoadControl();
				LcdStrUpdate();
				LCDupdate();
			}
		for(i = 0;i <= 1000;i++);
	}
	return;
}

/*---------------------------------------------------------------------------

Function:					void Interrupt(void)
Purpose:					响应红外中断,对按键进行鉴别,实现相应的功能	

---------------------------------------------------------------------------*/

void Interrupt(void)
{
	IENR1.BIT.IEN0 = 0;   			//禁止IRQ0中断
	if(IO.PDRB.BIT.B2 == 1)			//按键1
	{

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -