|
#include <avr/io.h>
#include <avr/delay.h>
#include <avr/signal.h>
#include <avr/interrupt.h>
//#include "mega64.h"
#include "ina90.h"
//#define EXT_INT6 6
volatile int i=0;//测试变量i
/*------------------------------------------------------------------*
* 红外接受程序 *
*------------------------------------------------------------------*/
/*---------------------*/
/* 红外接收全局变量 */
/*---------------------*/
char ray_singal_num = 0; //接受信号
char ray_data_in = 0; //ray_data_in为接收的数据
char ray_symbol = 0;
char ray_count_array[20] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};//Bit位数组
char ray_ordar = 0; //最终得到的命令(鸡肋)
/*---------------------*/
/* 函数声明区 */
/*---------------------*/
void ray_judger(void);
void int0_init(void);
void Timer1_init(void);
/*******红外线接收**********/
void ray_receive_init(void)
{
int0_init();
Timer1_init();
}
/********************************************************************
* 函数说明:定时器1初始化程序 *
*********************************************************************/
void Timer1_init(void)
{
TCNT1 =0;
TCCR1B =0x03;
}
/********************************************************************
* 函数说明:外中断0初始化程序 *
*********************************************************************/
void int0_init(void)
{
//MCUCR=0x02;//开中断0、下降沿触发脉冲
//GIFR=0xff;
}
/*unsigned char uc_Led;
//16位定时器普通模式使用,1s改变一次灯亮的状态
void timer1_init(void)
{
TCCR1B=0x00; //先停止定时器1
TCNT1H=0xF0;
TCNT1L=0xBE;
TCCR1A=0x00;
TCCR1B=0x05; //启动定时器1,使用1024分频
}
unsigned char sreg;
void T1()
{
unsigned int i1;
TCNT1=0x1FF;
i1=TCNT1;
}
unsigned int TIM16_ReadTCNTn(void)
{
unsigned int i1;
unsigned char sreg;
sreg=SREG;//保存中断标志
_CLI();//禁止中断
i=TCNT1;
SREG=sreg;
return i1;
}*/
/********************************************************************
* 函数说明:红外信号处理程序 *
********************************************************************/
void ray_judger(void)
{
char i=0;
ray_data_in=0;
for(i=0;i<8;i++) //加入适当的冗错处理
{
if(ray_count_array < 0x38) //0.5ms为低电平
{
ray_data_in &= ~(1<<i);
}
if(ray_count_array >=0x38) //1ms为高电平
{
ray_data_in |= (1<<i);
}
}
ray_ordar = ray_data_in;
}
/********************************************************************
* 函数说明:外中断6中断处理程序 *
*********************************************************************/
SIGNAL(SIG_INTERRUPT6) //INT6中断服务程序
{
i++;
char temp =0;
temp = TIMSK;
TIMSK = 0;
if(ray_symbol == 0)
{
if(TCNT1 >= 0x00ff) //大于4MS则重置指针
{
ray_singal_num = 0;
}
TCNT1 = 0X00; //0.5ms记数值为31
MCUCR = 0X03; //INT0上升沿触发
ray_symbol = 1;
}
else
{
if((TCNT1H == 0)&&(TCNT1 <= 0x00ff))
{
ray_count_array[ray_singal_num] = TCNT1L;
ray_singal_num ++;
if (ray_singal_num == 8)
{
ray_singal_num = 0;
ray_judger();
}
ray_symbol = 0;
}
else
{
ray_singal_num = 0;
}
MCUCR = 0X02; //INT0下降沿触发
TCNT1 = 0;
}
TIMSK = temp;
}
void deal()
{
char temp =0;
temp = TIMSK;
TIMSK = 0;
if(ray_symbol == 0)
{
if(TCNT1 >= 0x00ff) //大于4MS则重置指针
{
ray_singal_num = 0;
}
TCNT1 = 0X00; //0.5ms记数值为31
//MCUCR = 0X03; //INT0上升沿触发
EICRA|=0x30;//EICRB5:4配置为1、1,上升沿都产生中断
//EICRA&=0xEF;
ray_symbol = 1;
}
else
{
if((TCNT1H == 0)&&(TCNT1 <= 0x00ff))
{
ray_count_array[ray_singal_num] = TCNT1L;
ray_singal_num ++;
if (ray_singal_num == 8)
{
ray_singal_num = 0;
ray_judger();
}
ray_symbol = 0;
}
else
{
ray_singal_num = 0;
}
//MCUCR = 0X02; //INT0下降沿触发
EICRA|=0x20;//EICRB5:4配置为1、0,下降沿都产生中断
EICRA&=0xEF;
TCNT1 = 0;
}
TIMSK = temp;
}
/********************************************************************
* 函数说明:外中断2中断处理程序 *
*********************************************************************/
SIGNAL(SIG_INTERRUPT2) //INT2中断服务程序
{
if(3==i)
{
i=2;
deal();
}
i++;
}
void main(void)
{
ray_receive_init();
SREG|=0x80;//置位全局中断使能
EIMSK|=0x04;//0000 0100b对外部中断请求2使能
EICRA|=0x20;//EICRB5:4配置为1、0,下降沿都产生中断
EICRA&=0xEF;
DDRD=0xFF;//D Output
while(1)
{
PORTD|=0x04;//PD2=1; 模拟产生中断
PORTD&=0xFB;//PD2=0;
}
/*SREG|=0x80;//置位全局中断使能
EIMSK|=0x40;//0100 0000b对外部中断请求6使能
EICRB|=0x10;
EICRB&=0xDF;//EICRB5:4配置为0、1,上升沿和下降沿都产生中断
DDRE=0xFF;//E 设置为输出
while(1)
{
PORTE|=0x40;//实现对pe6 口的改变把pe6 =1;
PORTE&=0xBF;//pe6=0;
};*/
/*ray_receive_init();
T1();
TIM16_ReadTCNTn();*/
/*timer1_init();
uc_Led=0;
DDRB=0xff;
while(1)
{
while(!(TIFR&0x04));
PORTB=uc_Led++;
TCNT1H=0xF0;
TCNT1L=0xBE;
if(uc_Led==255)
uc_Led=0;
TIFR |=0x04;
}*/
} |
阿莫论坛20周年了!感谢大家的支持与爱护!!
一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。
|