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

📄 16_2_3.c

📁 51事例原代码 事例多多 应该对初学者很有用
💻 C
字号:
//红外遥控接收程序

#include < REG51.h >
bit leader;				//引导码标记
bit user;					//用户码标记
unsigned long group;		//32位二进制码组
unsigned int code[4] = {0x00,0x00,0x00,0x00};
unsigned int length;		//码长
unsigned int *point;
unsigned char status;  		∥存放状态寄存器值

void main (void)
{
	unsigned int i;
	status = PSW; 				//保护状态字
	leader = 0; 				//清引导码标记
	user = 0; 					//清用户码标记
	length = 0; 				∥码长清零
	while (1)
		{						∥初始化
		TMOD = 0x11;			//00010001B,定时器0和1均为模式1,16位计数
		TCON = 0x05;			//00000101B,外部中断0和1均下降沿触发
		EA = 1;					//允许中断
		ETO = 1;				//定时器0中断允许
		TR0 = 1;				//定时器0接通工作
		EX0 = 1;				//外部中断0允许
		EX1 = 1;				//外部中断1允许
∥接收完一组符合编码要求的码组,则转到各个键功能处理程序
		if ((leader == 1)&&(length == 32))
			{
			for (i=0,i++,i<4)							//code[i]赋值
				{
				code[i]=(unsigned int)(group>>(4 *i));	//强制类型转换,
				}
			if ((code[2] == 0xF0)&&(code[2] == code[3])&&(~code[0] = code[1]))
														//户码为11110000B
				{
				user = 1;			//置用户码标记
				*point = code[1]; 	//将point 指针指向操作码
				key(*point);		//转各个键功能子程序
				point++;		
				}
			length = 0;				∥码长清零
			leader = 0; 			//清引导码标记
			user = 0; 				//清用户码标记
			}
		PSW= status; 				//恢复状态字
		}
}

/* INT0 中断,T0 开始计时 */
void service_int0() interrupt 1 using 1
{
	status = PSW;			//保护状态字
	TH0 = 0;				//清零TH0和TL0
	TL0 = 0;
	TR0 = 0;				//定时器0停止工作,防止重复中断
	ET0 = 1;				//定时器0中断允许
	EA = 1;					//开放中断
	PSW = status;			//恢复状态字
}

/* INT1 中断 */
void service_int1() interrupt 2 using2
{
	status = PSW; 			//保护状态字
	EX0 = 0;				//禁止外部中断0中断
	TR0 = 0;				//停止定时器0工作
	ET0 = 0;				//禁止定时器0中断
	EA = 0;				∥关闭T0
	if ((THO > = 0x01)&&(TH0 < = 0x03))	//计数值在0100H~0300H均当作"0"
   		group = group<<1 + 0; 			∥若编码代表"0",则在group 尾部加"0"
	else
		if ((TH0 > = 0x06)&&(TH0 < = 0x08))	//计数值为0600H~0800H时都当作"1"
			group = group << 1 + 1;		∥若编码代表"1",则在group尾部加"1"
		else
			if (TH0 > = 0x09)			//计数值大于0900H视为"引导码"
				{						//若编码代表"引导码"则引导码标志为"1",清码长
				leader = 1; 			//设立引导码标记
         		length = 0;				//码长清零
				}
			else
				{						//码组错误
				leader = 0; 			//清引导码标记
				user = 0; 				//清用户码标记
				length = 0; 			//码长清零
				}
	PSW = status;						//恢复状态字
}

/* 键功能子程序 */
void key(unsigned int *k)				
{
	unsigned int q;
	q = &k ;    						∥获得操作码地址
	switch(q)
		{
		case 0:	key_0_function();break;	//转到键"0"的功能子程序
		case 1:	key_1_function();break; //转到键"1"的功能子程序
		//......
		//......
		//......
		defult:	break;
		}
}

⌨️ 快捷键说明

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