51单片机C语言数列求和,已知数列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编程,实现上述功能,求出数列之和,但只需要显示数列和的整数部分,两位BCD数码管按十进制方式显示。
时间: 2024-03-27 07:39:29 浏览: 7
以下是根据您的要求编写的代码:
```c
#include <reg51.h>
#define N 20
unsigned char flag = 0, sumnum = 5;
unsigned long sum = 0;
unsigned long puf[N];
void disp(void);
void init(void);
void Array_gen(unsigned long *puf);
void Sum_fanction(unsigned long *puf, unsigned char sumnum);
void main() {
init();
Array_gen(puf);
while (1) {
Sum_fanction(puf, sumnum);
disp();
}
}
void disp(void) {
unsigned char j;
j = sum / 10;
P1 = (j << 4) | (sum % 10);
}
void init(void) {
IT0 = 1;
EX0 = 1;
EA = 1;
}
void init0(void) interrupt 0 {
flag++;
if (flag == 4) {
flag = 0;
sumnum = 5;
} else if (flag == 3) {
sumnum = 20;
} else if (flag == 2) {
sumnum = 10;
}
}
void Array_gen(unsigned long *puf) {
unsigned char i;
unsigned long fenzi = 1, temp = 0, fenmu = 1;
for (i = 0; i < N; i++) {
puf[i] = (128 * fenzi) / fenmu;
fenmu = fenzi;
fenzi = fenzi + temp;
temp = fenmu;
}
}
void Sum_fanction(unsigned long *puf, unsigned char sumnum) {
unsigned char i;
sum = 0;
for (i = 0; i < sumnum; i++) {
sum += puf[i];
}
}
```
代码中,`disp()` 函数用于在 P1 口连接的两个 BCD 数码管上显示数列和的整数部分;`init()` 函数用于初始化外部中断0引脚;`init0()` 函数是外部中断0的中断服务函数,根据按键的不同次数设置 `sumnum` 的值;`Array_gen()` 函数用于生成数列;`Sum_fanction()` 函数用于求数列的和。
根据题目中给出的数列,使用以下公式生成数列:$a_n=\dfrac{a_{n-1}+a_{n-2}}{a_{n-1}-a_{n-2}}$,其中 $a_1=1$,$a_2=2$。在 `Array_gen()` 函数中,使用了三个变量 `fenzi`、`temp` 和 `fenmu` 来计算数列中每一项的值。