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

📄 host.c

📁 LPC900 FLASH单片机--红外多机通信应用实例
💻 C
字号:
/****************************************************************
*文件名:	Host.C
*版权:		www.zlgmcu.com
*日期:		16:27 04-3-16
*功能:		多机红外通信发送端程序代码
****************************************************************/
#include "reg932.h"
#define	uchar	unsigned char

sbit	KEY1=P0^0;					//定义KEY1
sbit	KEY2=P0^1;					//定义KEY2
					
sbit	Infr=P0^3;					//定义红外输出端口
//--------------------------------------
void	CCU_Init();					//CCU初始化
void	KeyISR_Init();				//键盘中断初始化
void	ReadKey();					//判断按键
void	Power_Down();				//完全掉电

void	StartDevice01();			//启动设备1(灯)
void	StartDevice02();			//启动设备2(门/窗)
void	SendHead();					//发送帧头
void	SendData(uchar Data);		//发送数据

void	delay400us();				//延时400us
void	delayms(uchar i);			//ms级延时
//--------------------------------------
void	KEY_ISR() interrupt	7{
	EA=0;							//关中断
	
	PCONA=0x00;						//功能模块上电
	CCU_Init();						//CCU模块初始化

	delayms(10);					//延时10ms
	ReadKey();						//判断按键

	KBCON=0x00;						//清键盘中断标志
	delayms(50);					//延时50ms
	EA=1;							//开中断
}

//--------------------------------------
main()
{
	P0M1=0x00;						//设置P0口为准双向
	P0M2=0x00;
	P2M1=0x40;						//设置P26为开漏						
	P2M2=0x40;
	CCU_Init();						//CCU初始化
	KeyISR_Init();					//键盘初始化
	while(1)
	{
		Power_Down();				//完全掉电
	}
}
//--------------------------------------
//功能:进入掉电模式
//--------------------------------------
void	Power_Down()
{
	PCONA=0xFF;						//外部功能模块掉电
	PCON=0x03;						//进入掉电模式
}
//-------------------------------------------------------------
//功能:	CCU模块初始化,使OCA(P2.7)输出38KHz,50%占空比的PWM波,
//使用内部RC振荡器时:CCU频率=((7375000/2)/6)*32=9.833MHz
//定时器重装值=CCU频率/红外线载频=9833333/38000=258.772=0x102
//-------------------------------------------------------------
void	CCU_Init()
{

    TOR2H=0x02;                     //定时器重装值
    TOR2L=0x05;
    OCRAH=0x01;                     //(OCRAH:OCRAL)=(TOR2H:TOR2L)/2,PWM的占空比为50%
    OCRAL=0x02;
    TCR21=0x85;                     //PLL预分频为5+1
    CCCRA=1;                        //非反相的PWM在比较匹配时置位,在CCU定时器向下溢出时清0

    PLLEN=1;						// 启动 PLL
	OCA=1;
    while(PLLEN==0);
    TCR20=0x82;						// 设置输出模式,非反相PWM

}
//--------------------------------------
//功能:键盘中断初始化
//--------------------------------------
void	KeyISR_Init()
{
	KBMASK=0x03;					//设置P01->P00为中断源
	KBCON=0x00;						//清除键盘中断标志
	EKBI=1;							//键盘中断允许
	EA=1;							//开中断
}
//--------------------------------------
//功能:键盘判断
//--------------------------------------
void ReadKey()
{	
	delayms(12);					//延时去抖动

	if(KEY1==0)						//等待KEY1按下
	{
		while(KEY1==0);				//等待KEY1为1
		StartDevice01();			//启动设备1(灯)
	}
	else if(KEY2==0)				//等待KEY2按下
	{
		while(KEY2==0);				//等待KEY2为1
		StartDevice02();			//启动设备2(门/窗)
	}
}

//--------------------------------------
//功能:启动设备1(门/窗)	
//--------------------------------------
void StartDevice01()				
{
	SendHead();						//发送帧头
	SendData(1);					//发送数据“1”,
}
//--------------------------------------
//功能:启动设备2(门/窗)
//--------------------------------------
void StartDevice02()
{
	SendHead();						//发送帧头
	SendData(2);					//发送数据“2”,
}
//--------------------------------------
//功能:发送帧头
//--------------------------------------
void SendHead()
{
	Infr=0;							//将Infr拉为低电平
	delayms(50);
	Infr=1;							//将Infr拉为高电平
	delayms(10);

	Infr=0;							//将Infr拉为低电平
	delayms(1);
	Infr=1;							//将Infr拉为高电平
	delayms(1);
	Infr=0;							//将Infr拉为低电平
	delayms(1);
}
//--------------------------------------
//功能:发送数据,从高位到低位依次发送8个位
//入口参数:要发送的数据
//--------------------------------------
void SendData(uchar  Data)
{
	uchar	Temp;
	uchar	i=8;
	while(i>0)
	{
		Temp=Data&0x80;				//取欲发送数的最高位
		if(Temp==0x80)				//对最高位进行判断.
		{	
			Infr=1;					//为1则将Infr拉高
		}
		else
		{
			Infr=0;					//为0,则将Infr拉低
		}
		
		i--;
		Data=Data<<1;				//循环移位
		delay400us();				//延时
	}
}
//--------------------------------------
//在内部RC作用的情况下,延时1000.9us
//--------------------------------------
void	delayms(uchar i)
{
	int	j;
	while(i>0)
	{
		for(j=0;j<670;j++);
		i--;
	}
}
//---------------------------------------
//在内部RC作用的情况下,延时 401us;
//---------------------------------------
void	delay400us()
{
	int	i;
	for(i=0;i<283;i++);
}//---------------------------------------

⌨️ 快捷键说明

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