/*----------------------------------------------------------------- ; 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<
上一篇:20天89C51单片机总结
下一篇:基于单片机定时器中断的时钟程序
推荐阅读最新更新时间:2024-03-16 13:10
设计资源 培训 开发板 精华推荐
- Allegro MicroSystems 在 2024 年德国慕尼黑电子展上推出先进的磁性和电感式位置感测解决方案
- 左手车钥匙,右手活体检测雷达,UWB上车势在必行!
- 狂飙十年,国产CIS挤上牌桌
- 神盾短刀电池+雷神EM-i超级电混,吉利新能源甩出了两张“王炸”
- 浅谈功能安全之故障(fault),错误(error),失效(failure)
- 智能汽车2.0周期,这几大核心产业链迎来重大机会!
- 美日研发新型电池,宁德时代面临挑战?中国新能源电池产业如何应对?
- Rambus推出业界首款HBM 4控制器IP:背后有哪些技术细节?
- 村田推出高精度汽车用6轴惯性传感器
- 福特获得预充电报警专利 有助于节约成本和应对紧急情况