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

📄 红外控制ds1302.c

📁 74hc164键盘显示 红外控制DS1302 超级IO扫描 12864+遥控解码 1602+定时器 LCD1602+自定义图形
💻 C
字号:
 /***********************************************************************************/
/*     程序名:红外控制DS1302实时钟                                                 */
/*                                                                                  */
/*     晶振:12.0 M                                        CPU型号:AT89S52         */
/*                                                                                  */                                             
/*                                                                                  */
/*     功能描述: 将实验板上的J6与J5的123个用跳帽连上                               */
/*					                             									*/
/*                                                                                  */
/*     网址:http://www.mcu-arm.cn                                                  */
/*     邮箱:mcu-arm2007@163.com
/*     QQ技术群:2056101                                                            */
/*   													 					    	*/
/*                                                                                  */
/*                                                创灵电子工作室 版权所有           */                                 
/*                                                         2007-12-20               */
/************************************************************************************/
#include <reg5122.h>
#define uchar unsigned char               // 无符号8位整型变量
#define uint unsigned int
#define D 1
#define _TH0_TL0_ 	(65536 - 50000)  
#define HI 			(_TH0_TL0_ / 256) //给高8位赋值
#define LO 			(_TH0_TL0_ % 256) //给低8位赋值

static uchar flag, Sec_flag, Min_flag, time_flag, Time_flag0; //定义成静态变量,有利于数据的稳定性
static signed char Sec, Time, Min; //定义有符号的变量,方便我时钟的调整

sbit HW_IRQ = P3 ^ 2;                            // 定义38KHz一体化红外接收头与CPU的连接                                              
static uchar data IRCode[3],IRCON,IRCON2;

 

static signed char Count;
static uchar Count0;

/********************************************************************************************
* 函数名称:Delay()
* 功    能:延时程序
* 入口参数:延时时间
* 出口参数:无
*********************************************************************************************/
void Delay (uint t)
{
   uchar i;
   while(t--)
   {  for(i=0;i<125;i++)   //延时1Ms
       {;}
    }
}
/********************************************************************************************
* 函数名称:Timer0_Server()
* 功    能:定时器0中断服务程序
* 入口参数:无
* 出口参数:无
*********************************************************************************************/
void Timer0_Server(void) interrupt 1 using 2
{
  TH0=0xFC;                                      // 12M: TH0=0XFC;TL0=0XE0;11.0592:TH0=0XFD;TL0=0X1E;
  TL0=0xE0;                                      // 设定时值为800us  500:FE0C
  
  if(IRCON<3)
   {
     if(IRCON2<8)                                // 每中断一次读一次遥控接收头的状态,每二次为遥控编码中的一个位
      {
        IRCON2++;
        IRCode[IRCON]=IRCode[IRCON]<<1;          // 每读一次放入变量中的二进制的一个位,每次左移一位
        IRCode[IRCON]=IRCode[IRCON] | HW_IRQ;    // 每八次填满一个字节,一个字节存放遥控编码4个位
      }
     else
      {
        IRCON++;                                 // 填满一个字节,指向下一个变量
        IRCON2=0;                                // 计数清零
      }
   }
  else
   {
     TR0 = 0;                                    // 关闭定时器
     ET0 = 0;                                    // 定时器0中断关闭
     if((IRCode[1] != 0xFF) && (IRCode[2] != 0xFF))
      {
        if(IRCode[1] == 0x55)
    	 {
           Count0 =IRCode[2];	 
         }
		 if(IRCode[1] == 0x56)
		 {
	       Count0 =IRCode[2];	 
	     }
      }
   }
}
/********************************************************************************************
* 函数名称:Timer1_Server()
* 功    能:定时器0中断服务程序
* 入口参数:无
* 出口参数:无
*********************************************************************************************/
void Timer1_Server(void) interrupt 3 using 3
{
   uchar i;
   TR1 = 0;               //以下调整出栈入栈的时间误差
   TL1 += (_TH0_TL0_ + 9) % 256;
   TH1 += (_TH0_TL0_ + 9) / 256 + (char)CY;
   TR1 = 1; 
   if( i== 10) //
   {
      EX0 = 1;
	  i = 0;
   }
   i++;
   flag++;
   if(flag == 20)
   {
   	  flag = 0;
   }
}
/********************************************************************************************
* 函数名称:INT0_Server()
* 功    能:外部中断0中断服务程序
* 入口参数:无
* 出口参数:无
*********************************************************************************************/
void INT0_Server(void) interrupt 0 using 2
{
  EX0 = 0;                                       // 外部中断0关闭
  ET0 = 1;                                       // 定时器0中断打开
  TH0=0xFc;
  TL0=0xe0;                                      // 设定时值为800us
  ET1 = 1;
  TH1 = 0x02;
  TL1 = 0x18;

  for(IRCON=0;IRCON<3;IRCON++) IRCode[IRCON] = 0;
  IRCON = 0;
  IRCON2 = 0;                                    // 计数清零

  TR0 = 1;                                       // 开始计数
  TR1 = 1;
}

/********************************************************************************************
* 函数名称:main()
* 功    能:红外解码。将38KHz一体化红外接收头接收到的来自SAA-3010T遥控器的遥控编码在LED1~LED8
*           上显示(LED8为高位,LED1为低位,亮表示1,灭表示0)。
*********************************************************************************************/      
void main (void)                
{
  TMOD = 0x11;                                   // 定时器0,1方式1
  EA = 1;                                        // 允许CPU中断
  IT0 = 1;                                       // INT0下降沿有效
  EX0 = 1;                                       // 开INT0中断
 
  while(1)
  {
    P1=Count0;
	Delay(1000);
  }
}

⌨️ 快捷键说明

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