单片机/MCU论坛
登录
直播中
Liqipeng
8年用户
264经验值
擅长:可编程逻辑 处理器/DSP
私信
关注
[问答]
关于单片机红外解码问题求教
开启该帖子的消息推送
单片机
红外
解码
求教
我用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
ti
mer0_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);
}
已退回
5
积分
回帖
(2)
Liqipeng
2018-3-3 09:40:51
麻烦大神们帮忙求解一下!谢谢啦。
麻烦大神们帮忙求解一下!谢谢啦。
举报
覃广明
2018-3-3 11:51:27
代码好长啊,看得眼花~~~~~~~~~~~~~~~~~~~~~
代码好长啊,看得眼花~~~~~~~~~~~~~~~~~~~~~
举报
更多回帖
rotate(-90deg);
回复
相关问答
单片机
红外
解码
求教
单片机
红外
解码
的问题
2014-09-17
4405
单片机
解码
2262
2012-06-15
3395
求大神分享51
单片机
红外
通信
解码
的教程
2021-10-11
664
请问一个
单片机
怎么同时处理多个
红外
解码
?
2019-09-10
1477
51
单片机
如何利用外部中断和定时器0对
红外
信号进行
解码
?
2021-09-28
3721
如何实现
单片机
解码
红外
遥控器,并且重新编码转发?
2015-03-31
4927
单片机
编程
2017-09-18
2761
求。。。STC89C52
单片机
红外
线
解码
C语言程序代码
2013-08-29
2654
如何利用STC8A8K
单片机
去制作一种
红外
遥控发射装置呢
2022-02-15
1409
义隆
单片机
em78P153K
2016-05-04
4272
发帖
登录/注册
20万+
工程师都在用,
免费
PCB检查工具
无需安装、支持浏览器和手机在线查看、实时共享
查看
点击登录
登录更多精彩功能!
首页
论坛版块
小组
免费开发板试用
ebook
直播
搜索
登录
×
20
完善资料,
赚取积分