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

📄 main.c

📁 基于51单片机实现的红外信号发送与接收系统
💻 C
字号:

	#include<reg51.h>

	typedef unsigned char  byte;

	byte keyCode[4][16]={0,0,0,0,0,0,0,0xB4,0,0,0,0xD1,0,0xE1,0xF0,0,
						 0,0,0,0,0,0,0,0x2D,0,0,0,0x4B,0,0x78,0x87,0,
						 0,0,0,0,0,0,0,0,0,0,0,0,0,0x0F,0x1E,0,
						 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};  	//低四位为按键编码,高四位为校验码
	int clock=0;		//全局计数器,每次时钟中断加一

	void init()			//初始化
	{
		/*keyCode[0][14]=0xF0;	//0号键按下,P1高四位输出~(1<<0)=(1110),低四位检测到14=(1110)
		keyCode[0][13]=0xE1;	//1号键按下,P1高四位输出~(1<<0)=(1110),低四位检测到13=(1101)
		keyCode[0][11]=0xD2;	//2号键按下,P1高四位输出~(1<<0)=(1110),低四位检测到11=(1011)
		keyCode[0][7] =0xB4;	//3号键按下,P1高四位输出~(1<<0)=(1110),低四位检测到 7=(0111)

		keyCode[1][14]=0x87;	//4号键按下,P1高四位输出~(1<<1)=(1101),低四位检测到14=(1110)
		keyCode[1][13]=0x78;	//5号键按下,P1高四位输出~(1<<1)=(1101),低四位检测到13=(1101)
		keyCode[1][11]=0x4B;	//6号键按下,P1高四位输出~(1<<1)=(1101),低四位检测到11=(1011)
		keyCode[1][7] =0x2D;	//7号键按下,P1高四位输出~(1<<1)=(1101),低四位检测到 7=(0111)

		keyCode[2][14]=0x1E;	//8号键按下,P1高四位输出~(1<<2)=(1011),低四位检测到14=(1110)
		keyCode[2][13]=0x0F; 	//9号键按下,P1高四位输出~(1<<2)=(1011),低四位检测到13=(1101)	*/

		TMOD=0x02;	//使用计时器0,模式2,8位自动重装载,每当TL0溢出后自动重装载TH0 的值
		TH0=0x9C;	
		TL0=0x9C;	//赋8位时钟计数器初值,每 0xFF - 0x9C = 100us = 0.1ms中断一次
		EA=1;		//开中断
		ET0=1;	    //注意,此时时钟并未启动
	}
	
	void sendLeadCode()	//发送引导码,8ms高电平,8ms低电平
	{
		TR0=1;			//启动时钟

		clock=0;
		while(clock<80)
			P0|=1;		//P0.0=1,循环持续8ms
				
		while(clock<160)
			P0&=0xFE;	//P0.0=0。循环持续8ms

		TR0=0;			//关闭时钟
		TL0=0x9C;
	}

	void sendBit(byte bitToSend)//发送一位脉位调制信号,1ms高电平,1ms或3ms低电平
	{
	 	TR0=1;			//启动时钟

		clock=0;
		while(clock<10)
			P0|=1;		//P0.0=1,循环持续1ms
				
		if(bitToSend & 0x01)//如果是bit"1"
			while(clock<40)
				P0&=0xFE;	//P0.0=0,循环持续3ms
		else			   	//如果是bit"0"
			while(clock<20)
				P0&=0xFE;	//P0.0=0,循环持续1ms

		TR0=0;			//关闭时钟
		TL0=0x9C;
	}

	void sendEnd()
	{
		clock=0;
		TR0=1;
		while(clock<2)
			P0|=1;
		P0&=0xFE;
		TR0=0;
                TL0=0x9C;
	}
	
	void sendCode(byte keyCode)//发送编码code及其反码,共8位
	{
		char i;

		sendLeadCode();		   //发送引导码
		for(i=0;i<8;i++)	   //依次从低到高发送8位编码
			sendBit(keyCode>>i);
		sendEnd();
	}

	void main()
	{
		byte i,t;

		init();
		while(1)//轮询检测按键
		{
			for(i=4;i<8;i++)//P1口高四位依次变低电位,检测低四位
			{
				P1=~(1<<i);
				if((t=keyCode[i-4][P1 & 0x0F])!=0)//如果有按键按下,则查表得到的编码t不为0
					sendCode(t);
			}
		}
	}

	void timer() interrupt 1  //时钟中断处理函数
	{
		clock++;	//全局时钟加一		
	}

⌨️ 快捷键说明

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