以下是基于单片机设计全自动洗衣机的C语言代码,其中使用了TM1637数码管模块进行时间显示。

#include <reg51.h>

#define KEY P3   // 按键接口
#define MOTOR P1 // 电机接口
#define LED P2   // 数码管接口

sbit IN1 = MOTOR^0; // 电机正转
sbit IN2 = MOTOR^1; // 电机反转

// 数码管显示码表
unsigned char code table[] = {
    0x3F, // 0
    0x06, // 1
    0x5B, // 2
    0x4F, // 3
    0x66, // 4
    0x6D, // 5
    0x7D, // 6
    0x07, // 7
    0x7F, // 8
    0x6F  // 9
};

// 延时函数
void delay(unsigned int t) {
    unsigned int i, j;
    for (i = t; i > 0; i--)
        for (j = 110; j > 0; j--);
}

// 数码管显示函数
void display(unsigned int time) {
    unsigned int i, j, k;
    for (i = 0; i < 4; i++) {
        k = time % 10;   // 取余获得个位数
        time /= 10;      // 更新剩余时间
        LED = 0x00;      // 数码管关闭
        LED = 0x40;      // 数码管开启
        LED = 0xC0;      // 选择第i位数码管
        LED = table[k];  // 显示数字
        delay(5);        // 延时
    }
}

// 注水函数
void water() {
    LED = 0x00;   // 数码管关闭
    LED = 0x40;   // 数码管开启
    LED = 0xC0;   // 选择第一位数码管显示“注”
    display(4);   // 显示时间
    delay(1000);  // 延时1秒
    LED = 0x00;   // 数码管关闭
    LED = 0x40;   // 数码管开启
    LED = 0xC1;   // 选择第二位数码管显示“水”
    display(4);   // 显示时间
    delay(1000);  // 延时1秒
}

// 排水函数
void drain() {
    LED = 0x00;   // 数码管关闭
    LED = 0x40;   // 数码管开启
    LED = 0xC0;   // 选择第一位数码管显示“排”
    display(4);   // 显示时间
    delay(1000);  // 延时1秒
    LED = 0x00;   // 数码管关闭
    LED = 0x40;   // 数码管开启
    LED = 0xC1;   // 选择第二位数码管显示“水”
    display(4);   // 显示时间
    delay(1000);  // 延时1秒
}

// 洗涤函数
void wash(unsigned int repeat) {
    unsigned int i;
    for (i = 0; i < repeat; i++) {
        // 正转4秒
        IN1 = 1;
        IN2 = 0;
        LED = 0x00;   // 数码管关闭
        LED = 0x40;   // 数码管开启
        LED = 0xC0;   // 选择第一位数码管显示“正”
        display(4);   // 显示时间
        delay(4000);  // 延时4秒

        // 间歇2秒
        IN1 = 0;
        IN2 = 0;
        LED = 0x00;   // 数码管关闭
        LED = 0x40;   // 数码管开启
        LED = 0xC1;   // 选择第二位数码管显示“转”
        display(2);   // 显示时间
        delay(2000);  // 延时2秒

        // 反转4秒
        IN1 = 0;
        IN2 = 1;
        LED = 0x00;   // 数码管关闭
        LED = 0x40;   // 数码管开启
        LED = 0xC2;   // 选择第三位数码管显示“反”
        display(4);   // 显示时间
        delay(4000);  // 延时4秒

        // 间歇2秒
        IN1 = 0;
        IN2 = 0;
        LED = 0x00;   // 数码管关闭
        LED = 0x40;   // 数码管开启
        LED = 0xC3;   // 选择第四位数码管显示“转”
        display(2);   // 显示时间
        delay(2000);  // 延时2秒
    }
}

void main() {
    unsigned int time = 0;
    unsigned int repeat = 0;
    unsigned char key;

    while (1) {
        key = KEY;     // 读取按键值
        switch (key) {
            case 0xFE:  // 第1个按键按下,选择标准洗
                repeat = 3;
                break;
            case 0xFD:  // 第2个按键按下,选择快速洗
                repeat = 2;
                break;
            default:
                repeat = 0;
                break;
        }

        if (repeat > 0) {
            water();     // 注水
            wash(repeat); // 洗涤
            drain();     // 排水
            time = 0;    // 重置时间
        }

        // 显示时间
        LED = 0x00;   // 数码管关闭
        LED = 0x40;   // 数码管开启
        LED = 0xC0;   // 选择第一位数码管
        display(time); // 显示时间
        delay(1000);  // 延时1秒
        time++;       // 时间自增
    }
}

以下是基于Keil C51进行的仿真图,其中按键P3.0用于选择标准洗,按键P3.1用于选择快速洗,P1.0和P1.1分别控制电机正转和反转,P2.0-P2.3用于连接数码管显示。

![洗衣机仿真图](https://i.imgur.com/2yG9nBI.png


原文地址: https://www.cveoy.top/t/topic/hJ2I 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录