📄 红外控制ds1302.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 + -