|
回复 沙发 shihuntaotie 的帖子
嗯嗯,非常感谢您的回答,我去找了个例程,我想用外部中断进行红外数据提取:#include
#include
#definde uchar unsigned char
#definde uint unsigned int
uchar irtime=TCNT0; //红外时间
uchar startflag; //是否启动接收
uchar irdata[33]; //1个引导码、8用户码、8用户码、8数据码、8数据码
uchar bitnum; //第几位
uchar irreceok; //代表红外接收完毕
uchar ircode[4]; //用于解码
uchar irprosok; //代表红外数据处理完毕
uchar disp[8];
uint PWMOfDJ;
/************************延时函数******************/
void delay_50us(uint t)
{
uchar j;
for(;t>0;t--)
for(j=19;j>0;j--);
}
void delay_50ms(uint t)
{
uchar j;
for(;t>0;t--)
for(j=6245;j>0;j--);
}
/***********************中断初始化***********************/
void timer0init(void)
{
TCCR0=0x00; //timer0 普通工作模式,无预分频
TCNT0=0x00;
}
void int0init(void) //外部中断
{
EICRA|=(1<
EIMSK|=(1<
SREG|=0x80; //开外部中断
}
/*********************舵机控制初始化********************/
void duojiinit(void)
{
MCUCSR|=(1<<7);
MCUCSR|=(1<<7);
DDRD = 0xFF;
DDRB = 0xFF;
DDRC = 0x00;
TCCR1A = 0b10100010; //快速PWM
TCCR1B = 0b00011001; //时钟1分频
ICR1H = 0xFF; //TCNT计数上限(最高16位)
ICR1L = 0xFF;
}
/********************舵机工作**************************/
void duojiwork(void)
{
if ((PINC & (1<
{
PWMOfDJ = 22;
OCR1AH=PWMOfDJ;
OCR1AL=256-PWMOfDJ;
delay_ms(1000);
PWMOfDJ = 30;
OCR1AH=PWMOfDJ;
OCR1AL=256-PWMOfDJ;
delay_ms(1000);
}
}
void display(void)
{
uchar i;
for(i=0;i<8;i++)
{
P1=smg_du[disp];
P2=smg_we;
delay_50us(20);
}
}
void irpros(void) //红外处理,提取数据
{
uchar k,i,j;
uchar value;
k=1;
for(j=0;j<4;j++)
{
for(i=0;i<8;i++)
{
value=value>>1; //右移7次
if(irdata[k]>6) //判断8次
{
value=value|0x80; //最高位置1
}
}
ircode[j]=value;
}
irprosok=1;
}
void main(void)
{
//timer0init(); //初始化
int0init(); //初始化
duojiint();
while(1)
{
if(irreceok)
{
irpros();
irreceok=0;
}
if(irprosok)
{
duojiwork();
irprosok=0;
}
}
}
/****************************中断服务函数*****************************/
/*
#pragma interrupt_handler timer0_ovf:3
void timer0_ovf(void)
{
if(startflag)
{
if(irtime>32) //检测引导码
{
bitnum=0; //bitnum清0
}
irdata[bitnum]=irtime; //装数据
irtime=0; //irtime清0
bitnum++;
if(bitnum==33)
{
bitnum=0;
irreceok=1; //用于主函数判断,当irreceok=1,要怎样
}
}
else
{
startflag=1;
irtime=0; //清0
}
}
上面的是我改的程序,我不知道程序会不会在接收到红外时进入外部中断。 |
|