//红外反射开关,接收头HS0038B,发射管用pnp三极管驱动 //第一次上电,灯亮1秒后熄灭, //手挡一次开,再挡一次关,如此循环 //实验板测试手挡一次开,再挡一次关 开关正常; //但是有一个问题,如果手一直挡在前面,LED会不停的亮--灭 -- 亮--灭 //请大神们看下,怎样才能做到手挡在前面不移开,保持一种状态 #include <reg52.h> #include <intrins.h> #define uchar unsigned char #define uint unsigned int sbit ir=P2^4; //红外发射 sbit ir_in=P3^2; //红外接收 sbit led=P1^1; // uint cont,cont1; bit flag_key; //按键按下标志 bit key_lock=0; void delay(uint z) //ms { uint x,y; for(x=z; x>0; x--) for(y=114; y>0; y--); } void fa_38k() //38k 载波 //接收头前面有滤光片,发射管要用黑色热缩套管套起来 { //不是很准,没有逻辑分析仪,搞不准,现在的反射距离在60厘米左右(发射管串100欧电阻) ir=0; _nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_(); ir=1; _nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_(); _nop_();//_nop_(); } void main() { TMOD |= 0X01; //T0定时器,模式1, 16位计数 TH0 = (65536-1000)/256; //1ms初值 @12MHz晶振 TL0 = (65536-1000)%256; ET0=1; TR0=1; led=0; delay(500); led=1; while(1) { if(flag==0 ) { fa_38k(); //发38K } else ir=1; //停止发射 if(ir_in==0) //手挡住 { flag_key=1; cont1++; key_lock=1; } else flag_key=0; //手移开 if(flag_key==1 && cont1==100) { ir=1; cont1=0; led = !led; delay(1000); } if(ir_in==1) cont1=0; //这句抗干扰很好,遥控器对着按,都没反应 } } void timer0() interrupt 1 { TH0 = (65536-1000)/256; //重装1ms初值 TL0 = (65536-1000)%256; cont++; if(cont==100) { cont=0; flag=!flag; //发100ms 38K,停100ms } }
举报
gx_huang 发表于 2019-9-26 12:25 系统结构需要重新整理一下,起码38KHz要准确可控。 至于手挡和LED亮灭,采取状态机更好,或者保存上次状态 ...
18990194628 发表于 2019-9-26 13:53 新增一个变量,保存当前状态之前的状态 比如当前状态为flag 上一次状态为last_flag
本版积分规则 发表回复 回帖并转播 回帖后跳转到最后一页
等级类勋章
发帖类勋章
时间类勋章
人才类勋章
2
20
0
扫码关注 21ic 官方微信
扫码关注嵌入式微处理器
扫码关注电源系统设计
扫码关注21ic项目外包
扫码浏览21ic手机版
本站介绍 | 申请友情链接 | 欢迎投稿 | 隐私声明 | 广告业务 | 网站地图 | 联系我们 | 诚聘英才
京公网安备 11010802024343号