C语言实现1、数列求和,已知数列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-25 10:35:40 浏览: 59
C语言程序设计-编程实现求数列1/2,3/4,5/8,9/32 的所有大于等于0.000001的数据项之和
5星 · 资源好评率100%
好的,根据您的要求,我来给您提供一个C语言的程序,实现数列求和并且控制BCD数码管显示:
```
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit key = P3^2; //定义按键P3.2
sbit LED1 = P1^4; //定义LED1口P1.4为输出口
sbit LED2 = P1^5; //定义LED2口P1.5为输出口
void delay(uint xms) //延时函数
{
uint i, j;
for (i = xms; i > 0; i--)
{
for (j = 110; j > 0; j--);
}
}
void init() //初始化函数
{
TMOD = 0x01; //定时器T0工作在模式1
TH0 = 0x4C; //设置定时器初值
TL0 = 0x00;
TR0 = 0; //停止定时器T0
ET0 = 1; //开启定时器T0的中断
EA = 1; //开启总中断
}
void main()
{
init();
while (1)
{
if (key == 0) //如果按键按下
{
delay(10); //延时去抖
if (key == 0) //再次判断按键是否按下
{
TR0 = 1; //启动定时器T0
while (!key); //等待按键松开
}
}
}
}
void T0_time() interrupt 1 //定时器T0的中断函数
{
static uchar n = 1; //定义静态变量n,表示数列中的第n项
static uchar flag = 0; //定义静态变量flag,表示当前求和的项数
static uchar sum = 0; //定义静态变量sum,表示数列的和
uchar temp; //定义临时变量
TR0 = 0; //停止定时器T0
TH0 = 0x4C; //重新设置定时器初值
TL0 = 0x00;
P1 = 0xFF; //清空数码管
if (n == 1) //如果是数列的第一项,则显示1
{
LED1 = 0;
LED2 = 1;
}
else
{
temp = sum / 10; //计算数列和的十位数
if (temp == 0) //如果十位数为0,则不显示
LED1 = 1;
else
{
LED1 = 0;
P1 = temp; //显示十位数
LED2 = 0; //点亮个位数码管
delay(5); //延时一段时间
}
temp = sum % 10; //计算数列和的个位数
P1 = temp; //显示个位数
LED2 = 1; //熄灭个位数码管
}
sum += n; //累加数列中的第n项
n++; //n加1
if (flag == 4) //如果求和的项数已经达到5项
{
sum = 0; //重置数列和
n = 1; //重置数列中的第n项
flag = 0; //重置求和的项数
}
else
flag++; //求和的项数加1
}
```
在这个程序中,我们使用了定时器T0来控制数列求和的过程,并且根据定时器的中断来控制BCD数码管的显示。具体来说,我们定义了一个静态变量n来表示数列中的第n项,flag来表示当前求和的项数,sum来表示数列的和。然后,在定时器T0的中断函数中,我们首先根据静态变量n来显示数列中的第n项,并且累加到数列和sum中,然后根据sum来控制BCD数码管的显示。最后,如果求和的项数已经达到5项,则重置数列和、数列中的第n项和求和的项数。
需要注意的是,在这个程序中我们使用了51单片机的定时器T0来控制数列求和的过程,所以需要进行一些初始化的设置。具体来说,我们将定时器T0设置为工作在模式1,然后设置定时器的初值为0x4C,这样定时器每隔1ms就会产生一次中断。在中断函数中,我们还需要重新设置定时器的初值,并且停止定时器的计数。
阅读全文