|
/**************************************************************** *文件名: 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++); }//---------------------------------------
|