单片机内部数据存储器中存放10个同学的成绩,数组为SZ[10]=[59,60,88,76,54,94,67,76,37,45},10名同 学的编号为0-9,编程完成以下功能: (1)上电后4位共阳极数码管动态显示第一个同学的编号和分数,左边第一位显示学生编号,第二位不 显示,后两位显示分数,显示内容如下“0 59”; 数码管为共阳极数码管,其0-9的段码表为{0xc0,0xf9,0xa4,0xb0,0x99, 0x92,0x82,0xf8,0x80,0x90}。 (2)有2个独立按键,按下S1按键后,数码管显示下一位同学的学号和成绩;按下S2按键时,数码管 显示上一位同学的学号和成绩; (3)当前同学的成绩大于等于60分时,绿色发光二极管D1亮;当前同学的成绩小于60分时,红色发光 二极管D2亮。
时间: 2024-02-25 14:56:04 浏览: 162
编程序实现设有10个学生的成绩分别为85、62、64、79、82、99、100、78、88、86,试编制一个子程序统计60~69分,70~79分 ,80~89分,90~99分及100分的人数,分别存放到S6,S7,S8,S9及S10单元中。
4星 · 用户满意度95%
以下是单片机的C语言代码实现:
```c
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code segment[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90}; // 数码管段码表
uchar code SZ[10] = {59,60,88,76,54,94,67,76,37,45}; // 10名同学的成绩
uchar num = 0; // 当前同学编号
uchar score = SZ[num]; // 当前同学成绩
bit flag = 0; // 标志位,用于判断是否需要更新数码管显示
void delay(uint t) // 延时函数
{
uint i, j;
for(i = t; i > 0; i--)
for(j = 110; j > 0; j--);
}
void display(uchar num, uchar score) // 数码管动态显示函数
{
uchar shiwei, gewei;
shiwei = score / 10; // 十位数
gewei = score % 10; // 个位数
P2 = 0xff; // 关闭所有数码管
P0 = segment[num]; // 显示学生编号
P2 = 0xfe; // 第一位数码管显示
P0 = segment[shiwei]; // 显示十位数
delay(5); // 延时
P2 = 0xfd; // 第二位数码管显示(不显示)
delay(5); // 延时
P2 = 0xfb; // 第三位数码管显示
P0 = segment[gewei]; // 显示个位数
delay(5); // 延时
}
void main()
{
P1 = 0xff; // 将P1口置高,使按键S1和S2为高电平
while(1)
{
if(flag == 0) // 如果不需要更新数码管显示,则跳过
continue;
display(num, score); // 数码管动态显示当前同学编号和成绩
flag = 0; // 标志位置0
}
}
// S1按键中断服务函数
void S1() interrupt 0
{
delay(10); // 消抖
if(P1_0 == 0) // 如果按键S1被按下
{
num++; // 当前同学编号加1
if(num >= 10) // 如果当前同学编号已经是9,则回到0
num = 0;
score = SZ[num]; // 更新当前同学成绩
flag = 1; // 标志位置1,需要更新数码管显示
if(score >= 60) // 如果当前同学成绩大于等于60分
P3 &= ~0x01; // 绿色发光二极管D1亮
else
P3 |= 0x01; // 绿色发光二极管D1灭
}
}
// S2按键中断服务函数
void S2() interrupt 2
{
delay(10); // 消抖
if(P1_2 == 0) // 如果按键S2被按下
{
if(num == 0) // 如果当前同学编号已经是0,则回到9
num = 9;
else
num--; // 否则当前同学编号减1
score = SZ[num]; // 更新当前同学成绩
flag = 1; // 标志位置1,需要更新数码管显示
if(score >= 60) // 如果当前同学成绩大于等于60分
P3 &= ~0x01; // 绿色发光二极管D1亮
else
P3 |= 0x01; // 绿色发光二极管D1灭
}
}
// 定义中断向量表
void Int0() interrupt 0
{
S1(); // 跳转到S1按键中断服务函数
}
void Int2() interrupt 2
{
S2(); // 跳转到S2按键中断服务函数
}
```
阅读全文