电子产业一站式赋能平台

PCB联盟网

搜索
查看: 3898|回复: 9
收起左侧

求助!!!红外遥控器一个键每次按下会显示不同的键值

[复制链接]

585

主题

910

帖子

4977

积分

四级会员

Rank: 4

积分
4977
发表于 2022-9-22 08:45:10 | 显示全部楼层 |阅读模式
这是为什么啊?????以下是红外解码程序:
//lcd1602显示键值
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
//定义数组
uchar HL_Time[33]={0};//存储高低电平的时间
uchar BYTE[4]={0};//存放码(用户码,用户反码,数据码,数据反码)
uchar table[16]={"IR_CODE:0x      "};//lcd2602初始化显示的
//标志位
bit decode_ok = 0;//解码标志位。decode_ok=1解码成功,decode-ok=0解码失败
bit trans_ok  = 0;//时间转换标志位。trans_ok=1转换成功,trans_ok =0转换失败
bit head_ok   = 0;//引导码接受标志位,head_ok=1引导码接受成功,head_ok=0  引导码接受失败
bit head_start= 0;   //引导码开始接收标志位
//定义变量
uchar Timer0_Count=0; //时间计数器,Timer0_Count每加1,时间经过250us
uchar Init0_Count=0;//外部中断0计数器,Init0_Count每加1,就经历了一次下降沿
//位定义led接口
sbit lcd_E=P2^7;
sbit lcd_RS=P2^6;
sbit lcd_RW=P2^5;
void delayms(uint z)
{
uint x,y;
for(x=1;x<z;x++)
for(y=1;y<110;y++);
}
void write_commend(uchar commend)
{
lcd_RS=0;
lcd_RW=0;
P0=commend;
delayms(2);
lcd_E=1;
delayms(5);
lcd_E=0;
delayms(2);
}
void write_data(uchar date)
{
lcd_RS=1;
lcd_RW=0;
P0=date;
delayms(2);
lcd_E=1;
delayms(5);
lcd_E=0;
delayms(2);
}
//1602显示字符串函数(y=1时显示在第一行,y=2显示在第二行。x表示从第x个开始显示)
void write_str(uint y,uint x,uchar * str)
{
uint i;
if(y==1)
{
write_commend(0x80+x-1);
for(i=0;i<16;i++)
write_data(*(str+i));
}
else
{
write_commend(0x80+0x40+x-1);
for(i=0;i<16;i++)
write_data(*(str+i));
}
}
//输入字符函数(y=1时显示在第一行,y=2显示在第二行。x表示从第x个开始显示)
void write_char(uint y,uint x,uchar value)
{
if(y==1)
{
write_commend(0x80+x-1);
write_data(value);
}
else
{
write_commend(0x80+0x40+x);
write_data(value);
}
}
//lcd显示16进制数函数
void write_16(uint x,uint y,uchar dat)
{
uchar j;
    j=dat>>4;                //把要显示内容的高4位移到低4位上
    if(j<10)                    //0-F在ASCII码中并不连续,所以要分开处理
    {
        j+='0';                 //0-9的数据以0为基点进行偏移即可
    }
    else
    {
        j=j-10+'A';             //A-F的数据以A为基点进行偏移即可
    }
    write_char(x,y,j);        //在第x行的第y列显示高4位的十六进制数字
    j=dat&0x0F;              //把要显示内容的高4位屏蔽掉,保留低4位
    if(j<10)                    //0-F在ASCII码中并不连续,所以要分开处理
    {
        j+='0';                 //0-9的数据以0为基点进行偏移即可
    }
    else
    {
        j=j-10+'A';             //A-F的数据以A为基点进行偏移即可
    }
    write_char(x,y+1,j);        //在第x行的第y+1列显示低4位的十六进制数字
}
void init_lcd()
{
lcd_E=0;
write_commend(0x38);
write_commend(0x0e);
write_commend(0x06);
write_commend(0x01);
write_commend(0x80);
write_str(1,1,&table);
}
//初始化外部中断0
void Init_EX0()
{
IT0 = 1;//外部中断0下降沿触发方式  
EX0 = 1;//开外部中断0
EA  = 1;//开总中断   
}
//初始化定时器0
void Init_T0()
{
TMOD=0X01;//设置定时器0位工作方式1
TH0=(65535-250*(11059200/12000000))/256;    //设定计数初值,计数250us
TL0=(65535-250*(11059200/12000000))%256;    //设定计数初值,计数250us
ET0=1;    //允许定时器0中断
TR0=1;//开定时器0
}
//将HL_Time[]数组中的时间转化为逻辑1或逻辑0;
void Transform_Time()
{
uint i,j;
uint num=1;//等于1是为了抛弃HL_Time[0]这个元素,因为这个元素存放的是引导码的时间
uchar IR_CODE=0;  //存储接收到的码
for(j=0;j++;j<4)  //两个for循环,循环一次接收好一字节的数据,循环4次,接收一字节时循环8次
{
for(i=0;i<8;i++)
{
if(HL_Time[num]>7)  //接收1
IR_CODE |= 0X80;
else      //接收0
IR_CODE = IR_CODE;
IR_CODE >>= 1;
num++;
}
BYTE[j]=IR_CODE;
IR_CODE=0x00;//得到一个数据后清零以便接收下一个数据
}
if(BYTE[2]=~BYTE[3])//判断数据是否正确
trans_ok=1;
}
//主函数
void main()
{
init_lcd();
Init_EX0();
Init_T0();
while(1)
{
if(decode_ok)//解码成功
{
decode_ok=0;//清零以备下次接收
Transform_Time();//开始执行时间转换
}
if(trans_ok)//时间转换成功
{
trans_ok=0;//清零以备下次接收
write_16(1,11,HL_Time[2]);//显示数据码
}
}
}
//红外中断函数
void IR_Decode() interrupt 0
{
if(head_start==0)//按下按键后就开始进入第一次中断
{
head_start=1;//标志着引导码接受开始
Timer0_Count=0;//时间计数器清零
}
else if(head_start==1)//下面开始解码
{
if((Timer0_Count>=52)&&(Timer0_Count<=56))//引导码时间为13.5ms即13500us,是250us的54倍,故把Time_Count规定在51到57这个区间,提高容错率
{
Init0_Count=0;//中断计数器清零
}
HL_Time[Init0_Count]=Timer0_Count;//给时间数组赋值
//因为每过250us  Timer0_Count就会增加1,而只有当外部中断0产生中断时Timer0_Count的值才会被
//记录到HL_Time[]数组里,所以如果数组中的元素在3~5表示这次外部中断接收的是0,
//在8~10表示此次外部中断接收的是1
//也可以以6位分水岭。Timer0_Count大于6是1,小于6是0
//逻辑0持续时间1.12ms,1120/250=4.48
//逻辑1持续时间2.25ms,2250/250=9
Timer0_Count=0;//为下存时间值做准备
Init0_Count++;      
if(Init0_Count==33)
{
Init0_Count=0;//中断计数清零
decode_ok=1;//存时间值的任务成功,即解码成功
head_start=0;//清零以备下次解码任务的完成
}
}
}
//定时器0中断函数
void Timer0()interrupt 1
{
TH0=(65535-250*(11059200/12000000))/256;    //设定计数初值,计数250us
TL0=(65535-250*(11059200/12000000))%256;    //设定计数初值,计数250us
Timer0_Count++;
}
回复

使用道具 举报

578

主题

936

帖子

4943

积分

四级会员

Rank: 4

积分
4943
发表于 2022-9-22 08:45:56 | 显示全部楼层
我也刚学到这。一个健对应一个内部键值码,一样了那不就混乱了?
回复 支持 反对

使用道具 举报

657

主题

1025

帖子

5598

积分

四级会员

Rank: 4

积分
5598
发表于 2022-9-22 08:46:35 | 显示全部楼层
求助
回复 支持 反对

使用道具 举报

594

主题

958

帖子

5093

积分

四级会员

Rank: 4

积分
5093
发表于 2022-9-22 08:47:01 | 显示全部楼层
时间抓的不对?
回复 支持 反对

使用道具 举报

594

主题

958

帖子

5093

积分

四级会员

Rank: 4

积分
5093
发表于 2022-9-22 08:47:57 | 显示全部楼层
晶振没选好吧
回复 支持 反对

使用道具 举报

616

主题

968

帖子

5301

积分

四级会员

Rank: 4

积分
5301
发表于 2022-9-22 08:48:46 | 显示全部楼层
我也刚刚看到这
回复 支持 反对

使用道具 举报

604

主题

947

帖子

5151

积分

四级会员

Rank: 4

积分
5151
发表于 2022-9-22 08:49:46 | 显示全部楼层
昨天去买烟,买了包20的,给了老板50,找了我40,我装做不知道,装兜里就走了,没走多远老板喊我:你的烟没拿!我流下了感动的泪水,拿出十块钱给老板:你多找了我十块钱。老板也留下了感动的泪水:小伙子,把烟拿来,我给你换一包。抽着老板新换给我的烟,那纯正的味道不禁再次感动了我:老板,把刚才那张50的拿来我给你换一张吧!老板接过那50的也再次感动:小伙子,把刚才那找你的钱给我,我也给你换了。接过老板重新找我的钱,我也再次感动,从口袋里拿出一部手机:老板,手机还给你吧。老板热泪盈眶,颤抖着掏出一个钱包:小伙子,钱包还给你。此时我再也把持不住了,扑跪在地上抱着老板的大腿哭道:老哥,你去隔壁宾馆304房把你那上小学的女儿领回家吧!老板听后一惊,叹了口气,回头朝小店大声喊道:红杏啊,别藏了,出来跟你老公回去吧!我讶异看着从店里走出来的女人,轻轻摇了摇头说:“老哥,这药你拿去用吧。”接过我递去的青霉素,老板看完说明书惭愧的低下头说:“算了吧,这药我也用不着了,我是hiv病毒携带者,小哥对不住了!。”我的心瞬间凉到了冰点,而老板的赤诚却又让它从未有过的温暖,我说:“老哥,差点我就干了件终身后悔的事啊!实不相瞒我的泪水有如决堤,模糊的视网膜上他微曲着身子在钱箱里朝仔细的翻着,我终于忍不住了,说:“老哥其实我根本不会抽烟!我来就是想用掉假钱的!”老哥拍着我肩膀,低声道:“小伙子,实不相瞒,其实这个也不是我的小店,我就是想知道打这么多字能水多少经验
回复 支持 反对

使用道具 举报

587

主题

981

帖子

5126

积分

四级会员

Rank: 4

积分
5126
发表于 2022-9-22 08:50:45 | 显示全部楼层
......
回复 支持 反对

使用道具 举报

587

主题

981

帖子

5126

积分

四级会员

Rank: 4

积分
5126
发表于 2022-9-22 08:51:45 | 显示全部楼层
有人吗
回复 支持 反对

使用道具 举报

591

主题

1772

帖子

5770

积分

四级会员

Rank: 4

积分
5770
发表于 2022-9-22 08:52:04 | 显示全部楼层
期待有大神能回答这个问题
回复 支持 反对

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


联系客服 关注微信 下载APP 返回顶部 返回列表