基于51单片机项目程序——数字猜谜游戏

在这个项目中,51单片机将随机生成一个数字,用户通过按键输入猜测的数字,单片机将显示提示信息(如“太高了”、“太低了”、“猜对了”),并通过LED灯显示结果。

项目需求:

  • 单片机:AT89S51
  • LED灯:4个(用于显示结果)
  • 按键:4个(用于输入数字 0-9)
  • 数码管:1个(用于显示提示信息)
  • 电阻:若干(用于限流)
  • 开关电源:5V

功能描述:

  1. 单片机生成一个1到100之间的随机数。
  2. 用户通过按键输入数字。
  3. 单片机通过数码管显示提示信息:“太高了”、“太低了”、“猜对了”。
  4. 当用户猜对时,LED灯会亮起表示胜利。

硬件连接:

  • LED灯:连接到P1口的P1.0、P1.1、P1.2、P1.3引脚。
  • 按键:连接到P2口的P2.0到P2.3引脚,分别对应数字0到3。
  • 数码管:连接到P0口,用于显示提示信息。

软件设计:

以下是实现上述功能的C语言程序示例:

#include <reg51.h>
#include <stdlib.h>

// 定义LED端口
sbit LED1 = P1^0;
sbit LED2 = P1^1;
sbit LED3 = P1^2;
sbit LED4 = P1^3;

// 定义按键端口
sbit Key0 = P2^0;
sbit Key1 = P2^1;
sbit Key2 = P2^2;
sbit Key3 = P2^3;

// 定义数码管段码
unsigned char seg7[] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90};

// 延时函数
void delay(unsigned int ms) {
    unsigned int i, j;
    for(i=0; i<ms; i++)
        for(j=0; j<123; j++);
}

// 显示数码管
void displayDigit(unsigned char digit) {
    P0 = seg7[digit];
}

// 初始化LED和按键
void init() {
    LED1 = 0;
    LED2 = 0;
    LED3 = 0;
    LED4 = 0;
    P2 = 0xFF; // 设置按键为输入模式
}

// 读取按键输入
unsigned char readKey() {
    if (!Key0) return 0;
    if (!Key1) return 1;
    if (!Key2) return 2;
    if (!Key3) return 3;
    return 10; // 默认值,表示没有按键被按下
}

// 主函数
void main() {
    unsigned char guess, target;
    unsigned char input = 0;
    unsigned char state = 0; // 0: 游戏未开始,1: 游戏进行中,2: 游戏结束

    init();

    while (1) {
        if (state == 0) {
            // 生成随机数
            target = rand() % 100 + 1;
            state = 1;
            displayDigit(0); // 显示初始提示
        } else if (state == 1) {
            guess = readKey();
            if (guess != 10) {
                input = input * 10 + guess;
                displayDigit(input % 10);
                delay(500);

                if (input >= 100) {
                    if (input > target) {
                        displayDigit(8); // 显示“太高了”
                        delay(500);
                        input = 0;
                    } else if (input < target) {
                        displayDigit(9); // 显示“太低了”
                        delay(500);
                        input = 0;
                    } else {
                        displayDigit(7); // 显示“猜对了”
                        LED1 = 1;
                        LED2 = 1;
                        LED3 = 1;
                        LED4 = 1;
                        delay(1000);
                        input = 0;
                        state = 0;
                    }
                }
            }
        }
    }
}

注意事项:

  1. 随机数生成rand() 函数在51单片机中可能需要自己实现或使用外部库。
  2. 按键去抖:按键读取时需要考虑去抖动处理,可以使用软件延时或硬件RC电路。
  3. 数码管段码seg7 数组定义了0到9的数码管段码,可以根据实际使用的数码管进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值