任务描述
通过编程实现继电器对风扇的启停控制,点击继电器面板上的黑色按键,当点击次数是偶数次,风扇启动;当是奇数次,风扇停止转动。
知识引入
1.继电器的概念
继电器(relay)是一种电控制器件,用来实现弱电控制强电。单片机IO输出的电压较低,一般是3.3V或者5V,输出电流能力有限,因此不能直接用来控制家电或者其他大功率电气,但是可以通过继电器进行控制。单片机的引脚输出高低电平信号给继电器,并用控制继电器的输出端。通常应用于自动化的控制电路中,它实际上是用小电流去控制大电流运作的一种“自动开关”。故在电路中起着自动调节、安全保护、转换电路等作用。
汽车领域比较常见的继电器有:启动电动机的启动继电器、嗽叭继电器、电动机或发电机断路继电器、充电电压和电流调节继电器、转变信号闪光继电器、灯光亮度控制继电器以及空调控制继电器、推拉门自动开闭控制继电器;玻璃窗升降控制继电器。家用电器:空调继电器主要用于控制压缩机电动机、风扇电动机和冷却泵电动机,以执行相关的控制功能。工业控制继电器主要的控制功能由通用交流继电器完成。通常由按纽或限位开关驱动继电器。继电器的触点可以控制电磁阀、较大的启动电机以及指示灯。
2.继电器的配置
继电器的控制与LED的控制类似,都是将对应的IO口P11设置为强推挽输出。P11寄存器如下表4-2所示:
P1M1[7:0] 寄存器P1M1地址为91H |
P1M0[7:0] 寄存器P1M1地址为92H |
I/0口模式 (P1.x如做A/D使用,需先将其设置成开漏或高阻输入) |
0 | 0 | 准双向口(传统8051 I/O模式,弱上拉), 灌电流可达20mA,拉电流为270uA, 由于制造误差,实际为270uA~150uA |
0 | 1 | 推挽输出(强上拉输出,可达20mA,要加限流电阻) |
1 | 0 | 高阻输入(电流既不能流入也不能流出) |
1 | 1 | 开漏(Open Drain),内部上拉电阻断开。 开漏模式既可读外部模式也可对外输出(高电平或低电平) 如要正确读外部状态或需要对外输出高电平,需外加上拉电阻,否则读不到外部状态,也对外输不出高电压。 |
#include "WZ01_SN_A_V1.0.h" #include "Uart3.h" /*-源码分析----------------- 以上两个头文件功能描述如下: WZ01_BR13_A_V1.0.h:设备厂家单片机定义的头文件。 Uart3.h:串口3收发以及端口的映射的头文件。 ------------------*/ ulong System1MsCnt = 0; //系统1ms计数器 ulong SystemSecond = 0; //定时器0初始化 void Timer0Init() { AUXR |= 0x80; //定时器0为1T模式 TMOD = 0x00; //设置定时器为模式0(16位自动重装载) TL0 = T1MS; //初始化计时值 TH0 = T1MS >> 8; TR0 = 1; //定时器0开始计时 ET0 = 1; //使能定时器0中断 EA = 1; //使能总中断 } //*功能描述: 定时器0中断服务函数(启动后每1MS进入一次) void Timer0_ISR() interrupt 1 using 1 { static uint counter0=0; counter0++; System1MsCnt++; if(System1MsCnt%1000==0) { // BUZZER = !BUZZER; } } //主函数 void main(void) { char *ptrTemp = NULL; uint temp=0; //定义一个整形变量 用来按键按下计数 uchar buff[20]={0}; //定义字符数组存储串口发送字符串 SetBit(P1M0,1); ClrBit(P1M1,1); DATA_IO1 = 0; /*-源码分析----------------- 1.SetBit(P1M0,1);ClrBit(P1M1,1);: 配置P11为强推挽输出,用于控制继电器 1. DATA_IO1 = 0: DATA_IO1在”WZ01_BR13_A_V1.0.h”头文件中对应引脚定义为P11,设置为0表示关闭状态。此处是为防止继电器上次断电没有关闭,所以先关闭一次。 ------------------*/ BUZZER_INIT(); LED_INIT(); KEY_INIT(); //设置P46引脚为输入方式 Timer0Init(); //定时器初始化 OledInit(); //液晶屏初始化 OledClear(); //液晶屏清屏 OledSprintf(1,1," 继电器控制 "); OledSprintf(3,1,"关"); LED2_OFF(); while(1) { if(KEY1==0) { DelayMs(20); /*-源码分析----------------- 1.KEY1: 在”WZ01_BR13_A_V1.0.h”头文件中对KEY1宏定义为:#define KEY1 P46,P46对应电路板按键。 当按键按下状态,KEY1取值为0;松开状态,取值为1。 2. DelayMs(20): 功能为延时20毫秒,目的是进行按键消抖,防止按键在按下或松开的状态下不稳定。此处延时时长可根据实际情况自行修改进行调试。 ------------------*/ if(KEY1==0) //按键按下 { temp ++; //按键按下的次数计数 OledClearHalf(2); if(temp%2==0) //判断按键按下几次 偶数次关闭 奇数次打开 { OledSprintf(3,1,"关"); LED2_OFF(); LED3_ON(); DATA_IO1 = 0; //关闭继电器(风扇) BUZZER_ON(); DelayMs(100); BUZZER_OFF(); OledSprintf(3,1,"关"); } else { OledSprintf(3,1,"开"); LED2_ON(); LED3_OFF(); DATA_IO1 = 1; //打开继电器(风扇) BUZZER_ON(); DelayMs(300); BUZZER_OFF(); OledSprintf(3,1,"开"); } } } } |