51单片机无线遥控点滴输液控制器电路设计
由于没有给出详细的要求和功能,此处仅提供一个简单的无线遥控点滴输液控制器的电路设计。
- 硬件部分:
主控芯片:AT89S52单片机
无线模块:nRF24L01
电机驱动芯片:L293D
电机:步进电机
显示器:1602液晶屏
按键:4个
电源:5V直流电源
- 电路连接图:

- 程序部分:
程序采用Keil C语言编写,主要实现以下功能:
a. 通过无线模块与遥控器通信,接收控制指令;
b. 控制电机驱动芯片L293D,控制步进电机运转;
c. 显示点滴输液速度和剩余时间;
d. 实现4个按键的功能,包括开始、暂停、加速、减速。
程序代码如下:
#include <reg52.h>
#include "LCD1602.h"
#include "nRF24L01.h"
#define uchar unsigned char
#define uint unsigned int
uchar speed = 10; //默认输液速度为10滴/分钟
uchar hour = 1; //默认输液时间为1小时
uchar minute = 0;
uchar second = 0;
bit start_flag = 0; //开始标志位
bit pause_flag = 0; //暂停标志位
sbit IN1 = P1^0; //L293D驱动芯片IN1
sbit IN2 = P1^1; //L293D驱动芯片IN2
sbit IN3 = P1^2; //L293D驱动芯片IN3
sbit IN4 = P1^3; //L293D驱动芯片IN4
void delay(uint xms) //延时函数,xms为延时时间(ms)
{
uint i,j;
for(i=xms;i>0;i--)
{
for(j=110;j>0;j--);
}
}
void init() //初始化函数
{
LCD_Init(); //初始化液晶屏
nRF24L01_Init(); //初始化无线模块
P1 = 0x00; //配置P1口为输出
}
void motor_forward(uchar x) //电机正转函数,x为转动步数
{
uchar i;
for(i=0;i<x;i++)
{
IN1 = 1;
IN2 = 0;
IN3 = 1;
IN4 = 0;
delay(60000/speed); //根据输液速度确定每滴间隔时间
IN1 = 0;
IN2 = 1;
IN3 = 0;
IN4 = 1;
delay(60000/speed);
}
}
void motor_backward(uchar x) //电机反转函数,x为转动步数
{
uchar i;
for(i=0;i<x;i++)
{
IN1 = 0;
IN2 = 1;
IN3 = 0;
IN4 = 1;
delay(60000/speed);
IN1 = 1;
IN2 = 0;
IN3 = 1;
IN4 = 0;
delay(60000/speed);
}
}
void display() //显示函数
{
LCD_Clear();
LCD_Write_String("Speed:");
LCD_Write_Char(speed/10+'0');
LCD_Write_Char(speed%10+'0');
LCD_Write_String("d/min ");
LCD_SetCursor(0,1);
LCD_Write_String("Time:");
LCD_Write_Char(hour/10+'0');
LCD_Write_Char(hour%10+'0');
LCD_Write_Char(':');
LCD_Write_Char(minute/10+'0');
LCD_Write_Char(minute%10+'0');
LCD_Write_Char(':');
LCD_Write_Char(second/10+'0');
LCD_Write_Char(second%10+'0');
}
void main()
{
uchar key = 0;
init(); //初始化
while(1)
{
if(nRF24L01_RxPacket()) //接收遥控器数据
{
key = nRF24L01_RXDATA[0];
switch(key)
{
case 0x01: //开始
start_flag = 1;
pause_flag = 0;
break;
case 0x02: //暂停
pause_flag = 1;
break;
case 0x03: //加速
if(speed<20)
speed++;
break;
case 0x04: //减速
if(speed>1)
speed--;
break;
default:
break;
}
}
if(start_flag && !pause_flag) //开始标志位为1且暂停标志位为0时开始输液
{
motor_forward(1); //每次输液一滴
second++;
if(second>=60) //每60秒更新一次时间
{
second = 0;
minute++;
if(minute>=60)
{
minute = 0;
hour--;
if(hour==0) //输液结束
{
start_flag = 0;
pause_flag = 0;
LCD_Clear();
LCD_Write_String("Infusion end!");
motor_backward(1); //退回一滴
while(1);
}
}
}
}
display(); //显示当前状态
delay(100); //延时100ms
}
}
原文地址: https://www.cveoy.top/t/topic/m6GR 著作权归作者所有。请勿转载和采集!