AT89C51单片机在智能按摩椅控制系统中的应用设计与仿真实践

1. 系统总体设计

智能按摩椅控制系统以 AT89C51 单片机为核心,主要由以下模块组成:

  • 按键输入模块:用于模式选择和功能调节
  • 身高体重检测模块:采用压力传感器和超声波测距
  • LCD 显示模块:1602 液晶显示当前状态和测量数据
  • 按摩控制模块:控制按摩电机的运行模式和方向
  • 久坐提醒模块:基于定时器实现久坐提醒功能
  • 蓝牙通信模块:可选配,用于手机远程控制
  • 系统整体架构如图 1 所示:
    [此处可插入系统架构图]

    2. 硬件设计

    2.1 核心控制单元

    选用 AT89C51 单片机作为主控制器,具有 8KB 可编程 Flash 存储器、256 字节 RAM,足够满足系统需求。单片机通过 I/O 口连接各功能模块,实现数据采集、处理和控制输出。

    2.2 身高体重检测模块

  • 体重检测:采用 HX711 称重传感器模块,可精确测量用户体重,测量范围 0-100kg,精度 ±0.1kg
  • 身高检测:使用 HC-SR04 超声波传感器,通过测量头顶与传感器的距离计算身高,测量范围 2cm-400cm
  • 2.3 人机交互模块

  • 按键输入:设计 5 个功能按键,分别为 "模式选择"、"力度调节"、"位置调节"、"开始 / 暂停" 和 "复位"
  • LCD 显示:采用 1602 液晶显示屏,显示当前按摩模式、身高体重数据、按摩时间等信息
  • 2.4 按摩控制模块

    通过 L298N 电机驱动模块控制按摩电机,可实现正反转、调速功能,支持多种按摩模式(如揉捏、敲击、滚动等)。

    2.5 久坐提醒模块

    使用蜂鸣器和 LED 指示灯实现声光提醒功能,当用户连续使用时间超过设定值时发出提醒。

    硬件连接示意图如下:
    [此处可插入硬件连接图]

    3. 软件设计

    3.1 主程序设计

    主程序采用循环结构,不断检测按键输入、处理传感器数据、更新显示内容并控制按摩执行机构。程序流程如下:

    1. 系统初始化(包括单片机、LCD、传感器等)
    2. 检测身高体重数据并显示
    3. 等待用户按键输入
    4. 根据按键选择相应的按摩模式和功能
    5. 执行按摩控制并实时更新显示
    6. 检测久坐时间,超过设定值则发出提醒

    3.2 按键处理程序

    按键处理采用查询方式,通过延时消抖确保按键检测的准确性。不同按键对应不同功能,如模式切换、力度调节等。

    3.3 身高体重测量程序

    体重测量通过读取 HX711 模块数据并进行校准计算,身高测量通过 HC-SR04 超声波传感器获取距离值并转换为身高数据。

    3.4 LCD 显示程序

    初始化 LCD1602 后,根据系统状态显示相应信息,包括欢迎界面、身高体重数据、按摩模式和时间等。

    3.5 久坐提醒程序

    利用定时器实现久坐时间计时,当超过预设时间(如 30 分钟)时,触发蜂鸣器和 LED 进行提醒。

    以下是核心控制代码实现:

    c

    #include <reg51.h>
    #include <intrins.h>
    #include <stdio.h>
    
    // 引脚定义
    #define LCD_RS P2_0     // LCD寄存器选择
    #define LCD_EN P2_1     // LCD使能
    #define LCD_DATA P0     // LCD数据总线
    
    #define KEY_MODE P3_0   // 模式选择按键
    #define KEY_POWER P3_1  // 力度调节按键
    #define KEY_POS P3_2    // 位置调节按键
    #define KEY_START P3_3  // 开始/暂停按键
    #define KEY_RESET P3_4  // 复位按键
    
    #define BUZZER P1_0     // 蜂鸣器
    #define LED_ALARM P1_1  // 报警LED
    
    #define HCSR04_TRIG P1_2 // 超声波触发引脚
    #define HCSR04_ECHO P1_3 // 超声波接收引脚
    
    // 全局变量
    unsigned char massage_mode = 0;   // 按摩模式(0-3)
    unsigned char massage_power = 2;  // 按摩力度(1-5)
    unsigned char massage_pos = 3;    // 按摩位置(1-5)
    bit massage_running = 0;          // 按摩运行状态
    unsigned int sitting_time = 0;    // 久坐时间(分钟)
    unsigned int height = 0;          // 身高(cm)
    unsigned int weight = 0;          // 体重(kg)
    
    // 函数声明
    void system_init();               // 系统初始化
    void lcd_init();                  // LCD初始化
    void lcd_write_command(unsigned char cmd);
    void lcd_write_data(unsigned char dat);
    void lcd_set_cursor(unsigned char row, unsigned char col);
    void lcd_display_string(char *str);
    void lcd_clear();
    unsigned int measure_height();    // 测量身高
    unsigned int measure_weight();    // 测量体重
    void key_scan();                  // 按键扫描
    void massage_control();           // 按摩控制
    void timer_init();                // 定时器初始化
    void delay_ms(unsigned int ms);   // 毫秒延时
    
    // 主函数
    void main() {
        system_init();
        
        // 初始欢迎界面
        lcd_clear();
        lcd_set_cursor(0, 0);
        lcd_display_string("Welcome to Smart");
        lcd_set_cursor(1, 0);
        lcd_display_string("Massage Chair System");
        delay_ms(2000);
        
        // 测量身高体重
        lcd_clear();
        lcd_set_cursor(0, 0);
        lcd_display_string("Measuring...");
        height = measure_height();
        weight = measure_weight();
        
        // 显示身高体重
        lcd_clear();
        lcd_set_cursor(0, 0);
        lcd_display_string("Height:");
        lcd_set_cursor(0, 7);
        {
            char temp[6];
            sprintf(temp, "%d cm", height);
            lcd_display_string(temp);
        }
        
        lcd_set_cursor(1, 0);
        lcd_display_string("Weight:");
        lcd_set_cursor(1, 7);
        {
            char temp[6];
            sprintf(temp, "%d kg", weight);
            lcd_display_string(temp);
        }
        delay_ms(3000);
        
        // 主循环
        while(1) {
            key_scan();             // 扫描按键
            if(massage_running) {
                massage_control();  // 控制按摩执行
            }
            
            // 显示当前状态
            lcd_clear();
            lcd_set_cursor(0, 0);
            lcd_display_string("Mode:");
            lcd_set_cursor(0, 6);
            {
                char temp[2];
                sprintf(temp, "%d", massage_mode);
                lcd_display_string(temp);
            }
            
            lcd_set_cursor(0, 8);
            lcd_display_string(" Power:");
            lcd_set_cursor(0, 15);
            {
                char temp[2];
                sprintf(temp, "%d", massage_power);
                lcd_display_string(temp);
            }
            
            lcd_set_cursor(1, 0);
            lcd_display_string("Pos:");
            lcd_set_cursor(1, 4);
            {
                char temp[2];
                sprintf(temp, "%d", massage_pos);
                lcd_display_string(temp);
            }
            
            lcd_set_cursor(1, 6);
            lcd_display_string(" Time:");
            lcd_set_cursor(1, 12);
            {
                char temp[4];
                sprintf(temp, "%dmin", sitting_time);
                lcd_display_string(temp);
            }
            
            delay_ms(200);  // 延时200ms
        }
    }
    
    // 系统初始化
    void system_init() {
        lcd_init();
        timer_init();
        // 其他初始化代码...
    }
    
    // 定时器初始化(用于久坐计时)
    void timer_init() {
        TMOD |= 0x01;    // 设置定时器0为模式1
        TH0 = 0xFC;      // 定时初值(1ms)
        TL0 = 0x66;
        ET0 = 1;         // 使能定时器中断
        EA = 1;          // 开总中断
        TR0 = 1;         // 启动定时器
    }
    
    // 定时器0中断服务函数
    void timer0_isr() interrupt 1 {
        static unsigned int count = 0;
        
        TH0 = 0xFC;      // 重新加载初值
        TL0 = 0x66;
        
        count++;
        if(count >= 60000) {  // 60000ms = 60s = 1min
            count = 0;
            if(massage_running) {
                sitting_time++;  // 久坐时间加1分钟
                
                // 久坐提醒(超过30分钟)
                if(sitting_time >= 30) {
                    BUZZER = ~BUZZER;  // 蜂鸣器报警
                    LED_ALARM = ~LED_ALARM;  // LED闪烁
                }
            }
        }
    }
    
    // 其他函数实现...
    

    4. Proteus 仿真实现

    为验证系统设计的正确性,在 Proteus 环境下搭建了仿真模型,主要包括:

  • AT89C51 单片机
  • LCD1602 显示模块
  • 按键模块
  • HC-SR04 超声波传感器
  • 电机驱动和按摩执行模块
  • 蜂鸣器和 LED 报警模块
  • 仿真结果表明,系统能够准确检测身高体重数据,根据按键输入切换按摩模式和功能,实现久坐提醒功能,达到了预期设计目标。

    [此处可插入 Proteus 仿真截图]

    5. 系统测试与优化

    对系统进行了功能测试和性能测试,主要包括:

  • 身高体重测量精度测试
  • 按键响应测试
  • 按摩模式切换测试
  • 久坐提醒功能测试
  • 测试结果显示,身高测量误差在 ±1cm 以内,体重测量误差在 ±0.5kg 以内,系统响应迅速,各项功能正常。针对测试中发现的问题,对程序进行了优化,主要包括:

  • 增加按键消抖处理
  • 优化超声波测量算法
  • 改进 LCD 显示刷新逻辑
  • 6. 结论与展望

    本文设计并实现了一种基于 AT89C51 单片机的智能按摩椅控制系统,通过 Proteus 仿真验证了系统的可行性。该系统具有操作简单、功能丰富、成本低廉等优点,可应用于家庭和小型按摩场所。

    未来工作将集中在以下几个方面:

  • 增加更多按摩模式和功能
  • 引入语音控制功能
  • 开发手机 APP 远程控制
  • 优化系统功耗,提高稳定性
  • 参考文献

    [1] 单片机原理及应用。张毅刚,彭喜元,等。高等教育出版社,2012
    [2] Proteus 电路仿真从入门到精通。王振红,等。电子工业出版社,2015
    [3] AT89C51 单片机数据手册. Atmel Corporation, 2008
    [4] HC-SR04 超声波传感器数据手册。杭州海康威视数字技术股份有限公司,2016
    [5] LCD1602 液晶显示模块使用说明书。深圳精电元电子有限公司,2018

    作者:Aholic.962

    物联沃分享整理
    物联沃-IOTWORD物联网 » AT89C51单片机在智能按摩椅控制系统中的应用设计与仿真实践

    发表回复