小工具知识网

当前位置: 首页 > 行业知识 > 单片机学习笔记---红外遥控&红外遥控电机调速(完结篇)

行业知识

单片机学习笔记---红外遥控&红外遥控电机调速(完结篇)

2026-10-19 17:23:00 来源:互联网转载

���录

低电平触发中断和下降沿触发中断的区别

红外遥控

Int0.c

Int.h

Timer0.c

Timer0.h

IR.c

IR.h

main.c 

红外遥控电机调速

Timer1.c

Timer.h

Motor.c

Motor.h

main.c


上一节讲了红外发送和接收的工作原理,这一节开始代码演示!

提前说明,本节代码演示中会涉及定时器和中断系统!

如果不懂定时器和中断系统的话,建议去看看我之前已经详细写过的中断系统和定时器的博客,也写的比较全面的了,看过后肯定能让你明白中断系统和定时器的工作原理!

单片机学习笔记---中断系统(含外部中断)-CSDN博客

单片机学习笔记---定时器/计数器(简述版!)_定时计数器ea-CSDN博客

单片机学习笔记---定时器和中断系统如何连起来工作-CSDN博客

低电平触发中断和下降沿触发中断的区别

在正式演示红外遥控的代码之前我们先来看看配置外部中断时,选择低电平触发和下降沿触发有什么区别?

我们用外部中断INT0来举个例子:

我们单片机的原理图上,INT0接的是单片机的P32口,

而独立按键K3正好也是P32口。

那么我们按下K3的时候就相当于给单片机的P32口一个下降沿

那么我们现在来写一个程序验证一下选择低电平触发和下降沿触发有什么区别:

先创建一个工程文件,把我之前的博客中讲过的LCD1602的程序文件添加进来

然后在主程序main.c中调用这个函数来显示中断触发的现象

首先是选择下降沿触发:

#include #include "LCD1602.h"unsigned char Num;void main(){LCD_Init();//初始化液晶屏//配置中断系统IT0=1;//选择下降沿触发方式IE0=0;//中断标志位清零EX0=1;//打开中断EA=1;//打开总中断PX0=1;//一般都选择高优先级中断//跳转到中断函数//中断函数执行完进入while循环while(1){LCD_ShowNum(1,1,Num,3);}}//中断函数void Init0_Routine(void) interrupt 0{Num++;}

下降沿触发的话,你按下的时候加一次,松开再按下的时候才再加一次。“松开状态再按下”这一个过程就是给一个下降沿的过程。

效果请看视频:

选择下降沿触发中断的结果现象

再来看看选择低电平触发:

#include #include "LCD1602.h"unsigned char Num;void main(){LCD_Init();//初始化液晶屏//配置中断系统IT0=0;//选择低电平触发方式IE0=0;//中断标志位清零EX0=1;//打开中断EA=1;//打开总中断PX0=1;//一般都选择高优先级中断//跳转到中断函数//中断函数执行完进入while循环while(1){LCD_ShowNum(1,1,Num,3);}}//中断函数void Init0_Routine(void) interrupt 0{Num++;}

而如果是低电平触发的话,只要按键按下这个中断会一直处于触发状态,当中断函数结束之后它会再次进入,直到变成高电平为止。那它的现象就是按下不松的时候,这个数值是一直加的,直到松手,数值才停止加。

效果请看视频:

选择低电平触发中断的结果现象

而本节红外遥控的示例代码要用的是下降沿触发中断的这种方式!

红外遥控

现在开始正式演示代码:

新创建一个工程文件:红外遥控

将我之前的博客讲过的程序模块直接添加进来

然后先创建Int0.c,Int.h,IR.c,IR.h和main.c文件

开始代码讲解:

首先写一个初始化中断系统的函数

Int0.c

#include void Int0_Init(void){IT0=1;//选择下降沿触发中断IE0=0;//中断标志位清零EX0=1;//把中断打开EA=1;//打开总中断PX0=1;//选择高优先级中断}

声明一下这个函数

Int.h

#ifndef __INT0_H__#define __INT0_H__void Int0_Init(void);#endif

Timer0.c

接下来我们把Timer0.c文件的程序改造一下

将计时器初始化函数中的中断系统配置部分删掉,将初值清零,并且关闭计时

#include //定时器0初始化void Timer0_Init(void){TMOD &= 0xF0;//设置定时器模式TMOD |= 0x01;//设置定时器模式TL0 = 0;//设置定时初值TH0 = 0;//设置定时初值TF0 = 0;//清除TF0标志TR0 = 0;//定时器0不计时}

单独写一个给定时器0设置初值的函数

//定时器0设置计数器值void Timer0_SetCounter(unsigned int Value){TH0=Value/256;//取出高八位赋值给TH0TL0=Value%256;//取出低八位赋值给TH0}//Value,要设置的计数器值,范围:0~65535

定时器0设置好初值后,再写一个获取定时器0当时的计数器值的函数

 //定时器0获取计数器值,范围:0~65535unsigned int Timer0_GetCounter(void){return (TH0

上一篇:热水机房在哪里安装?

下一篇:notepad怎么连接服务器?