首页
Web开发
Windows程序
编程语言
数据库
移动开发
系统相关
微信
其他好文
会员
首页
>
其他好文
> 详细
基于PWM调制的红外遥控器的设计
时间:
2015-01-23 20:12:30
阅读:
219
评论:
0
收藏:
0
[点我收藏+]
标签:
avr
定时器
红外
pwm
通信
下面首先先简单介绍单总线通信的原理:
假设通信线上无数据时,即常态为低电平,即单总线以 下拉电阻将总线拉为低电平,其中100K欧就是常态的下拉电阻。
这里以12V为高电平,以实现较远通信电路的设计
那么如何实现数字通信呢?
现将3ms高电平,1ms低电平作为逻辑1;1ms高电平,1ms低电平作为逻辑0.(当然,只要高电平的时间有明显区分即可)
软件设计时,通常需要定时器配合,即设计一个0.5ms的定时中断,并定义一个中断次数计数器C,每发生一次中断,C加一。
软件包括发数据和接收数据两部分。
(1)发数据程序设计方法
程序应设计两个函数,发逻辑1和发逻辑0两个函数。
发逻辑1是,首先将定时器重新初始化,并将C清0,将发送数据端口置1.之后一直查询计数器C,当C等于6时,发送端口立即给0.并将定时器重新初始化,且C清0;然后查询等待
当C等于2时,程序返回,即发送逻辑1结束。同理发逻辑0.
采用位域的方法定义输出为port_send,输入为prt_re.注意要初始化I/O属性
unsigned int ms_timing0;
void send_high()
//3个1ms高电平和1个1ms低电平为传送逻辑1
{
TimesInit(); //定时器重新0.5msc初始化,没有给出程序
C_times=0;
//计数器C清0
while(C_times<6) port_send=1; //3ms 1
C_times=0;
while(C_times<2) port_send=0; //1ms 0
}
void send_low()
//一个1ms高电平和1ms低电平为一个传送逻辑0
{
TimesInit(0);
//定时器重新0.5msc初始化
C_times=0;
//计数器C清0
while(C_times<2) port_send=1; //1ms 1
C_times=0;
while(C_times<2) port_send=0; //1ms 0
}
下面是发一个字节数据的程序:
void send(unsigned int nc)
{
unsigned int i;
for(i=0;i<8;i++)
{
if((nc&0x80)!=0) send_high();
else send_low();
nc<<=1;
}
}
(2)接收数据
接受数据需要一直查询接收数据端口,发现为高电平,即刻进入接收数据状态。
当出现高电平后,定时器重新初始化,且C清0,查询等待直到接收端口出现低电平,立即退出C的值。
当1<<C<3,接收的是逻辑0;
当5<<C<7,接收的是逻辑1.当然还要查询等待1ms左右,表示接收1个逻辑位结束。
软件设计时,要注意防止进入程序死区,在等待高或低电平时,同时也要查询计数器C的值,当C已经很大,比如10时,要考虑是否发生总线错误问题,该类情况要给予充分的重视。
下面是连续接收8个逻辑位的函数,当检测到高电平时,即刻进入此函数。
unsigned int Re8()
{
unsigned int nc=0,i;
TimesInit(); //定时器重新初始化
for(i=0;i<8;i++)
{
C_times=0;
//计数器C清0
while(port_re){ if(ms_timing>50) break;}
if((C_times>=1)&&(C_times<3)) nc<<=1;
if((C_times>=5)&&(C_times<7)) nc=(nc<<1)|0x01;
C_times=0;
while(!port_re)
{
if(C_times>50) break;
}
}
return nc;
}
基于PWM调制的红外遥控器的设计
标签:
avr
定时器
红外
pwm
通信
原文地址:http://blog.csdn.net/u013457167/article/details/43059347
踩
(
0
)
赞
(
0
)
举报
评论
一句话评论(
0
)
登录后才能评论!
分享档案
更多>
2021年07月29日 (22)
2021年07月28日 (40)
2021年07月27日 (32)
2021年07月26日 (79)
2021年07月23日 (29)
2021年07月22日 (30)
2021年07月21日 (42)
2021年07月20日 (16)
2021年07月19日 (90)
2021年07月16日 (35)
周排行
更多
分布式事务
2021-07-29
OpenStack云平台命令行登录账户
2021-07-29
getLastRowNum()与getLastCellNum()/getPhysicalNumberOfRows()与getPhysicalNumberOfCells()
2021-07-29
【K8s概念】CSI 卷克隆
2021-07-29
vue3.0使用ant-design-vue进行按需加载原来这么简单
2021-07-29
stack栈
2021-07-29
抽奖动画 - 大转盘抽奖
2021-07-29
PPT写作技巧
2021-07-29
003-核心技术-IO模型-NIO-基于NIO群聊示例
2021-07-29
Bootstrap组件2
2021-07-29
友情链接
兰亭集智
国之画
百度统计
站长统计
阿里云
chrome插件
新版天听网
关于我们
-
联系我们
-
留言反馈
© 2014
mamicode.com
版权所有 联系我们:gaon5@hotmail.com
迷上了代码!