|
/**************************************************************** *文件名: Host.C *版權(quán): www.zlgmcu.com *日期: 16:27 04-3-16 *功能: 多機(jī)紅外通信發(fā)送端程序代碼 ****************************************************************/ #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(); //啟動(dòng)設(shè)備1(燈) void StartDevice02(); //啟動(dòng)設(shè)備2(門/窗) void SendHead(); //發(fā)送幀頭 void SendData(uchar Data); //發(fā)送數(shù)據(jù) void delay400us(); //延時(shí)400us void delayms(uchar i); //ms級(jí)延時(shí) //-------------------------------------- void KEY_ISR() interrupt 7{ EA=0; //關(guān)中斷 PCONA=0x00; //功能模塊上電 CCU_Init(); //CCU模塊初始化 delayms(10); //延時(shí)10ms ReadKey(); //判斷按鍵 KBCON=0x00; //清鍵盤中斷標(biāo)志 delayms(50); //延時(shí)50ms EA=1; //開中斷 } //-------------------------------------- main() { P0M1=0x00; //設(shè)置P0口為準(zhǔn)雙向 P0M2=0x00; P2M1=0x40; //設(shè)置P26為開漏 P2M2=0x40; CCU_Init(); //CCU初始化 KeyISR_Init(); //鍵盤初始化 while(1) { Power_Down(); //完全掉電 } } //-------------------------------------- //功能:進(jìn)入掉電模式 //-------------------------------------- void Power_Down() { PCONA=0xFF; //外部功能模塊掉電 PCON=0x03; //進(jìn)入掉電模式 } //------------------------------------------------------------- //功能: CCU模塊初始化,使OCA(P2.7)輸出38KHz,50%占空比的PWM波, //使用內(nèi)部RC振蕩器時(shí):CCU頻率=((7375000/2)/6)*32=9.833MHz //定時(shí)器重裝值=CCU頻率/紅外線載頻=9833333/38000=258.772=0x102 //------------------------------------------------------------- void CCU_Init() { TOR2H=0x02; //定時(shí)器重裝值 TOR2L=0x05; OCRAH=0x01; //(OCRAH:OCRAL)=(TOR2H:TOR2L)/2,PWM的占空比為50% OCRAL=0x02; TCR21=0x85; //PLL預(yù)分頻為5+1 CCCRA=1; //非反相的PWM在比較匹配時(shí)置位,在CCU定時(shí)器向下溢出時(shí)清0 PLLEN=1; // 啟動(dòng) PLL OCA=1; while(PLLEN==0); TCR20=0x82; // 設(shè)置輸出模式,非反相PWM } //-------------------------------------- //功能:鍵盤中斷初始化 //-------------------------------------- void KeyISR_Init() { KBMASK=0x03; //設(shè)置P01->P00為中斷源 KBCON=0x00; //清除鍵盤中斷標(biāo)志 EKBI=1; //鍵盤中斷允許 EA=1; //開中斷 } //-------------------------------------- //功能:鍵盤判斷 //-------------------------------------- void ReadKey() { delayms(12); //延時(shí)去抖動(dòng) if(KEY1==0) //等待KEY1按下 { while(KEY1==0); //等待KEY1為1 StartDevice01(); //啟動(dòng)設(shè)備1(燈) } else if(KEY2==0) //等待KEY2按下 { while(KEY2==0); //等待KEY2為1 StartDevice02(); //啟動(dòng)設(shè)備2(門/窗) } } //-------------------------------------- //功能:?jiǎn)?dòng)設(shè)備1(門/窗) //-------------------------------------- void StartDevice01() { SendHead(); //發(fā)送幀頭 SendData(1); //發(fā)送數(shù)據(jù)“1”, } //-------------------------------------- //功能:?jiǎn)?dòng)設(shè)備2(門/窗) //-------------------------------------- void StartDevice02() { SendHead(); //發(fā)送幀頭 SendData(2); //發(fā)送數(shù)據(jù)“2”, } //-------------------------------------- //功能:發(fā)送幀頭 //-------------------------------------- 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); } //-------------------------------------- //功能:發(fā)送數(shù)據(jù),從高位到低位依次發(fā)送8個(gè)位 //入口參數(shù):要發(fā)送的數(shù)據(jù) //-------------------------------------- void SendData(uchar Data) { uchar Temp; uchar i=8; while(i>0) { Temp=Data&0x80; //取欲發(fā)送數(shù)的最高位 if(Temp==0x80) //對(duì)最高位進(jìn)行判斷. { Infr=1; //為1則將Infr拉高 } else { Infr=0; //為0,則將Infr拉低 } i--; Data=Data<<1; //循環(huán)移位 delay400us(); //延時(shí) } } //-------------------------------------- //在內(nèi)部RC作用的情況下,延時(shí)1000.9us //-------------------------------------- void delayms(uchar i) { int j; while(i>0) { for(j=0;j<670;j++); i--; } } //--------------------------------------- //在內(nèi)部RC作用的情況下,延時(shí) 401us; //--------------------------------------- void delay400us() { int i; for(i=0;i<283;i++); }//---------------------------------------
|