📄 aircondition.c
字号:
/***********************************************************************/
/* */
/* 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 + -