本程序適用于Infineon--XC866的單片機,載波為38KHZ,通過P3_0作為發送端口,其中:0由0.56m的高電平和0.56ms的低電平組成,1由0.56的高電平和1.68ms的電平組成。稍加修改可應用于C51。
發送程序如下:
//**************************************************************************** // @Module Project Settings // @Filename MAIN.C // @Project 20W.dav //---------------------------------------------------------------------------- // @Controller Infineon XC866-2FR // // @Compiler Keil // // @Codegenerator 2.0 // // @Description This file contains the Project initialization function. // //---------------------------------------------------------------------------- // @Date 2010-11-4 15:54:56 // //**************************************************************************** // USER CODE BEGIN (MAIN_General,1) // USER CODE END //**************************************************************************** // @Project Includes // 完整代碼下載地址:點這里 // 與本程序對應的紅外接收程序代碼:http://www.zg4o1577.cn/mcu/1096.html //**************************************************************************** #include "MAIN.H" // USER CODE BEGIN (MAIN_General,2) #include<intrins.h> #define uint unsigned int //宏定義 #define uchar unsigned char #define HWTx P3_0 //位聲明:紅外發射管腳 bit HWTx_Out; //紅外發射管腳的狀態 bit Key_Flag,Flag; //分別是:按鍵按下的標志位,定時器開始的標志位 uint Count,Set_Count; //控制定時時間的變量 uchar Table_Tx[4]={0x40,0,0,0};//待發送的緩沖區 uchar HWTx_Code,HWTx_data; // USER CODE END //**************************************************************************** // @Macros //**************************************************************************** // USER CODE BEGIN (MAIN_General,3) // USER CODE END //**************************************************************************** // @Defines //**************************************************************************** // USER CODE BEGIN (MAIN_General,4) // USER CODE END //**************************************************************************** // @Typedefs //**************************************************************************** // USER CODE BEGIN (MAIN_General,5) // USER CODE END //**************************************************************************** // @Imported Global Variables //**************************************************************************** // USER CODE BEGIN (MAIN_General,6) // USER CODE END //**************************************************************************** // @Global Variables //**************************************************************************** // USER CODE BEGIN (MAIN_General,7) // USER CODE END //**************************************************************************** // @External Prototypes //**************************************************************************** // USER CODE BEGIN (MAIN_General,8) // USER CODE END //**************************************************************************** // @Prototypes Of Local Functions //**************************************************************************** // USER CODE BEGIN (MAIN_General,9) // USER CODE END //**************************************************************************** // @Function void MAIN_vInit(void) // //---------------------------------------------------------------------------- // @Description This function initializes the microcontroller. It is // assumed that the SFRs are in their reset state. // //---------------------------------------------------------------------------- // @Returnvalue None // //---------------------------------------------------------------------------- // @Parameters None // //---------------------------------------------------------------------------- // @Date 2010-11-4 // //**************************************************************************** // USER CODE BEGIN (MAIN_Init,1) // USER CODE END void MAIN_vInit(void) { // USER CODE BEGIN (MAIN_Init,2) // USER CODE END /// ----------------------------------------------------------------------- /// Configuration of the System Clock: /// ----------------------------------------------------------------------- /// - On Chip Osc is Selected /// - PLL Mode, NDIV = 2 /// - input frequency is 10 MHz /// ********************************************************************************* /// Note : All peripheral related IO configurations are done in the /// respective peripheral modules (alternate functions selection) /// ********************************************************************************* /// Initialization of module 'GPIO' IO_vInit(); // Interrupt Priority IP = 0x00; // load Interrupt Priority Register IPH = 0x00; // load Interrupt Priority High Register IP1 = 0x00; // load Interrupt Priority 1 Register IPH1 = 0x00; // load Interrupt Priority 1 High Register // USER CODE BEGIN (MAIN_Init,3) // USER CODE END // globally enable interrupts EA = 1; } // End of function MAIN_vInit //**************************************************************************** // @Function void main(void) // //---------------------------------------------------------------------------- // @Description This is the main function. // //---------------------------------------------------------------------------- // @Returnvalue None // //---------------------------------------------------------------------------- // @Parameters None // //---------------------------------------------------------------------------- // @Date 2010-11-4 // //**************************************************************************** // USER CODE BEGIN (MAIN_Main,1) void delay(uint z) //延時時間約為 1ms*X 晶振為12M { uint x=0,y=0; for(x=z;x>0;x--) for(y=54;y>0;y--); } void Key_Scan() { uchar Key_Temp=0,i=0; if(P3_1!=1) { delay(10); if(P3_1!=1) { while(!P3_1); Key_Flag=1; for(i=1;i<4;i++) Table_Tx[i]=i+0xaa; } } } void Send_Code8() { uchar i=0; //循環變量 for(i=0;i<8;i++) //8位數據,顧循環8次 { Set_Count=0x002b;//準備發送長達0.56ms(13*43=560us)的方波 Flag=1; //置標志位(通過該標志位控制高低電平的轉換), 因為高電平器件,38K的波形不會改變 Count=0; //清零,準備計數 TR0=1; //啟動定時器 while(Count<Set_Count); //定時0.56ms,先發送0.56ms的高電平 TR0=0; //關閉定時器 if(HWTx_Code&0x01) //判斷待發送的數據的最低位為1或0, { //將決定低電平時間的長短,便于接收裝置的接收 Set_Count=130; //如果是1,則產生1.69ms(13*130=1690us)的低電平 } else { Set_Count=43; //如果是0,則產生0.56ms(13*43=560us)的低電平 } Flag=0; //用于產生低電平的標志位 Count=0; //清零,準備計數 TR0=1; //啟動定時器 while(Count<Set_Count);//產生長達對應時間的低電平 TR0=0; //關閉定時器 HWTx_Code=HWTx_Code>>1;//右移一位,準備發送 } } void Send_Code() { uchar i=0; Set_Count=690;//準備產生9ms(13*690=9000)的高電平 Flag=1; //置標志位,取反(該標志位控制高低電平的轉換) Count=0; //定時器計數 TR0=1; //啟動定時器 while(Count<Set_Count);//定時9ms,產生9ms的高電平 TR0=0; //關閉定時器 Set_Count=340;//準備產生4.5ms(13*340=4500)的低電平 Flag=0; //置位,取反(該標志位控制高低電平的轉換) Count=0; //清零,準備計數 TR0=1; //啟動定時器T0 while(Count<Set_Count); //產生4.5ms的低電平 TR0=0; for(i=0;i<4;i++) //發送緩沖區里的數據 { HWTx_Code=Table_Tx[i]; //賦值,等待發送 Send_Code8(); //發送 } Set_Count=43;//準備產生4.5ms(13*340=4500)的低電平 Flag=1; //置位,取反(該標志位控制高低電平的轉換) Count=0; //清零,準備計數 TR0=1; //啟動定時器T0 while(Count<Set_Count); //產生4.5ms的低電平 TR0=0; HWTx=1; //置發射引腳的狀態為高電平 delay(23);//延時23ms Set_Count=690; //準備產生9.12ms的低電平,作為結束標志 Flag=1; Count=0; TR0=1; while(Count<Set_Count);//產生時間長達9.12ms的低電平 TR0=0; //關閉定時器 Set_Count=340;//準備產生4.5ms的高電平,作為結束標志 Flag=0; Count=0; TR0=1; while(Count<Set_Count); TR0=0; HWTx=1; //輸出引腳拉高 } void init_timer0() { EA=1; TMOD=0x02;//工作在方式2,8位自動重裝模式 ET0=1; //開分控 TH0=0x52; //定時時間為13us,晶振12M TL0=0x52; } // USER CODE END void main(void) { // USER CODE BEGIN (MAIN_Main,2) // USER CODE END MAIN_vInit(); // USER CODE BEGIN (MAIN_Main,3) init_timer0(); //定時器T0的初始化函數 Count=0; //定時器計數值清零 Flag=0; //高低電平變化標志位 HWTx_Out=1; //發射引腳的狀態 // USER CODE END while(1) { // USER CODE BEGIN (MAIN_Main,4) Key_Scan(); //按鍵掃描函數 if(Key_Flag==1) //按鍵按下的標志,是否置位 { Send_Code(); //發送數據 delay(100); //延時5s Key_Flag=0; //按鍵按下標志位清零 } // USER CODE END } } // End of function main // USER CODE BEGIN (MAIN_General,10) void timer0() interrupt 1 //定時器T0 { Count++; //變量計數,可得出進入T0的次數,便可得出定時時間 if(Flag==1) { HWTx_Out=~HWTx_Out; //取反,不斷輸出周期為26us的方波 } else { HWTx_Out=0; //這里決定在接受程序,是以高電平還是低電平作為 判斷1 和0的依據 } HWTx=HWTx_Out; } // USER CODE END