红外遥控的解码程序 运行不出来 跪求大神指点 小女子不...
时间:10-02
整理:3721RD
点击:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uint tf,temp,rok,getnumok,start; //定义溢出时间, ,接收完成标志,转换完成标志
uchar rtime[],value[],rcode[]; //定义数组 存放接收时间,存放4段码,存放用户码和数据码
uint i,j,k;
uchar code dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,
0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00}; //0~F共阴显示子码
uchar code dispbit[]={0xfd,0xfb,0xf7,0xef}; //数码管位选码,低电平为选通,分别是P11,P12,P13,P14
void delayms(uint ms)
{
uchar b;
while(ms--)
{
for(b=0;b<125;b++);
}
}
void outside0(void) //外部中断初始化
{
EA=1;
IT0=1;
ET0=1;
}
void timer0(void) //定时器0初始化
{
TMOD=0x02;
TH0=0x00;
TH0=0x00;
EA=1;
ET0=1;
}
void timer0inter()interrupt 1 //定时器0中断函数
{
tf++; //计算TF溢出次数
}
void outside0inter() interrupt 0 //外部中断0中断服务函数
{
if(start)
TR0=1; //启动定时器0
if(tf>35) //检测引导码
{
i=0;
}
rtime[i]=tf; //把每位对应的溢出时间存档
tf=0;
i++;
if(i==33) //4段码接收完毕
{
TR0=0; //关闭定时器0
i=0;
rok=1; //接收完毕
}
else
{
start=1;
tf=0;
}
}
void getnum(void) //把溢出时间转换成0、1
{
i=1;
for(j=0;j<4;j++) //4段码
{
for(k=0;k<8;i++) //8位数
{
temp=temp>>1; //点到每个位的次序
if(rtime[i]>6)
temp=temp|0x80; //大于六秒为1
else temp=0x00; //小于六秒为0
i++;
}
value[j]=temp;
}
getnumok=1; //转换完毕
}
void apart(void) //把用户码和用户反码,数据码和数据反码分开
{
rcode[0]=value[0]/16; //把用户码前四位和后四位分开
rcode[1]=value[0]%16;
rcode[2]=value[3]/16; //把数据码前四位和后四位分开
rcode[3]=value[3]%16;
}
void display(void) //数码管显示函数
{
for(i=0;i<4;i++)
{
P0=dispcode[rcode[i]];
P1=dispbit[i];
delayms(50);
}
}
void main()
{
outside0();
timer0();
while(1)
{
if(rok)
{
getnum();
rok=0;
}
if(getnumok==1)
{
apart();
getnumok=0;
}
display();
}
}
#define uchar unsigned char
#define uint unsigned int
uint tf,temp,rok,getnumok,start; //定义溢出时间, ,接收完成标志,转换完成标志
uchar rtime[],value[],rcode[]; //定义数组 存放接收时间,存放4段码,存放用户码和数据码
uint i,j,k;
uchar code dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,
0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00}; //0~F共阴显示子码
uchar code dispbit[]={0xfd,0xfb,0xf7,0xef}; //数码管位选码,低电平为选通,分别是P11,P12,P13,P14
void delayms(uint ms)
{
uchar b;
while(ms--)
{
for(b=0;b<125;b++);
}
}
void outside0(void) //外部中断初始化
{
EA=1;
IT0=1;
ET0=1;
}
void timer0(void) //定时器0初始化
{
TMOD=0x02;
TH0=0x00;
TH0=0x00;
EA=1;
ET0=1;
}
void timer0inter()interrupt 1 //定时器0中断函数
{
tf++; //计算TF溢出次数
}
void outside0inter() interrupt 0 //外部中断0中断服务函数
{
if(start)
TR0=1; //启动定时器0
if(tf>35) //检测引导码
{
i=0;
}
rtime[i]=tf; //把每位对应的溢出时间存档
tf=0;
i++;
if(i==33) //4段码接收完毕
{
TR0=0; //关闭定时器0
i=0;
rok=1; //接收完毕
}
else
{
start=1;
tf=0;
}
}
void getnum(void) //把溢出时间转换成0、1
{
i=1;
for(j=0;j<4;j++) //4段码
{
for(k=0;k<8;i++) //8位数
{
temp=temp>>1; //点到每个位的次序
if(rtime[i]>6)
temp=temp|0x80; //大于六秒为1
else temp=0x00; //小于六秒为0
i++;
}
value[j]=temp;
}
getnumok=1; //转换完毕
}
void apart(void) //把用户码和用户反码,数据码和数据反码分开
{
rcode[0]=value[0]/16; //把用户码前四位和后四位分开
rcode[1]=value[0]%16;
rcode[2]=value[3]/16; //把数据码前四位和后四位分开
rcode[3]=value[3]%16;
}
void display(void) //数码管显示函数
{
for(i=0;i<4;i++)
{
P0=dispcode[rcode[i]];
P1=dispbit[i];
delayms(50);
}
}
void main()
{
outside0();
timer0();
while(1)
{
if(rok)
{
getnum();
rok=0;
}
if(getnumok==1)
{
apart();
getnumok=0;
}
display();
}
}
求大神们指点~初学单片机 第一次做project~还请大家多多帮助
首先,鉴于上面凌乱的程序,我读不出来。但是我可以给你一个实测可以使用的程序,解码部分完全没有问题。你可以稍稍修改就行了。
- //#################################################################################################
- //文件:51单片机的红外遥控解码程序
- //属性:使用外部中断0连接遥控头,接收红外遥控键值送P2口显示,12MHz外部晶振
- //资源:P3.2=接收头输入,P2=8LED
- //#################################################################################################
- #include"reg52.h"
- #define uint unsigned int
- #define uchar unsigned char
- uchar led=0x00;
- void io_init(void);
- void int_init(void);
- void main(void)
- {
- io_init();
- int_init();
- while(1);
- }
- void io_init(void) //I/O口初始化
- {
- P0=0xff;
- P1=0xff;
- P2=0xff;
- P3=0xff;
- }
- void int_init(void) //开外部中断0
- {
- EX0=1;
- EA=1;
- }
- void interrupt0()interrupt 0 //中断子函数
- {
- uchar i=0,j=0,k=0,us=0;
- uchar addr[4]={0};
- EX0=0;
- for(i=0;i<255;i++) //延时9毫秒,9ms内有高电平认为是干扰
- {
- if(P3&0x04) //延时结束,如果还是高电平,执行下一句。255的值实际时间为800us
- {
- EX0=1; //开外部中断0
- return;
- }
- } // 解码程序开始执行
- while(!(P3&0x04)); //等待9ms低电平过去,
- for(i=0;i<4;i++)
- {
- for(j=0;j<8;j++)
- {
- while(P3&0x04); //等待4.5ms高电平过去
- while(!(P3&0x04)); //等待0.56ms(无论0或1都有这个0.56ms的低电平引导。)低电平后面的高电平
- //低电平脉宽为0.565ms、之后是0.56ms高电平、周期为1.125ms的组合表示二进制的“0”;
- //低电平脉宽为0.565ms、之后是1.685ms高电平、周期为2.25ms的组合表示二进制的“1”
- while(P3&0x04) //计算这个高电平的时间
- {
- for(us=0;us<=32;us++); //100us的延时语句
- if((k++)>=30) //高电平时间过长退出程序
- {
- EX0=1;
- return;
- }
- }
- addr[i]=addr[i]>>1; //接收一位数据
- if(k>=8)
- addr[i]=addr[i]|0x80; //高电平大于0.56ms,则为1
- k=0;
- }
- }
- P2=~(addr[2]); //P2的LED显示二进制键值
- EX0=1;
- }
其实 什么东西都是需要自己去动手的,尤其是写程序这方面, 我前些日子就是对红外解码进行了研究,在查阅了一些资料,知道了它的原理后 我就自己动手写了一个解码的程序, 然后逐个排除错误 最后就可以运行了
