数列求和,已知数列1/1,2/1,3/2,5/3,8/5,…。51单片机P1口连接2个BCD数码管,分别显示十位和个位;外部中断0引脚连接按键, (1)按1下按键,求取数列前5项的和; (2)再按1下按键,求取数列前10项的和; (3)再按1下按键,求取数列前20项的和; (4)再次按下按键,恢复(1)的操作。 利用C51编程,实现上述功能,求出数列之和,但只需要显示数列和的整数部分,C语言实现
时间: 2024-03-27 09:35:35 浏览: 78
以下是一个实现该功能的C语言代码:
```c
#include <reg52.h> // 导入头文件
// 定义数列的前几项,可以根据需要扩展
float sequence[20] = {1.0, 2.0, 1.5, 1.66667, 1.6, 1.625, 1.61538, 1.61905, 1.61765, 1.61818,
1.61798, 1.61806, 1.61803, 1.61804, 1.61804, 1.61804, 1.61804, 1.61804, 1.61804};
int sum_index = 0; // 当前求和的数列项数
int sum = 0; // 数列和的整数部分
void main() {
EA = 1; // 启用全局中断
EX0 = 1; // 启用外部中断0
IT0 = 1; // 设置外部中断0为下降沿触发
while (1) {} // 主程序循环等待中断
}
void int0_isr() interrupt 0 { // 外部中断0的中断服务函数
sum_index += 5; // 每次按键增加5项
if (sum_index > 20) { // 如果超过了数列项数,重置为1
sum_index = 1;
}
sum = 0; // 每次计算前将sum清零
for (int i = 0; i < sum_index; i++) { // 计算数列前sum_index项的和
sum += (int)sequence[i];
}
P1 = sum / 10; // 显示十位
P0 = sum % 10; // 显示个位
}
```
该代码使用了51单片机的外部中断0来实现按键触发计算数列和的功能。按键每按一次,就会增加5项数列的求和,如果已经超过了20项,则会从头重新开始计算。在中断服务函数中,使用一个循环来计算数列前n项的和,然后将和的整数部分分别显示在P1口和P0口上。由于题目要求只显示整数部分,因此使用了强制类型转换将浮点数转换为整数。
阅读全文