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)的操作。 利用keil5编程,实现上述功能,求出数列之和,但只需要显示数列和的整数部分,两位4位的BCD数码管按十进制方式显示,用一个延时函数,一个中断函数,一个显示函数,一个main函数实现
时间: 2024-03-26 19:34:40 浏览: 117
以下是代码实现:
```c
#include <reg51.h>
#define uint unsigned int
#define uchar unsigned char
uint fibonacci(uint n);
void delay(uint t);
void display(uint num);
uchar flag = 0;
void main()
{
EA = 1; // 全局中断使能
EX0 = 1; // 外部中断0使能
IT0 = 1; // 下降沿触发
while(1)
{
if(flag == 1)
{
uint sum = 0;
for(uint i = 1; i <= 5; i++)
{
sum += fibonacci(i);
}
display(sum);
flag = 0;
}
else if(flag == 2)
{
uint sum = 0;
for(uint i = 1; i <= 10; i++)
{
sum += fibonacci(i);
}
display(sum);
flag = 0;
}
else if(flag == 3)
{
uint sum = 0;
for(uint i = 1; i <= 20; i++)
{
sum += fibonacci(i);
}
display(sum);
flag = 0;
}
}
}
uint fibonacci(uint n)
{
if(n == 1 || n == 2)
{
return n-1;
}
else
{
return fibonacci(n-1) + fibonacci(n-2);
}
}
void delay(uint t)
{
while(t--);
}
void display(uint num)
{
uchar shiwei = num / 10;
uchar gewei = num % 10;
P1 = (shiwei << 4) | gewei;
delay(500);
P1 = 0x00;
delay(500);
}
void external0() interrupt 0
{
flag++;
if(flag > 3)
{
flag = 1;
}
delay(1000); // 消除按键抖动
}
```
其中,fibonacci()函数用于求斐波那契数列的第n项,delay()函数用于延时,display()函数用于将数字转换为BCD码并显示在数码管上,external0()函数是外部中断0的中断服务函数,用于切换计算数列的项数。
需要注意的是,由于数列求和的结果可能会超出两位数,因此在display()函数中只显示了数列和的整数部分,忽略了小数部分。如果需要完整的结果,可以使用浮点数计算,但需要注意单片机的运算速度和存储空间限制。
阅读全文