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

📄 pt2221.c

📁 有32个按键的红外键盘
💻 C
字号:
/**********************************************************************************************
name: PT2221 红外解码 C 程序
device: 红外一体化接收头 + 89S51
Copyright (c) 2007-2008 张兴电子设计工作室技术开发部
author: 张兴
web: http://mcu.5d6d.com
date: 2007.8.4--0:00
description: 	用c做延时的32路红外遥控解码程序,程序中提供了两种实现延时的方法:
				1. 加入 intrins.h 头文件后,用for循环和_nop_ 联合组成的精确延时;
				2. 用 while(--i); 实现的精确延时

				红外一体化接收头接P3.2 (INT0)
				P37作工作指示用,解码成功后P36闪烁一次,同时,若解码值为01的话,会取反P35
edition:V1.0
***********************************************************************************************/
#include<PT2221.h>
//************************主程序***********************************
void main (void)  
{
	uint di;
	InitCom(); //初始化串口
	EA=1;
  	EX0=1;                   // 设定接受INT0的中断
	IT0=1;
  	ComOutChar(1);	//向串口发送 1 ,表示串口正常工作
	do
	{
		P37=~P37;	//工作指示灯,这个LED闪烁表示主程序在运行
		for(di=0;di<1000;di++)
		{
			delay1000us();
		}
	}while(1);
}
//*******************外部中断0 红外解码程序****************************************
static void decode(void) interrupt 0 using 2
{
	unsigned char IRCode[4]={0,0,0,0};
	unsigned char count0,count1,count2;
	unsigned char m;
	EX0 = 0; //外部中断0关闭
	for(count0=0;count0<10;count0++)	//起始码前9ms的低电平
	{
		delay882us();
		if(P32) goto exit;	//9ms没完就出来高电平则为干扰信号,跳出中断(退出解码)
	}
	if(!P32)	//低电平没完
	{
		delay4740us();	//9ms没结束再延时4740us,加上前面的8820us,已跳过起始码的13.5ms
		for(count1=0;count1<4;count1++)	//开始读数据,4个字节,32位
		{
			for(count2=0;count2<8;count2++)	//每个字节8位
			{
				while(!P32);	//等待高电平到来
				delay882us();
				if(P32)	//延时882us后,若P32还是高电平,则为 位1
					{
						IRCode[count1]=IRCode[count1]>>1;
						IRCode[count1]=IRCode[count1]|0x80;
						delay1000us();	//延时1000us,结束高电平
					}
				else	//延时882us后,若P32为低电平,则为 位0
				{
					IRCode[count1]=IRCode[count1]>>1;
					IRCode[count1]=IRCode[count1]|0x00;
				}
			}
		}	//到这里已读完所有32位数据
		if ((IRCode[0]==0x00)&&(IRCode[1]==0xff))	//判断用户码和用户反码是否正确
		{
			if (IRCode[2]==~IRCode[3])	//数据校验
			{
				//ComOutChar(IRCode[0]);
				//ComOutChar(IRCode[1]);
				ComOutChar(IRCode[2]);	//串口发送数据码
				//ComOutChar(IRCode[3]);
				P36=0;					//解码成功后led闪烁一次
				for(m=0;m<100;m++)
				{
					delay1000us();
				}
				P36=1;
				if(IRCode[2]==0x01)
				{
					P35=~P35;			//这里可加入控制命令,比如这里的当解码为01时取反P35
					for(m=0;m<100;m++)
					{
						delay1000us();
					}
				}
			}
		}
	}
exit:
	EX0 = 1;	
}

⌨️ 快捷键说明

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