⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 red_tran.c

📁 红外调试程序
💻 C
字号:
/****************************************************************************************************/
#include <REG2051.H>
/****************************************************************************************************/
//端口定义
sbit  led     =P1^6;   //指示灯
sbit  wave_bit=P1^7;   //红外载波输出端
sbit  key_1   =P3^2;   //按键一
sbit  key_2   =P3^3;   //按键二(高级按键)
/****************************************************************************************************/
//标志位及全局变量
bit   key1_bit=0;      //按键1(普通用户)标志位  
bit   key2_bit=0;      //按键2(高级用户)标志位
unsigned char normal_user_code[3]={0x55,0x03,0xaa};  //普通用户红外代码
unsigned char senior_user_code[3]={0x00};  //高级用户红外代码
/****************************************************************************************************/
//函数名称:ini_51
//函数功能:对51单片机的初始状态进行设置,供监控程序调用
//入口参数:无
//出口参数:无
//****备注:本函数中对51单片机初始状态进行设置的有:SCON,T0,T1,INT0,INT1
void ini_51(void)
{
   wave_bit=0;        //初始状态中不产生载波
   PCON = PCON&0x7f;  //取消波特率倍增位
   SCON = 0x40;       //串口工作在模式1
   TMOD = 0x22;       //T0,T1均工作在自重装的方式下
   TL0  = 0xf4;       //T0产生40KHz载波
   TH0  = 0xf4;
   TL1  = 0xe8;       //波特率为1200
   TH1  = 0xe8;
   ET0  = 1   ;       //允许T0中断
   EX0  = 1   ;       //允许外部中断0中断
   EX1  = 1   ;       //允许外部中断1中断
   EA   = 1   ;       //开中断
   TR1  = 1   ;       //启动定时器1
}
/****************************************************************************************************/
//函数名称:t0_sev
//函数功能:定时器0中断服务程序
//入口参数:无 
//出口参数:无
//****备注:用于产生40KHz载波
void t0_sev(void) interrupt 1
{
  wave_bit=!wave_bit;  //在单片机模拟载波的端口上产生40KHz的载波
}
/****************************************************************************************************/
//函数名称:int0_sev
//函数功能:外部中断0的中断服务函数
//入口参数:无
//出口参数:无
//****备注:用来将按键1(普通用户)标志位置位
void int0_sev(void) interrupt 0
{
  EA=0;
  key1_bit=1;     //置按键1(普通用户)位
  EA=1;
}
/****************************************************************************************************/
//函数名称:int1_sev
//函数功能:外部中断1的中断服务函数
//入口参数:无
//出口参数:无
//****备注:用来将按键2(高级用户)标志位置位
void int1_sev(void) interrupt 2
{ 
  EA=0;
  key2_bit=1;    //置按键2(高级用户)位
  EA=1;
}
/****************************************************************************************************/
//函数名称:delay
//函数功能:软件产生延迟时间
//入口参数:具体需要延时时间的参数
//出口参数:无 
//****备注:无 
void delay(unsigned int N)
{
  unsigned int i;
  for(i=0;i<N;i++);
}
/****************************************************************************************************/
//函数名称:uart_tran
//函数功能:串口数据发送
//入口参数:指向地址的指针
//出口参数:无
//****备注:无
void uart_tran(unsigned char *p)
{
  SBUF=*p;             //发送数据
  while(TI==0)         //未发送完成,等待
    {;}
  if(TI)               //发送完成
   {
     TI=0;             //清发送中断标志位
   }
}
/****************************************************************************************************/
//函数名称:key1_manage
//函数功能:按键1(普通用户)处理程序
//入口参数:无
//出口参数:无
//****备注:无
void key1_manage(void)
{
  unsigned char i,j;
  unsigned char start_byte=0x55;   //数据包的开始字节,用于同步数据的传送
  unsigned char   end_byte=0xaa;     //数据包的结束字节,用于结束数据的传送
  normal_user_code[0]=start_byte;
  normal_user_code[2]=  end_byte;
  led=0;         //点亮指示灯
  for(j=0;j<3;j++)                      //按键一次发送三次
    {
	  for(i=0;i<3;i++)
	    {
		  EA =1;    //允许中断,制造载波
          TR0=1;   //启动T0,制造载波
		  uart_tran(normal_user_code+i);    //一次发送三个字节
          TR0=0;   //一个字节的数据发送完毕,停止载波的制造
	      EA =0;     //关中断,避免按键中断的触发
		  wave_bit=0;  //禁止红外的输出
		}
	  delay(1500);      //延时约30MS
	}
  led=1;            //动作完毕后,关闭指示灯
}
/****************************************************************************************************/
//函数名称:key2_manage
//函数功能:按键2(普通用户)处理程序
//入口参数:无 
//出口参数:无 
//****备注:无 
void key2_manage(void)
{
  ;
}
/****************************************************************************************************/
//函数名称:main
//函数功能:监控程序
//入口参数:无
//出口参数:无
//****备注:无
void main(void)
{
  ini_51();
  while(1)
    {
	  if(key1_bit)
	   {
	     EA=0;     //关中断,禁止按键的再次中断
	     key1_bit=0;          //清按键1(普通用户)标志位
		 delay(1000);         //延时20MS左右
		 if(key_1==0)         //若此时按键1(普通用户)的状态仍为0,表示确实有键按下
		  {
		    while(key_1==0)
			  {;}             //在按键松开前一直等待
		    key1_manage();    //在按键松开后即执行按键相应的处理程序
		  }
		 else {break;}             //无键按下,空动作
	     EA =1;      //一次按键的动作执行完毕,开中断等待下次中断的到来
	   }
	  if(key2_bit)
	   {
	     key2_bit=0;          //清按键2(高级用户)标志位
	   }
	}
}
/****************************************************************************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -