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

📄 main.c

📁 ICCAVR C remote decoder 红外线解码,AVR
💻 C
字号:
#include"main.h"
#include"display.h"

uchar code Dis_Data[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
					   0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xff};			//数码管数字字库
//0,1,2,3,4,5,6,7,8,9,A,b,C,d,E,F,全灭

//*************函数声明*********************
void init_device(void);																					//初始化单片机
void init_port(void);
void init_data(void);
void init_timer(void);
void deal_data(void);
void init_extint(void);
//*************全局变量定义*****************
bit flag_5ms;	
uchar dis_c;		//com
uchar dis_s;		//seg
uchar dis_d[2]={0x12,0x34};
uchar data10,data20,data30,data40,count=0;//存红外解码后四个字节数据
bit flag1=0;				//0时亮,1时暗
uchar count10=0,count20=0,data00=0;
//************** ********************
void main(void)
{
	init_device();
	while(1)
	{
		if(flag_5ms)													//5ms轮显
		{
			flag_5ms = 0;
			display(~dis_c,dis_s);							//送显示数据
			deal_data();												//处理显示数据
		}
	}
}


//***************处理数据*******************
void deal_data(void)
{
	dis_c <<= 1;
	if((dis_c&0xf)==0)
		dis_c = 0x01;
	switch(dis_c)
	{
		case 1:dis_s = dis_d[0]/16;break;
		case 2:dis_s = dis_d[0]%16;break;
		case 4:dis_s = dis_d[1]/16;break;
		default:dis_s = dis_d[1]%16;break;
	}
	dis_s = Dis_Data[dis_s];
}
//****************程序初始化****************
void init_device(void)
{
	init_port();
	init_data();
	init_timer();
	init_extint();
}

void init_port(void)
{
	sclk = 0;
	rck = 0;
}

void init_data(void)
{
	dis_c = 0x01;							//从最左数码管开始显示
}

void init_timer(void)
{
	TH0 = TH0_D;
	TL0 = TL0_D;
	TMOD = 0x91;
	ET0 = 1;
	TR0 = 1;
	TH1 = 0;
	TL1 = 0;
	EA = 1;
}

void init_extint(void)
{
	IT1=1;		//下降沿中断
	IE1=0;		//标志位清1
	EX1=1;		//允许外部中断1
}


void ext1_interrupt(void)interrupt 2 using 2				//外部中断红外接收程序
{
	uchar a;
	TR1=0;	
	a=TH1;
	TH1=0;
	TL1=0;
	TR1=1;
	if(a<0x12)				//是否小于5ms
	{	
		if(a>0x0d)			//是否大于4ms
		{
			if(flag1==0)	//接收到4.5ms的起始码	
				flag1=1;
			else				//	在一次未解码完再次接收到起始码或连续接收到起始码,错误,重新初始化	
			{
				flag1=0;
				count10=0x00;
				count20=0x00;
				TR1=0;
				TH1=0;
				TL1=0;
			}
		}
		else
		{
			if(flag1==1)					//是否接收到起始码
			{							
				data00>>=1;			//data0为存着正在接收的解码数据
				if(a>0x02)
				{
					data00|=0x80;		//大于0.6ms为1
				}
				else
				{
					data00&=0x7f;		//小于0.6MS为0
				}
				count10++;					//接收到1位加1
				if(count10==8)				//是否接收到8位
				{
					count10=0;
					count20++;				//接收到一个字节加1
					switch(count20)			
					{
						case 1:data10=data00;break;	//接收到第一个字节
						case 2:data20=data00;break;	//接收到第二个字节
						case 3:data30=data00;break;	//接收到第三个字节
						default:data40=data00;			//接收完共四个字节
						if(data10==~data20 && data30==~data40)
						{
							dis_d[0] = data10;
							dis_d[1] = data30;
						}
						TR1=0;							//重新初始化
						TH1=0;
						TL1=0;
						count20=0;
						flag1=0;
					}	
				}
			}
		}
	}
}

void timer1_int(void)interrupt 1 using 1
{
	TH0 = TH0_D;
	TL0 = TL0_D;
	flag_5ms = 1;
}

⌨️ 快捷键说明

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