新闻中心

EEPW首页>嵌入式系统>设计应用> 基于单片机的红外发送程序

基于单片机的红外发送程序

作者: 时间:2012-08-31 来源:网络 收藏

本程序适用于Infineon--,载波为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-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.51hei.com/mcu/1096.html//****************************************************************************#include "MAIN.H"// USER CODE BEGIN (MAIN_General,2)#includeintrins.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 ENDvoid 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 PriorityIP = 0x00; // load Interrupt Priority RegisterIPH = 0x00; // load Interrupt Priority High RegisterIP1 = 0x00; // load Interrupt Priority 1 RegisterIPH1 = 0x00; // load Interrupt Priority 1 High Register// USER CODE BEGIN (MAIN_Init,3)// USER CODE END// globally enable interruptsEA = 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;i4;i++)Table_Tx[i]=i+0xaa;}} }void Send_Code8(){uchar i=0; //循环变量for(i=0;i8;i++) //8位数据,顾循环8次{Set_Count=0x002b;//准备发送长达0.56ms(13*43=560us)的方波Flag=1; //置标志位(通过该标志位控制高低电平的转换),因为高电平器件,38K的波形不会改变    Count=0; //清零,准备计数    TR0=1; //启动定时器    while(CountSet_Count); //定时0.56ms,先发送0.56ms的高电平    TR0=0; //关闭定时器    if(HWTx_Code0x01) //判断待发送的数据的最低位为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(CountSet_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(CountSet_Count);//定时9ms,产生9ms的高电平TR0=0; //关闭定时器Set_Count=340;//准备产生4.5ms(13*340=4500)的低电平Flag=0; //置位,取反(该标志位控制高低电平的转换)  Count=0; //清零,准备计数TR0=1; //启动定时器T0while(CountSet_Count); //产生4.5ms的低电平TR0=0;for(i=0;i4;i++) //发送缓冲区里的数据{HWTx_Code=Table_Tx[i]; //赋值,等待发送Send_Code8(); //发送}Set_Count=43;//准备产生4.5ms(13*340=4500)的低电平Flag=1; //置位,取反(该标志位控制高低电平的转换)Count=0; //清零,准备计数TR0=1; //启动定时器T0while(CountSet_Count); //产生4.5ms的低电平TR0=0;HWTx=1; //置发射引脚的状态为高电平  delay(23);//延时23msSet_Count=690; //准备产生9.12ms的低电平,作为结束标志Flag=1;Count=0;TR0=1;while(CountSet_Count);//产生时间长达9.12ms的低电平TR0=0; //关闭定时器Set_Count=340;//准备产生4.5ms的高电平,作为结束标志Flag=0;Count=0;TR0=1;while(CountSet_Count);TR0=0;HWTx=1; //输出引脚拉高}void init_timer0(){EA=1;TMOD=0x02;//工作在方式2,8位自动重装模式ET0=1; //开分控TH0=0x52; //定时时间为13us,晶振12MTL0=0x52;}// USER CODE ENDvoid main(void){// USER CODE BEGIN (MAIN_Main,2)// USER CODE ENDMAIN_vInit();// USER CODE BEGIN (MAIN_Main,3)init_timer0(); //定时器T0的初始化函数Count=0; //定时器计数值清零Flag=0; //高低电平变化标志位HWTx_Out=1; //发射引脚的状态// USER CODE ENDwhile(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


评论


相关推荐

技术专区

关闭