某班有20名同学,他们的英语成绩(满分100分)存放在单片机片外RAM中,编程实现求最高成绩和最低成绩,分别存放在变量Grade_max和Grade_min中。 2. (14分)电路图如图所示,当S1断开时,数码管显示最高成绩(Grade_max),当S1闭合时,显示最低成绩(Grade_min)。数码管为共阳极,显示的成绩为十进制数。编制程序实现要求的功能。共阳极数码管的0-9的段码值分别为:0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8, 0x80, 0x90。51单片机实现
时间: 2024-04-20 17:24:08 浏览: 121
根据你的要求,编写了下面的代码来实现求最高成绩和最低成绩,并将结果显示在共阳极数码管上。代码中使用了位选和段选的方式来驱动数码管显示。
```c
#include <reg52.h>
#define DISPLAY_PORT P0
sbit S1 = P3^0;
sbit S2 = P3^1;
sbit S3 = P3^2;
sbit S4 = P3^3;
unsigned char code SEGMENT_TABLE[] = {
0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90
};
unsigned char code SCORES[] = {
// 存放学生的成绩,按照学生的顺序依次存放
// 这里只是示例,实际情况需要根据实际的数据进行修改
90, 85, 92, 78, 80,
95, 88, 75, 82, 87,
93, 70, 84, 89, 91,
76, 83, 79, 86, 94
};
unsigned char Grade_max = 0; // 最高成绩
unsigned char Grade_min = 100; // 最低成绩
void delay(unsigned int time)
{
unsigned int i, j;
for(i = 0; i < time; i++)
for(j = 0; j < 120; j++); // 延时函数,根据实际情况调整
}
void display(unsigned char value)
{
DISPLAY_PORT = SEGMENT_TABLE[value % 10]; // 个位
S1 = 1; S2 = 0; S3 = 0; S4 = 0;
delay(5);
DISPLAY_PORT = SEGMENT_TABLE[value / 10 % 10]; // 十位
S1 = 0; S2 = 1; S3 = 0; S4 = 0;
delay(5);
}
void main()
{
unsigned char i;
// 求最高成绩和最低成绩
for(i = 0; i < 20; i++)
{
if(SCORES[i] > Grade_max)
Grade_max = SCORES[i];
if(SCORES[i] < Grade_min)
Grade_min = SCORES[i];
}
while(1)
{
if(S1 == 0) // 当S1断开时显示最高成绩
{
display(Grade_max);
}
else // 当S1闭合时显示最低成绩
{
display(Grade_min);
}
}
}
```
在这段代码中,我们先通过循环遍历所有学生的成绩,求得最高成绩和最低成绩。然后,在主循环中,根据S1引脚的状态来切换显示最高成绩和最低成绩。
通过位选和段选的方式,将需要显示的数码管段码值依次输出到P0口,并通过设置S1-S4引脚的状态来选择要显示的位数(个位和十位)。通过适当的延时函数,实现数码管的动态显示。
请注意,以上代码中的SCORES数组只是示例,实际情况中需要根据实际的数据进行修改。另外,具体的延时时间需要根据实际需求和硬件电路的特性进行调整。以上代码仅供参考,具体实现需要根据具体的硬件电路来确定。
阅读全文