#include #define uchar unsigned char#define uint unsigned intsbit IR=P3^2; //红外接口标志sbit NEA1=P2^2;sbit NEB1=P2^3;sbit IN1=P2^0;sbit IN2=P2^1;sbit IN3=P2^4;sbit IN4=P2^5;char code Tab[16]="0123456789ABCDEF";unsigned char irtime;//红外用全局变量bit irpro_ok,irok;unsigned char IRcord[4];unsigned char irdata[33];unsigned char TempData[16];uchar a;void Ir_work(void);void Ircordpro(void);void qian_jin(void);void hou_tui(void);void zuo(void);void you(void);void ting(void);void zuo45(void); void you45(void);void delay(uchar t);void delay(uchar t) //延时1ms{uchar i,j,k;for(i=t;i>0;i--)for(j=142;j>0;j--)for(k=4;k>0;k--);}void DelayUs2x(unsigned char t){ while(--t);}void DelayMs(unsigned char t){while(t-...irok=0: hou_tui(); /
}
void EX0init(void)
{
IT0 = 1;
case 2;E
void zuo(void);)
{ a=4;
unsigned char IRcord[4];/3 /
TempData[2] =
unsigned char irdata[33];
void you(void); /
TempData[9] = Tab[IRcord[3]/
void Ircordpro(void);
unsigned char TempData[16];16];/
void you45(void);j--)
for(k=4;
}
k++; }
if(TempData[9]==定时器0工作方式2;
unsigned char cord;接收红外信号处理
static bit startflag;i++) /.2)
EX0 = 1;
case 3;
case 1;重载值
TL0=0x00;红外码值处理函数
{
unsigned char i; /
}
irpro_ok=1;j++) /
IN4=0;存储每个电平的持续时间;
}
void zuo(void)
{
IN1=0;=8; // }
if(TempData[9]==': qian_jin();
irpro_ok=0;
#include <
void Ir_work(void); && TempData[10]==
IN3=0; /,9ms+4;/是否开始处理标志位
if(startflag)
{
if(irtime
NEA1=1;0
IN2=0;指定外部中断0下降沿触发;
}
}
void TIM0init(void)/
IN2=1;初始化定时器
DelayMs(20);延时1ms
{
uchar i;
delay(150);用于计数2个下降沿之间的时间
}
void EX0_ISR (void) interrupt 0 /
NEB1=1;
default;处理数据反码
TempData[10] = Tab[IRcord[3]%16];
void hou_tui(void);/ }
if(irpro_ok)
{ Ir_work();a=0;
void ting(void);
}
void DelayUs2x(unsigned char t)
{
while(--t);
DelayUs2x(245);k>
void zuo45(void);
sbit NEB1=P2^3: you45(); break; && TempData[10]== }
switch(a)
{
case 0;
case 6;
void delay(uchar t) /
IN4=1, k;
sbit IN4=P2^5;16];
IN2=1;j>/63&&irtime>如果接收好了进行红外处理
{ Ircordpro();
i=0;
IN3=1;/D
TempData[3] = Tab[IRcord[1]//)
{ a=5;处理数据码
TempData[7] = Tab[IRcord[2]%16];ibit irpro_ok;
case 5;
}
void you(void)
{
IN1=1;TempData[10]=
NEB1=1; }
if(TempData[9]==',k;5
NEB1=1;i>处理4个字节
{
for(j=1;E
k=1;k--);//;/a=0;
IN3=0;
IN3=0;
NEA1=0;
NEA1=1;0;/0123456789ABCDEF"0; //
}
void DelayMs(unsigned char t)
{
while(t--)
{
/)
{ a=3;F大致延时1mS
DelayUs2x(245);延时有助于稳定
while(1)//
IN3=1;// /0
IN3=1;
sbit IN1=P2^0;
if(j
i++;
TempData[5] =
if(cord> }
if(TempData[9]==TempData[10]=
}
void you45(void)
{
IN1=1;主循环
{
if(irok) /处理客户码
TempData[1] = Tab[IRcord[0]%16];
TempData[6] = Tab[IRcord[2]/;)
{ a=2;
NEA1=1;
}
void hou_tui(void)
{
IN1=1; /
unsigned char irtime;
NEB1=1;
}
void ting(void)
{
IN1=0;
IN4=0;
NEA1=1; /j<
}
void tim0_isr (void) interrupt 1 using 1
{
irtime++;引导码 TC9012的头码; && TempData[10]== break;/,用于以后判断是0还是1
irtime=0; }
if(TempData[9]==/: zuo45(); && TempData[10]==stdio;
}
IRcord[i]=value.h>
sbit IN3=P2^4; break;1': a=0;/
NEA1=1;>;
IN4=1;处理客户码
TempData[4] = Tab[IRcord[1]%16];
IN2=0;
}
}
else
{
irtime=0;
IN4=0; break;/ break, j;
void delay(uchar t);
TempData[8] = /--/,irok;
IN4=1;
IN2=1; //
delay(100);开中断
TR0=1;=33)// /i--)
for(j=142;A16];/
IN2=0;
delay(100);
delay(150);//;
}
}
void qian_jin(void)
{
IN1=0;7定时器0初始化
{
TMOD=0x02;/初始化外部中断
TIM0init();
irdata[i]=irtime: ting();/
uchar a;8)
{
value>
if(i==33)
{
irok=1;0;开总中断
}
void Ir_work(void)
{
TempData[0] = Tab[IRcord[0]/,TH0是重装值;
NEB1=1;/ )
{ a=6;/=1;处理1个字节8位
{
cord=irdata[k]; /
char code Tab[16]=" )
{ a=1; )
{ a=0;16]; /,INT0 (P3;使能外部中断
EA = 1,value;
IN4=0,j;红外接口标志
sbit NEA1=P2^2;/.5ms
i=0;
case 4; /大于某值为1;/ }
if(TempData[9]==F处理完成标志
}
void Ircordpro(void)/-'.h> && TempData[10]==34;
#define uchar unsigned char
#define uint unsigned int
sbit IR=P3^2;
startflag=1;
NEB1=1;处理完毕标志位置1
}
void main(void)
{
EX0init();
IN3=0;/
NEB1=0;
IN2=0;7) /A && TempData[10]==
for(i=0;
for(i=t;
value=0; break; break; }
if(TempData[9]==': zuo(),TL0是初值
TH0=0x00;
sbit IN2=P2^1;/
}
void zuo45(void)
{
IN1=0;A;;reg52;
void qian_jin(void): you();7外部中断0服务函数
{
static unsigned char i;/ break; / && TempData[10]== /,
value|=0x80;初始化值
ET0=1;
NEA1=1智能玩具小车的设计与实现 程序 可以实现小车在红外遥控器下行驶 左转 右转 前进 后退 停止 要原理图的话 你懂的
#include<