在这个项目中,51单片机将随机生成一个数字,用户通过按键输入猜测的数字,单片机将显示提示信息(如“太高了”、“太低了”、“猜对了”),并通过LED灯显示结果。
项目需求:
- 单片机:AT89S51
- LED灯:4个(用于显示结果)
- 按键:4个(用于输入数字 0-9)
- 数码管:1个(用于显示提示信息)
- 电阻:若干(用于限流)
- 开关电源:5V
功能描述:
- 单片机生成一个1到100之间的随机数。
- 用户通过按键输入数字。
- 单片机通过数码管显示提示信息:“太高了”、“太低了”、“猜对了”。
- 当用户猜对时,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;
}
}
}
}
}
}
注意事项:
- 随机数生成:
rand()
函数在51单片机中可能需要自己实现或使用外部库。 - 按键去抖:按键读取时需要考虑去抖动处理,可以使用软件延时或硬件RC电路。
- 数码管段码:
seg7
数组定义了0到9的数码管段码,可以根据实际使用的数码管进行调整。