找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1601|回复: 12
打印 上一主题 下一主题
收起左侧

想通过单片机+红外控制流水灯的模式切换

[复制链接]
跳转到指定楼层
楼主
ID:960619 发表于 2021-8-30 11:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
外部中断红外接收进来进行解码,根据解码的键值判断执行哪条程序。
.怎样一直扫描红外键码的变动,键码一变就跳转执行相应代码,在定时中断中扫描吗?


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:776954 发表于 2021-8-30 13:18 | 只看该作者
如果不是红外线,而直接是按键切换状态的话, 你会做吗?仔细想想他们的区别
回复

使用道具 举报

板凳
ID:161164 发表于 2021-8-30 13:44 | 只看该作者
不要用delay,不要用for


  1. while(1){
  2. for(i=0;i<8;i++){
  3. //your code
  4. }
  5. }
复制代码

改为
  1. i=0;
  2. while(1)
  3. {
  4. //your code
  5. if(++i>=8)i=0;
  6. }
复制代码
回复

使用道具 举报

地板
ID:624769 发表于 2021-8-30 13:44 | 只看该作者
先假定,红外接收解码,你已经会了,
又假定,根据外部中断切换主程序分支,你也会了(一般是定义变量Mode, 然后主程序Switch(mode) 走不同的分支).

那么,把红外线接受头的引脚连接在外部中断口。当红外接受头收到信号,开始动作,则触发外部中断。
然后,外部中断程序开启定时器中断,并且关闭自己的外部中断。
随后,定时器中断负责处理红外接受头收到的信号。处理完毕后,把键值保存,并置位标志位(主程序根据标志位判断是否需要进行模式切换)。
同时关闭定时器,打开外部中断(为下次接受信号准备)。
这么写应该能理解吧?
回复

使用道具 举报

5#
ID:96072 发表于 2021-8-30 13:58 | 只看该作者
红外遥控接收代码,现成的
回复

使用道具 举报

6#
ID:960619 发表于 2021-8-30 16:58 | 只看该作者
188610329 发表于 2021-8-30 13:44
先假定,红外接收解码,你已经会了,
又假定,根据外部中断切换主程序分支,你也会了(一般是定义变量Mode, 然 ...

还没同时用过两个中断。我理解的你说的意思是红外接收是最优先中断0,红外解码的程序放到定时中断1里面执行,外部中断每成功接收一次信号先关闭外部中断,等定时中断处理完解码再重新打开外部中断接收下一次信号。然后根据定时中断里的标志位回到Switch里面走相应程序。关于“把键值保存,并置位标志位”,根据不同键码置不同标志位,然后赋值给mode吗
回复

使用道具 举报

7#
ID:960619 发表于 2021-8-30 17:01 | 只看该作者
HEIZI555 发表于 2021-8-30 13:58
红外遥控接收代码,现成的

红外解码写好了,现要用红外遥控实现不同的功能,包括对电机的控制啊,灯的亮度,灯的状态等
回复

使用道具 举报

8#
ID:960619 发表于 2021-8-30 17:03 | 只看该作者
lkc8210 发表于 2021-8-30 13:44
不要用delay,不要用for


这个好像没啥关系吧,执行中断,都能跳出来,或是在循环里放按键扫描功能
回复

使用道具 举报

9#
ID:415064 发表于 2021-8-30 18:06 | 只看该作者
baobao125 发表于 2021-8-30 17:01
红外解码写好了,现要用红外遥控实现不同的功能,包括对电机的控制啊,灯的亮度,灯的状态等

按键的会写了,红外的也就会写了。无外乎把红外套按键的逻辑
回复

使用道具 举报

10#
ID:161164 发表于 2021-8-30 19:48 来自手机 | 只看该作者
baobao125 发表于 2021-8-30 17:03
这个好像没啥关系吧,执行中断,都能跳出来,或是在循环里放按键扫描功能

那还有什么问题?
Just do it~!
回复

使用道具 举报

11#
ID:624769 发表于 2021-8-31 20:42 | 只看该作者
baobao125 发表于 2021-8-30 16:58
还没同时用过两个中断。我理解的你说的意思是红外接收是最优先中断0,红外解码的程序放到定时中断1里面执 ...

额,你可能稍稍有点误会我的意思了。
我的意思是,没必要定时器常开一直等待按键,红外接受信号时有个头信号的,此时会产生一个下降沿,利用这个下降沿触发外部中断,来打开定时器,接受及解码按键。
当然,你要嫌麻烦也不怕消耗资源,可以不用这个外部中断,直接定时器常开24小时等待红外信号也可以。
然后就是和你理解的差不多,定时器中断获取键值存入变量Key. 然后main程序根据这个变量Key,选择执行哪一段代码。需要注意的是,如果你希望这个操作可以被打断的话,就要分段执行,比如你要跑马灯右移8次,不要一次就让他for循环跑完,你通过一个变量比如 remain , 赋值8,然后每次进入这个分支 if(--remain > 0) 右移一次。那么,你就要8次循环主程序才会跑完这个右移过程,这个过程中,只要接受到新的按键,键值改变了,就能在分支入口选择mode的地方打断之前那个分支的操作了。理解我的意思不?
回复

使用道具 举报

12#
ID:390416 发表于 2021-9-1 08:22 | 只看该作者
先学会红外解码  
《人人学会单片机》 第28、第29课讲了红外解码教程。A站可以观看、原子哥网也可以免费观看。
回复

使用道具 举报

13#
ID:342954 发表于 2021-9-1 09:19 | 只看该作者
如果你红外接收程序能写出来,那后面的程序应不是难事
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表