3-38KHZ方波采用中断的方式处理(影响到编码脉宽)--未成功

//***********产生38KHZ的方波时,采用中断的方式处理(在中断中对输出取反)

,但是在示波器中看波形宽度的时候,发现它影响到位‘0’和位‘1’编码脉宽--因此

未成功。下一步决定采用查询的方式来产生38KHZ的方波。****************************/ /****************************红外编码子程序************************************************/

//============================================================================== ===========

//hongwai.c

//writer:莫熙乐2010年4月;修改作者:whtujingjing 2011年8月2日

/**1、测试条件:f=22.1184MHZ晶振频率,STC89C52RC单片机****************************************/

/**2、编码标准:NEC的PPM码;

/************即位0低电平时间为0.56ms;位1低电平时间为1.68ms;它们的高电平时间均为0.56ms***/

/**3、准备应用场合:红外发送温度数据(系统码为:ir_systemvalue,数据码为:temprature_value)*/

//============================================================================== ===========

#include

sbit P3_7=P3^7;//从该口发出编码脉冲

sbit P3_6=P3^6;

sbit P2_0=P2^0;

#define temprature_value 26; //数据码

#define ir_systemvalue 1; //系统码

#define uchar unsigned char

//unsigned char wy[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//这个代码的发送顺序有误,应该是先发送高位,后发送低位。

unsigned char wy[8]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};//用来提取代码的每一位。

long int count,endcount;//delay延时计数变量

/*晶振频率f=22.1184MHZ时;当 TL0 =TH0 = 0xe8时,可以产生38.4KHZ的方波;在f=12MHZ 时,TH0 = TL0 =0xf3时可以产生38.4664KHZ的方波*/

void time_0_initial()

{

// 定时、中断初始化

TMOD = 0x02; // T0使用定时模式,工作模式2,无门控位

// TH0 = 0xff-0x18=0xe7;

TH0 = TL0 =0xe8; // 为T0填入初值,定时时间13us

//TR0 = 1; // 启动T0

ET0 = 1; // 允许定时器0中断

EA = 1; // CPU开放中断

}

void sendirdata()

{

uchar s=0,user=0,shuju=0,hc=0;

/******************************************************************************* ************

//============================================================================== ===========

long int ms_9=312,ms_4_5=156,ms_1_134=39,us_558=19;

上次ms_1_134=39脉冲时间与NEC标准有误,修改为ms_1_68=58;

long int ms_9=312,ms_4_5=156,ms_1_68=58,us_558=19;

以上参数是对应晶振频率为f=22.1184MHZ时的参数

ms_9对应9ms;

ms_4_5对应4.5ms;

ms_1_134对应1.125ms;

ms_1_68对应1.68ms;

us_558对应0.56ms;

//============================================================================== ===========

******************************************************************************** **********/

long int ms_9=312,ms_4_5=156,ms_1_68=58,us_558=19;

//time_0_initial();

TR0=1; //定时/计数器T0启动

/***发送引导码******************************************/

endcount=ms_9; //发送9ms起始码的高电平

P3_7=1;

count=0;

do{count++;}while(count

endcount=ms_4_5; //发送4.5ms的结果码低电平

count=0;

P3_7=0;

do{count++;}while(count

/***发送系统码*******************************************/

user=ir_systemvalue;

for(s=0;s<=7;s++)

{

endcount=us_558;count=0; //发送公共的0.56ms高电平

P3_7=1;

do{count++;}while(count

hc=user & wy[s]; //发送脉冲间距

if (hc==0){endcount=us_558;count=0;}

else{endcount=ms_1_68;count=0;}

P3_7=0;

do{count++;}while(count

}

/***发送系统反码******************************************/ user=ir_systemvalue;

for(s=0;s<=7;s++)

{

endcount=us_558;count=0; //发送公共的0.56ms高电平

P3_7=1;

do{count++;}while(count

hc=user & wy[s]; //发送脉冲间距

if (hc==0){endcount=ms_1_68;count=0;}

else{endcount=us_558;count=0;}

P3_7=0;

do{count++;}while(count

}

/***发送数据码********************************************/ shuju=temprature_value;

for(s=0;s<=7;s++)

{

endcount=us_558;count=0; //发送公共的0.56ms高电平

P3_7=1;

do{count++;}while(count

hc=shuju & wy[s]; //发送脉冲间距

if (hc==0){endcount=us_558;count=0;}

else{endcount=ms_1_68;count=0;}

P3_7=0;

do{count++;}while(count

}

/***发送数据反码******************************************/

shuju=temprature_value;

for(s=0;s<=7;s++)

{

endcount=us_558;count=0; //发送公共的0.56ms高电平

P3_7=1;

do{count++;}while(count

hc=shuju & wy[s]; //发送脉冲间距

if (hc==0){endcount=ms_1_68;count=0;}////if (hc==0){endcount=120;count=0;} else{endcount=us_558;count=0;}////else{endcount=30;count=0;}

P3_7=0;

do{count++;}while(count

}}

void main(void)

{

P3_6=1;

time_0_initial();

if(P2_0==0)

{

sendirdata();

//while(1);

}

}

/* T0溢出中断处理函数 */

void timer0_int () interrupt 1 using 1 // T0溢出中断,使用工作组2

{

P3_6= !P3_6; // P3_6取反,产生38KHZ的方波

}

相关文档
最新文档