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的方波 }