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

📄 irr._c

📁 16个单片机c语言实验程序
💻 _C
字号:
//Atmega16的红外遥控器接收试验
//使用1602液晶进行显示,
#include<iom16v.h>
#include"1602.h"
#pragma interrupt_handler ext_int0_isr:2  //指定外部中断函数
#define uchar unsigned char 
#define uint unsigned int 

uchar irr_b=0,s_s=0;
uchar wb=0,a=0,ds=0;
long da=0;
uchar d1,d2,d3,d4;
uchar ten_1,ten_2,ten_3,ten_4,i;

//中断接收
void ext_int0_isr(void)
{
if(irr_b==0)        //第一个中断
  {
  irr_b=1;          //状态为:开始接收
  TCNT1L=0x00;      //定时器清零
  }
else if(irr_b==1)   //第二个以后的中断
  {
   a=TCNT1L;        //读取定时器的值
   //判断是引导,还是数据
   if((170<a)&&(a<235))       //引导
     {
      wb=0;                   //数据计数清零     
	  da=0;                   //数据清零
	  TCNT1L=0x00;            //定时器清零 
	  }
   else if((8<a)&&(a<25))     //数据0
     { 
     wb++;
     da=(da<<1);
	 TCNT1L=0x00;
     }
   else if((25<a)&&(a<45))    //数据1
     {
     wb++;
	 da=(da<<1)+1;
	 TCNT1L=0x00;
     }
}
if(wb==32)                    //数据长度够32位
  {
  irr_b=0;                    //状态为停止接收
  wb=0;                       //数据计数清零
  s_s=1;                      //打开显示许可
  }
}

//定时器T1初始化
void t1_init()
{
TCCR1B=0x00;   //关闭定时器
TCNT1H=0x00;   //定时器初值
TCNT1L=0x00;
TCCR1A=0x00;   //
TCCR1B=0x05;   //1024分频
}

//主函数
main()
{
//初始化端口
DDRA=0xff;
PORTA=0x00;
DDRB=0xff;
DDRD=0x00;    //中断输入
PORTD=0xff;   //内部上拉

t1_init();

MCUCR = 0x02;//下降沿中断
GICR  = 0x40;//开外部中断int_0
TIMSK = 0x00;   
SREG=0x80;         //开全局中断
s_s=1;
while(1)
    {
	ds=TCNT1L;
	if(ds>250)     //定时器超时,接收复位
	  {
	  TCNT1L=0;
	  irr_b=0;
	  da=0;
      wb=0; 
      s_s=0;
	  }
	if(s_s==1)     //显示开关打开,开始显示
	{
	SREG=0x00;     //关闭全局中断
	LcdInit();     //1602初始化
	//显示设备码
	d1=da>>24;
	ten_1=d1/100;
	ten_2=(d1-(100*ten_1))/10;
	ten_3=d1-(100*ten_1)-ten_2*10;
	WriteNum(1,0,ten_1);
	WriteNum(1,1,ten_2);
	WriteNum(1,2,ten_3);
	//显示设备码反码
	d1=da>>16;
	ten_1=d1/100;
	ten_2=(d1-(100*ten_1))/10;
	ten_3=d1-(100*ten_1)-ten_2*10;
	WriteNum(1,4,ten_1);
	WriteNum(1,5,ten_2);
	WriteNum(1,6,ten_3);
	//显示键码
	d1=da>>8;
	ten_1=d1/100;
	ten_2=(d1-(100*ten_1))/10;
	ten_3=d1-(100*ten_1)-ten_2*10;
	WriteNum(1,8,ten_1);
	WriteNum(1,9,ten_2);
	WriteNum(1,10,ten_3);
	//显示键码反码
	d1=da;
	ten_1=d1/100;
	ten_2=(d1-(100*ten_1))/10;
	ten_3=d1-(100*ten_1)-ten_2*10;
	WriteNum(1,12,ten_1);
	WriteNum(1,13,ten_2);
	WriteNum(1,14,ten_3);
	//复位D端口
	DDRD=0x00;    //中断输入
    PORTD=0xff;   //内部上拉
	s_s=0;        //关闭显示开关
	SREG=0x80;    //开全局中断
	}
	}
}

⌨️ 快捷键说明

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