?? host.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 + -