51单片机实现类似于Arduino中micros()、millis()函数功能并用于接收ppm信号
最近想要给小车添加航模遥控器遥控功能,毕竟航模遥控器拿在手里还是很有质感,手感很不错的。选择使用ppm信号,ppm信号相关参考:PPM相关
Arduino中micros()函数返回一个单位为无符号长整形的变量表示开机时间,符号为us。用于测量某段时间很是方便,上文分析的飞控代码中也是使用micros()函数对ppm信号进行解码,所以萌生了在51上封装类似函数的想法。和arduino不同的是,millis()函数本例返回值为浮点型
使用STC15W4K56S4单片机,24MHz主频,定时器进行12分频。
unsigned int times_L=0;
unsigned int times_H=0;
unsigned int xdata channelnum[3][8];
extern unsigned int xdata channel[8];void Timer1Init(void)
{AUXR &= 0xBF; //定时器时钟12T模式TMOD &= 0x0F; //设置定时器模式TL1 = 0x00; //设置定时初始值TH1 = 0x00; //设置定时初始值TF1 = 0; //清除TF1标志ET1=1;TR1 = 1; //定时器1开始计时
}void time1() interrupt 3{if(times_L==65535){times_L=0; //L溢出,H进位times_H++;}else times_L++;
}unsigned long int micros(){unsigned char TH,TL;TL=TL1; //读取定时器1低8位TH=TH1; //定时器1高8位return (times_L<<15)+(TH<<7)+(TL>>1); //返回us数times_L*65536/2+TH1*256/2+TL1/2
}float millis(){unsigned char TH,TL;TL=TL1; //原理同micros()TH=TH1;return (times_H*2147483.648)+(times_L*32.768)+(TH*0.128)+(TL*0.0005);
}void int0_init(){IT0 = 1; //设置INT0的中断类型EX0 = 1; //使能INT0中断
}void int0() interrupt 0{unsigned long int now;unsigned int diff;static unsigned long int last;static unsigned char num=0,ch=0;now=micros(); //读取当前usdiff=now-last; //计算两次进入中断时间差值last=now; //last从新赋值用于下一次计算if(diff>3000||ch>7){ //判断此帧是否结束num++;if(num>=3){num=0;ch_filtering();}ch=0;}else if(diff>900&&diff<2100){ //记录有效值channelnum[num][ch]=diff;ch++;}
}void ch_filtering(){ //对通道值进行滤波unsigned char i;for(i=0;i<8;i++)channel[i]=(channelnum[0][i]+channelnum[1][i]+channelnum[2][i])/3;
}
不过与参考文章不同,实测FS-IA6B接收机低电平时间为400us
网上有的实例使用两个外部中断或者使用电平变化方式进入中断,即无论有上升沿还是下降沿都进行中断,这时低电平固定时间不同可能会使最终计算结果不准确。通道值为低电平时间加高电平时间,所以只使用下降沿或上升沿中断可直接测得通道值。
51单片机实现类似于Arduino中micros()、millis()函数功能并用于接收ppm信号相关推荐
- 单片机学习笔记————51单片机实现数码管中的倒计时程序
一.使用proteus绘制简单的电路图,用于后续仿真 二.编写程序 /***************************************************************** ...
- 基于51单片机51wifi控制4路继电器开关定时功能
项目简介: 一款基于STC89C52单片机的手机WIFI控制4路继电器的插座控制器设计.通过安装手机APP实现手机和设备的互联,只要手机发送相应的指令,继电器将会按照相关指令进行操作该设计极大的方便了 ...
- R语言dplyr包使用recode函数进行数据列内容编码、转换实战:类似于pandas中的map函数(例如,将内容从字符串映射到数值)
R语言dplyr包使用recode函数进行数据列内容编码.转换实战:类似于pandas中的map函数(例如,将内容从字符串映射到数值) 目录
- 51单片机串口通信实操(中断函数)
51单片机串口通信实操(中断函数) 详细参考单片机手册 SM0.SM1分别为0,1时为模式一,因为模式一最为常用 REN=1,为接收,REN=0,为不接收 当 SM0,SM1,SM2,REN,TB8, ...
- 51单片机+ds1302+lcd1602简易电子时钟(带闹钟功能)
51单片机+ds1302+lcd1602简易电子时钟(带闹钟功能) AT89C52.LCD1602.DS1302.speaker. Proteus仿真 实例代码 #include<reg52.H ...
- 利用openCV实现中值滤波自定义滤波窗口尺寸的功能(类似halcon中的median_rect函数功能)
利用openCV实现中值滤波自定义滤波窗口尺寸的功能(类似halcon中的median_rect函数功能) 在halcon图像库中有一个常用的中值滤波算子median_rect: median_rec ...
- 51单片机独立按键学习中,出现的问题以及心得
文章目录 前言 一.出现的问题 1.问题1 2.问题2 二:心得 独立按键的短按 独立按键按住时间不同实现功能不同 总结 前言 Hello大家好,这里是万某,今天学习的是51单片机的独立按键,在此记录 ...
- 【51单片机】:关于51单片机仿真器(普中科技开发板STC89C51)的疑惑(做个记录)
学习目标: 由于一些特殊原因,重学51单片机,真是无力吐槽,学把,认真学. 仿真器,最主要的作用是仿真调试,每次检查代码找不到任何问题比如说debug.先全速运行几秒后点击停止,看程序 ...
- 【51单片机快速入门指南】4.4.1:python串口接收磁力计数据并进行最小二乘法椭球拟合
目录 硬知识 Python代码 使用方法 串口收集数据 椭球拟合 验证 STC15F2K60S2 16.384MHz Keil uVision V5.29.0.0 PK51 Prof.Develope ...
最新文章
- 【译】Bootstrap基本理念
- js移除某个class_用JS添加和删除class类名
- c语言指针改良,重新认识C语言指针(上)(示例代码)
- MinIO Client完全指南 ​​​​​​​
- webpack打包原理(待续)
- html 报文头 参数 详解 本文转载于 http://stephen830.javaeye.com/blog/335578
- DIV+CSS两种盒子模型
- 功能表单之智能选择字段类型的使用——JEPLUS软件快速开发平台
- Wordpress淘宝客专用链接跳转插件Pretty Link Lite
- 深度学习面试每日一题
- python天眼查爬虫_学习Python3 天眼查 爬虫
- 基于OCCT7.4的实验性CAD程序
- 2019年区块链安全事件总结,全球损失超60亿美元 | 盘点
- 如何用MATLAB求解一元高次方程
- vue 跳转到指定路由地址 (可附带参数)
- CS231n assignment1 KNN部分用到的函数
- 军团要塞2正版服务器,Team Fortress 2
- 计算机课学生电脑怎么打开任务管理器,电脑任务管理器的打开方法
- 智能手机怎么玩java游戏_智能手机可以在普通手机上玩Java游戏吗?
- 如何部署超级签名分发平台系统?
热门文章
- RabbitMQ:Erlang distribution failed解决方案
- shell编程中expr的用法
- 自动投票器的原理及设计思路 http://blog.csdn.net/lkfstar/archive/2008/01/12/2039070.aspx
- 拨号宽带服务器无响应是什么意思,宽带拨号服务器无响应
- 支持加密的开源笔记Joplin
- 专家看台:柯莱特CTO谈企业选择CRM的六大目标
- influxdb学习记录
- VS2015 安装.NET Core
- 做软件的也得注意休息啊
- 首席新媒体黎想教程:一份完整的运营方案,应包含的7个方面