求助51单片机普通io红外解码怎么解码ppm

51单片机解码PPM波 - ShareIdeas - 博客园
51单片机解码PPM波&&
&我的单片机是 11.0592MHZ&& 这样算的话,& 显示的值 应该是& 706& 到& 1491& 之间,中立位为&& 1100正好和理论值相符。这里在提点单片机相关的知识,51单片机是低电平触 发中断,我这里用的是while(int0==0)来等待高电平 的到来。不知道这样做是否合理,不过实践看来还是可以的。
明说一点,程序中&& LCD*&& 都在1602.h文件中,自己加个1602的头文件即可。
下面是程序的主要部分
#include &REG52.H&#include "1602.h"unsigned char channel=0,i=0;unsigned int xdata PPM_channel1[10],PPM_channel2[10],PPM_channel3[10],PPM_channel4[10],PPM_channel5[10],PPM_channel6[10];bit Timer0_OverFlowFlag=0;//定时器0的溢出标志,如果溢出,则有问题;unsigned char qian,bai,shi,void DepartNum(unsigned int temp) ;unsigned int filter(unsigned int *s);&& //这不函数的作用?void delay(unsigned int k)&{&&&&&&&unsigned int i,j;&&&&&for(i=0;i&k;i++)&{&&&&& for(j=0;j&121;j++)&&&&& {;}&}&&&&&&}
void main(void){&&&&&&&&&&&& unsigned char *InitI&&&&&& InitIform="PPM Decoding";& &delay(500);&&&&&& LCD_init(8);&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& //在1602.h中&&& LCD_Write_String(3,0,InitIform);&&&&&& //在1602.h中&delay(800);&&& TMOD=0x01;&&&&&&&&&&&&&&& //timer0 方式1&&& ET0=1;&&&&&&&&&&&&&&&&&&&& //允许timer0中断
&&&&&&&&&&&&&&&&&&&&& //初始化INT0&&& IT0=1;&&&&&&&&&&&&& //负跳变触发中断;&&& EX0=1;&&&&//外中断 0中断允许&&& EA=1;&&&& //总中断//&&& DelayMs(10000);&&& while(1)&&& {&&&&&&& temp=filter(PPM_channel1);&&&//数组&&&&&&& DepartNum(temp);&&&&&&& LCD_Write_Char(0,0,' ');&&&&& //在1602.h中&&&&&&& LCD_Write_Char(1,0,qian);&&&&&&& LCD_Write_Char(2,0,bai);&&&&&&& LCD_Write_Char(3,0,shi);&&&&&&& LCD_Write_Char(4,0,ge);
&&&&&&& temp=filter(PPM_channel2);&&&&&&&&&&&&&&&&&&&&&&&& DepartNum(temp);&&&&&&& LCD_Write_Char(5,0,' ');&&&&&&& LCD_Write_Char(6,0,qian);&&&&&&& LCD_Write_Char(7,0,bai);&&&&&&& LCD_Write_Char(8,0,shi);&&&&&&& LCD_Write_Char(9,0,ge);
&&&&&&& temp=filter(PPM_channel3);&&&&&&& DepartNum(temp);&&&&&&& LCD_Write_Char(10,0,' ');&&&&&&& LCD_Write_Char(11,0,qian);&&&&&&& LCD_Write_Char(12,0,bai);&&&&&&& LCD_Write_Char(13,0,shi);&&&&&&& LCD_Write_Char(14,0,ge);
&&&&&&& temp=filter(PPM_channel4);&&&&&&& DepartNum(temp);&&&&&&& LCD_Write_Char(0,1,' ');&&&&&&& LCD_Write_Char(1,1,qian);&&&&&&& LCD_Write_Char(2,1,bai);&&&&&&& LCD_Write_Char(3,1,shi);&&&&&&& LCD_Write_Char(4,1,ge);&&&&&&&&&&&&&&&&&&& temp=filter(PPM_channel5);&&&&&&& DepartNum(temp);&&&&&&& LCD_Write_Char(5,1,' ');&&&&&&& LCD_Write_Char(6,1,qian);&&&&&&& LCD_Write_Char(7,1,bai);&&&&&&& LCD_Write_Char(8,1,shi);&&&&&&& LCD_Write_Char(9,1,ge);
&&&&&&& temp=filter(PPM_channel6);&&&&&&& DepartNum(temp);&&&&&&& LCD_Write_Char(10,1,' ');&&&&&&& LCD_Write_Char(11,1,qian);&&&&&&& LCD_Write_Char(12,1,bai);&&&&&&& LCD_Write_Char(13,1,shi);&&&&&&& LCD_Write_Char(14,1,ge);
&&& }&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&}
/****************************************用于显示的数位分解函数,把数据转化为ASCII码入口参数是要显示的数据****************************************/void DepartNum(unsigned int temp){&qian=temp/;&bai=temp%x30;&shi=temp%100/10+0x30;&ge= temp%10+0x30;}
void ISIR_INT0(void) interrupt 0&& //interrupt 0& 指明是外部中断0;& 主要在中断函数这一块。{&unsigned int PPM_temp=0;
&if(TR0)&{&&TR0=0;//停止计数;&&& //TR0置1时,T1开始工作;TR0置0时,T1停止工作&&PPM_temp=TH0;&&PPM_temp=(PPM_temp&&8)|TL0;&&while(INT0==0);&&&&& //等待到高电平&&&TH0=0;&&TL0=0;&&TR0=1;//给TH0和TL0赋初值后重新启动定时器&}
&else&{&&&& while(INT0==0);&&&&& //等待到高电平&&&TH0=0;//如果是第一次启动中断,则启动timer0&&TL0=0;&&TR0=1;&&&& //启动计时器&}&if(PPM_temp&3000|| Timer0_OverFlowFlag)//判断引导区&{&&channel=0;&&Timer0_OverFlowFlag=0;&&i++;&&if(i==10) i=0;&}&switch(channel)&&&&&&&&& //当第一次启动里,channel的值为0 ;&{
case 1: PPM_channel1[i]=PPM_
case 2: PPM_channel2[i]=PPM_
case 3: PPM_channel3[i]=PPM_
case 4: PPM_channel4[i]=PPM_
case 5: PPM_channel5[i]=PPM_
case 6: PPM_channel6[i]=PPM_
&case 7:&case 8:&default:&}&channel++;}
void ISIR_Timer0(void) interrupt 1&&&&& //interrupt 1& 指明是定时器中断0;&{&&&&&&& Timer0_OverFlowFlag=1;&&&&&&&&&&&&&&&& //timer0最大值是65536us,理论上不会溢出,如果溢出则出错,重新从通道1开始}
&unsigned int filter(unsigned int *s)&&& //这个函数是先排序后进行求平均值 (直接求平均值即可)。{&unsigned char k,j;&unsigned int sum=0;/*&&for(k=0;k&9;k++)&{&&for(j=k+1;j&10;j++)&&{&&&&&&&if(s[k]&s[j])&&&{&&&&temp=s[k];&&&&s[k]=s[j];&&&&s[j]=&&&}&&}&}&*/&&&&&&&&&& //到这里是形成一个从小到在的数组&for(k=1;k&9;k++)&{&&&&//这里既然求平均值 ,为何还要排列大小 呢?&&& sum+=s[k];&&&&&&//我觉得这个方法完全没有必要。&}&sum=sum/8;&}求教:51单片机红外遥控器解码之后如何用switch语句识别按键_单片机吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:146,873贴子:
求教:51单片机红外遥控器解码之后如何用switch语句识别按键收藏
进而执行不同的功能。以下是我的思路:1、红外解码程序,将解出的用户码存在数组a[2]中;2、使用switch语句判断。//*************************解码******************************************
bit DeCode(void)
unsigned char
//储存解码出的数据
for(i=0;i&4;i++)
//连续读取4个用户码和键数据码
for(j=0;j&8;j++)
//每个码有8位数字
temp=temp&&1;
//temp中的各数据位右移一位,因为先读出的是高位数据
//定时器清0
//定时器清0
//开启定时器T0
while(K1==0)
//如果是低电平就等待
//低电平计时
//关闭定时器T0
LowTime=TH1*256+TL1;
//保存低电平宽度
//定时器清0
//定时器清0
//开启定时器T0
while(K1==1)
//如果是高电平就等待
//关闭定时器T0
HighTime=TH1*256+TL1;
//保存高电平宽度
if((LowTime&370)||(LowTime&640))
//如果低电平长度不在合理范围,则认为出错,停止解码
if((HighTime&420)&&(HighTime&620))
//如果高电平时间在560微秒左右,即计数560/1.085=516次
temp=temp&0x7f;
//(520-100=420, 520+100=620),则该位是0
if((HighTime&1300)&&(HighTime&1800)) //如果高电平时间在1680微秒左右,即计数=1548次
temp=temp|0x80;
//(0,0),则该位是1
a[i]= //将解码出的字节值储存在a[i]
if(a[2]=~a[3])
//验证键数据码和其反码是否相等,一般情况下不必验证用户码
//解码正确,返回1}//***************************************************************************************//***********switch语句识别码值,进而执行对应功能程序************
switch(a[2])
{ case 0x0c:功能;break;
case 0x18:功能;break;
case 0x5e:功能;break;
case 0x08:功能;break;
default:break;
} 3、想问的是:由第一步解出的码值(即存放在a[2]中的数据)是否可以直接在第二步的switch语句里进行比较选择?
holtek单片机全国低价销售,原装正品,现货多,报价快,专业的服务团体,免费为您提供咨询:
自己更正一下:是将键值码存放在a[2]中。顺便顶一下贴,希望大家如果知道的话可以回复一下!
登录百度帐号本人想diy一个 433mhz PPM编码的发射和接收机?|我爱单片机 - 数码之家
查看完整版本: [--
赞助商链接
本人想diy&&一个 433mhz&&PPM 编码的 发射和 接收机&&&&好搞吗
赞助商链接
刚才调了一下最便宜的433mhz发射和接受模块,当波特率设为2400时,传输数据还是完整的,到4800时,开始偶尔有乱码出现,到9600的时候,就是一大串乱码加发送的数据。再增加就乱码了
赞助商链接
:刚才调了一下最便宜的433mhz发射和接受模块,当波特率设为2400时,传输数据还是完整的,到4800时,开始偶尔有乱码出现,到9600的时候,就是一大串乱码加发送的数据。再增加就乱码了&( 22:48)&我我模型 遥控器上用&&想问一下有没有 这方面的资料啊
这个还真没有,我也是手里有433mhz的模块,想调试一下。具体的你说的ppm编码情况我还不是太理解
做个不难,模型论坛不是有个自制遥控器的嘛。跟着做就好了。发射部分几个通道就相应需要几个ad通道。编解码也可以自己按定义的。不管它ppm,pcm。如果单片机和模拟电路没啥玩的话,推荐你用成品遥控器,不然那会是一个很麻烦的过程。
:做个不难,模型论坛不是有个自制遥控器的嘛。跟着做就好了。发射部分几个通道就相应需要几个ad通道。编解码也可以自己按定义的。不管它ppm,pcm。如果单片机和模拟电路没啥玩的话,推荐你用成品遥控器,不然那会是一个很麻烦的过程。.......&( 09:08)&我就是想搞个443发射机和接收机&&控用成品控
:我就是想搞个443发射机和接收机  控用成品控 ( 18:02) 原来,我明白你的意思了。相当于成品控换个高频头(换成443MHz的发射),然后就需要自己做个接收了。我原来有想过:比如用315M发射模块直接换掉控的高频头,然后接收机也是有高频接收部分和解码部分的。就是不知道直接用315M接受模块(不带解码的)直接输出到解码部分可行不(后来飞机等不怎么玩了,这个想法就没有试验了,不过觉得应该可行,有空我再拆个接收机看看,控的改动是没有疑问的)~就是说可能可以直接换发射和接受而已,编解码还是原来的。
:原来,我明白你的意思了。相当于成品控换个高频头(换成443MHz的发射),然后就需要自己做个接收了。我原来有想过:比如用315M发射模块直接换掉控的高频头,然后接收机也是有高频接收部分和解码部分的。就是不知道直接用315M接受模块(不带解码的)直接输出到解码部分可行不(后 ..&( 21:33)&差不多就是这样的
315和433的频率按党国规定是不能用在航模遥控上的。主要是不能长时间连续发射。
:315和433的频率按党国规定是不能用在航模遥控上的。主要是不能长时间连续发射。&( 22:43)&这个没有什么问题的
&&&&&&&&&&射频的玩意不好调哦,匹配啥的很麻烦的,自己做的话调不好可能距离几米就收不到了。建议买成品模块的。
:&&&&&&&&&&射频的玩意不好调哦,匹配啥的很麻烦的,自己做的话调不好可能距离几米就收不到了。建议买成品模块的。&( 07:49)&模块 肯定是买成品的 就是不知道 采用什么模块 还有发射协议怎么搞
:模块 肯定是买成品的 就是不知道 采用什么模块 还有发射协议怎么搞 ( 10:51) 我们目前做的方案 功率还不是很大 空中10公里 空速15200
查看完整版本: [--
Powered by
Time 0.052919 second(s),query:5 Gzip enabled

我要回帖

更多关于 单片机 红外解码 的文章

 

随机推荐