
上面的sbit dula=P2^6; sbit wela=P2^7;分别是什么意思??
--为引脚,定义一个变量名称。
这里的P2^6和P2^7和IO口的P2^6,P2^7有什么关系??
--它们就是它们。
dula和wela是用来显示键值所用的数码管的段和位吗?
--看程序,它们都干些什么,就知道了。
把他们定义成P2^6和P2^7和数码管段与位所连接的IO口有关系吗?
--有关、无关,去看电路图。
另外uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};是显示这些码代表的键?
--这些,是显示数字用的。
--是不是代表键,你执行程序,就看出来了。
还是用这些码所代表的数码管的段和位或者别的什么的来显示按键值?
--试试看。
--有些程序,都是瞎编,显示什么,作者自己,都不清楚。
单片机采用外部中断P33管脚和红外接收头的信号线相连,中断方式为边沿触发方式。并用定时器0计算中断的间隔时间,来区分前导码、二进制的“1”、“0”码。并将8位 *** 作码提取出来在数码管上显示。
// 解码值在Im[2]中,当IrOK=1时解码有效。
/ 51单片机红外遥控解码程序 /
//用遥控器对准红外接收头,按下遥控器按键,在数码管前两位上就会显示对应按键的编码
#include <reg52h>
#define uchar unsigned char
sbit dula=P2^6;
sbit wela=P2^7;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uchar f;
#define Imax 14000 //此处为晶振为110592时的取值,
#define Imin 8000 //如用其它频率的晶振时,
#define Inum1 1450 //要改变相应的取值。
#define Inum2 700
#define Inum3 3000
unsigned char Im[4]={0x00,0x00,0x00,0x00};
uchar show[2]={0,0};
unsigned long m,Tc;
unsigned char IrOK;
void delay(uchar i)
{
uchar j,k;
for(j=i;j>0;j--)
for(k=125;k>0;k--);
}
void display()
{
dula=0;
P0=table[show[0]];
dula=1;
dula=0;
wela=0;
P0=0xfe;
wela=1;
wela=0;
delay(5);
P0=table[show[1]];
dula=1;
dula=0;
P0=0xfd;
wela=1;
wela=0;
delay(5);
} //外部中断解码程序
void intersvr1(void) interrupt 2 using 1
{
Tc=TH0256+TL0; //提取中断时间间隔时长
TH0=0;
TL0=0; //定时中断重新置零
if((Tc>Imin)&&(Tc<Imax))
{
m=0;
f=1;
return;
} //找到启始码
if(f==1)
{
if(Tc>Inum1&&Tc<Inum3)
{
Im[m/8]=Im[m/8]>>1|0x80; m++;
}
if(Tc>Inum2&&Tc<Inum1)
{
Im[m/8]=Im[m/8]>>1; m++; //取码
}
if(m==32)
{
m=0;
f=0;
if(Im[2]==~Im[3])
{
IrOK=1;
}
else IrOK=0; //取码完成后判断读码是否正确
}
//准备读下一码
}
}
/演示主程序/
void main(void)
{
unsigned int a;
m=0;
f=0;
EA=1;
IT1=1;EX1=1;
TMOD=0x11;
TH0=0;TL0=0;
TR0=1;//ET0=1;
while(1)
{
if(IrOK==1)
{
show[1]=Im[2] & 0x0F; //取键码的低四位
show[0]=Im[2] >> 4;
IrOK=0;
}
for(a=100;a>0;a--)
{
display();
}
}
}
解码程序这个就能实现
IrValue[k]>>=1; //k表示第几组数据 这是把变量整体右移一位,由于是无符号最高位补0
if(Time>=8) //如果高电平出现大于565us,那么是1
{
IrValue[k]|=0x80; //变量最高位置一
}
Time=0; //用完时间要重新赋值
这样如果判断是1了就把最高位置一,0的话不用清零,因为右移的时候已经补0了
这就是一个红外解码程序,按标准来做就行了。普及一下红外解码知识:
采用脉宽调制的串行码,以脉宽为0565ms、间隔056ms、周期为1125ms的组合表示二进制
的"0";以脉宽为0565ms、间隔1685ms、周期为225ms的组合表示二进制的"1,;上述"0"和
"1"组成的32位二进制码经38kHz的载频进行二次调制以提高发射效率,;达到降低电源功耗的
目的。然后再通过红外发射二极管产生红外线向空间发射,;遥控编码是连续的32位二进制码
组,其中前16位为用户识别码,能区别不同的电器设备,;防止不同机种遥控码互相干扰。该
芯片的用户识别码固定为十六进制01H;后16位为8位 *** 作码(功能码)及其反码。
当一个键按下超过36ms,振荡器使芯片激活,将发射一组108ms的编码脉冲,这108ms发射代码
由一个起始码(9ms),一个结果码(45ms),低8位地址码(9ms~18ms),高8位地址码
(9ms~18ms),8位数据码(9ms~18ms)和这8位数据的反码(9ms~18ms)组成。如果键按下超
过108ms仍未松开,接下来发射的代码(连发代码)将仅由起始码(9ms)和结束码(25ms)
组成。
解码的关键是如何识别"0"和"1",接收端而言,"0"是056ms的高+056ms的低。"1"是168ms
的高+056ms的低。所以可以根据高电平的宽度区别"0"和"1"。当高电平出现时开始延时,
056ms以后,若读到的电平为低,说明该位为"0",反之则为"1",为了可靠起见,延时必须
比056ms长些,但又不能超过112ms,否则如果该位为"0",读到的已是下一位的高电平,因此
取(112ms+056ms)/2=084ms最为可靠,一般取084ms左右均可。
嗯,有这个想法很不错,我提几个我的思路,你参考下:
一般红外发送与红外接收,它们都是配套的,就是发送的频率必须接收的频率相同,否则接收不成功,我们大都使用的是HT6221,它发送的是38KHz的红外信号频率,接收头也只能接收38KHz频率的信号,那么根据这一点,你首先要看看遥控器的参数,它输出的频率是多少,然后选择红外接收头时就只选择这种频率下的,其他频率的接收头都无效。
有了接收头,接下来你要查看该遥控器发送红外信号的波形图,把波形图中的各种信号弄清楚,它是什么信号。
对红外解码有了基本思路之后,你要用单片机设计程序来解码,使用定时器计算接收信号的时间,外部中断捕捉红外信号的数据段,然后把各种信号在一定的时间范围之内译成数字数据,将这个数据用LCD1602显示出来。
大概思路就这样,不懂的地方可以随时回复我。
希望我的回答能帮助到你。
以上就是关于下面红外解码的数码管显示程序中 sbit dula=P2^6; sbit wela=P2^7;分别是什么意思全部的内容,包括:下面红外解码的数码管显示程序中 sbit dula=P2^6; sbit wela=P2^7;分别是什么意思、51单片机红外解码C程序、红外线解码问题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)