/*----------------------------------------------------------------- ; Copyright (C) 2006 WangChanghong INTEGRATED PRODUCTS, INC. ; All rights reserved. ; MCU:AT89s52 ,晶体频率:12MHz : 作者:汪长洪 : 时间:2006年08月01日 ; 地点:威海 ;----------------------------315M无线遥控解码程序-----------------*/ #include #define uchar unsigned char #define uint unsigned int /*---------------------------------变量列表-------------------------*/ uchar ReadCode[3],GetCode; /*---------------------------------函数列表-----------------------*/ void delay_200(void); //200us精确延时 void delay_250(void); //250us精确延时 void delay_131(void); //131ms精确延时 void init(void); //初始化子程序 void INT0_intrupt(); //中断处理子程序(解码程序) /*-----------------------------主程序入口---------------------*/ main() { init(); while(1) { P2=~GetCode|0xf0; } } /*---------------------------------初始化子程序----------------*/ void init(void) { EA=1; //打开CPU总中断请求 EX0=1; //打开INT0中断请求 IT0=1; //设定INT0的触发方式为脉冲负边沿触发 } /*-------------------------------200us精确延时-------------------*/ void delay_200(void) { uchar i,j; for(i=0x05;i>0;i--) for(j=0x12;j>0;j--); } /*-------------------------------250us精确延时----------------*/ void delay_250(void) { uchar i,j; for(i=0x05;i>0;i--) for(j=0x17;j>0;j--); } /*-------------------------------131ms精确延时---------------*/ void delay_131(void) { uchar i,j; for(i=0xfe;i>0;i--) for(j=0xfe;j>0;j--); } /*-------------------------外部中断0子程序(解码程序)-------------*/ void INT0_intrupt(void) interrupt 0 using 1 { uchar i,j; bit BitState_2; EX0=0; ////////////////////找起始位//////////////////////// for(i=0;i<50;i++); if(P3_2==1) goto kk; while(P3_2==0); for(i=0;i<50;i++); if(P3_2==0) goto kk; delay_200(); if(P3_2==1) goto kk; for(i=15;i>0;i--) //重复20次,检测在3750微秒内出现高电平就退出解码程序 { delay_200(); if(P3_2==1) goto kk; } while(P3_2==0); //////////////////////接收数据///////////////////////// for(j=0;j<3;j++) { for(i=0;i<8;i++) { delay_250(); BitState_2=P3_2; ReadCode[j]=ReadCode[j]<<1; ReadCode[j]=ReadCode[j]|BitState_2; if(P3_2==1) while(P3_2==1); while(P3_2==0); } } ////////////////////校验及运算数据/////////////////////////// for(i=0;i<3;i++) { if((~(ReadCode[i]|0x55))&((ReadCode[i]&0x55)<<1)!=0x00)goto kk; //校验 } GetCode=0x00; for(i=0;i<8;i++) { GetCode |=((ReadCode[2]>>i)&(ReadCode[2]>>(i+1))&0x01<
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』