完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我用51单片机尝试了红外解码,可以在1602上显示编码,但是有几个问题还是不能搞明白,希望大神们能够帮助一下:(1)在红外解码初始化的程序中:TR0=1;//开启了定时器。但是在外部中断函数里直接读取定时器的值作为起始码的时间,如果运行很长时间才按下按键,这个时候外部中断函数里得到的定时器时间根本就不是起始码的时间,怎么能判断是这个是起始码呢? (2)在运行过程中,发现一个问题:第一次按键需要按两次才能够正常工作,请问这是什么原因呢? 下面附上我的程序,希望大神们能够帮忙解答一下,不胜感激。(因为字符限制,就把1602显示函数给删了) #include #include #include #include #define uchar unsigned char #define uint unsigned int #define ulong unsigned long #define Imax 14000 //15.19 ms #define Imin 8000 //8.68 ms #define Inum1 1450 //1.57 ms #define Inum2 700 //0.75 ms #define Inum3 3000 //3.25 ms unsigned char Im[4]={0x00,0x00,0x00,0x00}; uchar INT0_Step; ulong m,Tc; uchar IrOK; uchar num; uchar a,b,c,d; ***it INT00 =P3^2; ***it led0 =P1^0; ***it led1 =P1^1; ***it led2 =P1^2; ***it led3 =P1^3; //LCD sfr DBPort = 0x80; ***it rs = P2^0; ***it rw = P2^1; ***it en = P2^2; uchar code table1[ ] = " Red Control "; uchar code table2[ ] = " IR-CODE: -----H"; void delay(uint z) { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } void lcd_display() { lcd_init(); lcd_wcmd(0x80); for(num=0;num<16;num++) { lcd_wdat(table1[num]); delay(5); } lcd_wcmd(0xc0); for(num=0;num<16;num++) { lcd_wdat(table2[num]); delay(5); } } void Hongwai_INT0_SET() { IT0=1; EX0=1; TMOD|=0x01; TH0=0; TL0=0; TR0=1; EA=1; } void display() { switch(Im[2]) { case 0x64: { led0=0; led1=1; led2=1; led3=1; } break; case 0x54: { led0=1; led1=0; led2=1; led3=1; } break; case 0x74: { led0=1; led1=1; led2=0; led3=1; } break; case 0x44: { led0=1; led1=1; led2=1; led3=0; } break; } } void intersvr1() interrupt 0 { Tc=TH0*256+TL0; TH0=0; TL0=0; if(INT0_Step==0) { if((Tc>Imin)&&(Tc { m=0; INT0_Step=1; } else { INT0_Step=0; } } if(INT0_Step==1) { if(Tc>Inum1&&Tc { Im[m/8]=Im[m/8]>>1|0x80; m++; } else if(Tc>Inum2&&Tc { Im[m/8]=Im[m/8]>>1; m++; } if(m>=32) { m=0; INT0_Step=0; if(Im[2]==~Im[3]) { IrOK=1; } else { IrOK=0; } } } else { INT0_Step=0; } if(IrOK) { IrOK=0; a=Im[2]>>4; b=Im[2]&0x0F; lcd_wcmd(0xca); lcd_wdat(a+0x30); lcd_wcmd(0xcb); lcd_wdat(b+0x30); } display(); } void timer0_isr() interrupt 3 { TH0=0; TL0=0; } void main() { INT0_Step=0; m=0; //Tc=0; led0=1; led1=1; led2=1; led3=1; lcd_display(); delay(5); Hongwai_INT0_SET(); delay(5); while (1); } |
|
相关推荐
2个回答
|
|
麻烦大神们帮忙求解一下!谢谢啦。
|
|
|
|
代码好长啊,看得眼花~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
277 浏览 0 评论
【敏矽微ME32G070开发板免费体验】之原厂2812测试例程解析
368 浏览 0 评论
766 浏览 2 评论
《DNESP32S3使用指南-IDF版_V1.6》第二十六章 INFRARED_RECEPTION实验
592 浏览 0 评论
879 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
12037 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-26 01:14 , Processed in 0.733112 second(s), Total 76, Slave 58 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号