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编程,实现上述功能,求出数列之和,但只需要显示数列和的整数部分,两位BCD数码管按十进制方式显示,用一个延时函数,一个中断函数,一个显示函数,一个main函数实现
时间: 2024-03-26 12:34:12 浏览: 72
314-用计数器T1的中断控制蜂鸣器发出1KHz音频(51单片机C语言实例Proteus仿真和代码)
5星 · 资源好评率100%
以下是代码实现:
```c
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit D1=P1^0; // D1数码管连接的P1.0引脚
sbit D2=P1^1; // D2数码管连接的P1.1引脚
sbit KEY=P3^2; // 按键连接的P3.2引脚
uint fibonacci(uint n); // 斐波那契数列求和函数
void delay(uint x); // 延时函数
void display(uint num); // 数码管显示函数
void main()
{
uint sum=0; // 数列和
uchar i=5; // 默认求前5项
KEY=1; // 初始化按键状态
while(1)
{
if(!KEY) // 按键按下
{
delay(5); // 延时去抖动
if(!KEY) // 确认按键按下
{
i+=5; // 每次增加5项
if(i>20) // 求和至20项后重新从5项开始
{
i=5;
}
sum=fibonacci(i); // 求和
display(sum/10); // 显示十位
D2=0; // 关闭D2数码管
delay(10); // 短暂延时
display(sum%10); // 显示个位
D1=0; // 关闭D1数码管
}
while(!KEY); // 等待按键释放
}
}
}
uint fibonacci(uint n)
{
uint a=1, b=1, c=0, i;
for(i=3; i<=n; i++)
{
c=a+b;
a=b;
b=c;
}
return c;
}
void delay(uint x)
{
uint i, j;
for(i=0; i<x; i++)
{
for(j=0; j<120; j++);
}
}
void display(uint num)
{
uchar code table[]={0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90}; // BCD码表
if(num>9) // 超出范围
{
num=0; // 显示0
}
P0=table[num]; // 显示BCD码
}
```
程序的主要思路是:通过按键控制求和项数,求出斐波那契数列的和,然后将和的十位和个位分别显示在两个BCD数码管上。
程序中的delay函数是一个简单的延时函数,用于去抖动和显示时的短暂延时。display函数接收一个整数,并将其转换为BCD码显示在数码管上。fibonacci函数用于求斐波那契数列的和,其中n表示求和项数。
需要注意的是,由于题目要求只显示数列和的整数部分,因此在display函数中需要进行判断和限制,确保显示的数值在0到9之间。
另外,程序中使用了中断函数来处理按键,但由于题目并没有要求中断处理,因此这里没有给出中断函数的实现。如果需要实现中断处理,可以在程序中添加中断函数并在主函数中开启中断。
阅读全文