特殊数据获取(模块化程序设计)

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int IsHuiwen(int number)
{
    int temp;
    int sum=0;
    temp=number;
    while(number)
    {
        sum=sum*10+number%10;
        number=number/10;
    }
    if(temp==sum)
    {
        return 1;
    }
    return 0;
}
void huiwen(const int n)
{
    int i;
    for(i=1;i<n;i++)
    {
        if(IsHuiwen(i))
        {
            printf("%d\n",i);
        }
    }
}
int IsSu(const int s)
{
    int i;
    if (s<2)
    {
        return 0;
    }
    for(i=2;i<=sqrt(s);i++) 
    {
        if(s%i==0)
        {
            return 0;
        }
    }
    return 1;
}
void su(const int n)
{
    int i;
    for(i=1;i<=n;i++)
    {
        if(IsSu(i))
        {
            printf("%d\n",i);
        }
    }
}
int Qinmi(const int n)
{
    int x,y,temp,i;
    for (x=1;x<n;x++)
    {
        for(y=0,i=1;i<=x/2;i++) 
        {
            if(!(x%i)) 
            {
                y=y+i;
            }
        }
        for(temp=0,i=1;i<=y/2;i++) 
        {
            if(!(y%i))
            {
                temp=temp+i;
            }
        }
        if(temp==x&&x<y) {
            printf("%d %d\n",x,y);
        }
    }
    return 0;
}
int Shuixianhua(int n)
{
    int j,x,y,z;
    if (n>1000)
    {
        n=1000;
    }
    if(n<100)
    {
        return 0;
    }
    j=100;
    while(j<n)
    {
        x=j/100;
        y=j/10%10;
        z=j%10;
        if(j==x*x*x+y*y*y+z*z*z)
        {
            printf("%d\n", j);
        }
        j++;
    }
}
int main()
{
    int max;
    int t;
    while(1)
    {
        printf("范围:");
        scanf("%d", &max);
        printf("0.退出\n1.回文数\n2.素数\n3.亲密数\n4.水仙花数\n");
        scanf("%d", &t);
        printf("\n");
        switch (t) {
        case 0:
            exit(0);
            break;
        case 1:
            huiwen(max);
            break;
        case 2:
            su(max);
            break;
        case 3:
            Qinmi(max);
            break;
        case 4:
            Shuixianhua(max);
            break;
        }
    }
    return 0;
}

运行结果:
这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
工业生产过程中常常需要对温度、湿度、压力、流量等各种工艺参数随时进行检测和监 控,同时还要将检测到的数据及时传递给上位机,以实现对参数的随机查询,对信息的 存储与处理,及时调整控制方案,提高生产效率和产品质量。为此,笔者以89C51单片机 作为主控制器设计了一种简单易行的远程数据采集系统。 1 系统硬件电路的设计   远程数据采集系统框图,由两部分组成:一是基于89C51实现的现场数据采集电路, 二是PC机与89C51之间的远程通讯电路。 1.1 89C51数据采集系统 数据采集系统的硬件原理如图1所示。   该系统选用89C51单片机作为主控制器,此芯片与8051完全兼容,且内部带有4 KB闪速可编程、可擦除PEROM,工作时钟可高达24 MHz。   MAX691主要用来实现掉电保护,同时起到"看门狗"的作用。系统电源突然断电时, MAX691PF0端及时向89C51INT0申请中断,保护采集的数据不丢失。若软件执行中出现故 障,89C51P3.2经一定时间间隔没有脉冲输出时,MAX691将起"看门狗"的作用,使RST复 位有效,重新启动系统。   数据存储器6116主要作为数据传输的缓冲,显示电路由8155完成,PA口作键盘输入 ,PB口作字形显示,PC口作控制线用。8155内部256 BRAM用于存放8通道采集到的原始数据。      数据采集与转换由12位A/D转换器ICL7109来完成。7109是高精度、低噪声、低漂移的双 积分模数转换器,其内部带14位锁存器和14位三态输出寄存器,具有较强的接口处理能 力。设定7109为直接接口方式。这种工作方式下,7109可连续进行数据的转换,转换结 束时由STATUS发出转换结束信号送至单片机INT0请求中断。89C51将转换后的数据分两次 先低8位后高4位读取。为了实现对8个通道的参数测量,同时尽量降低成本,简化系统配 置,设计了利用模拟多路开关CD4051进行通道的切换,共用一片7109由89C51控制,分时 完成所有通道的采样与转换。 1.2 远程通讯电路   由于是远程数据采集系统,对数据传输的距离提出了较高的要求。PC机与单片机23 2C串行口直接相连,传输距离只有十几米,无法满足系统要求。为此采用了一个RS232C 到RS422A的转换装置,PC机与89C51间接相连,以RS422A方式进行通讯,大大增加了传输 距离。   PC机与89C51串行通讯电路框图如图2所示。   RS422A是一种以平衡方式传输的标准,可双端发送、双端接收。发送端和接收端分 别采用平衡发送及差动接收。通过前者把逻辑电平变成电位差,完成始端信息传送;通 过后者把电位差变成逻辑电平,完成终端信息接收。并且RS422A采用双线传输,大大提 高了抗干扰能力。最大传输速率可达10 Mb/s(传输距离15 m时),传输速率降至90 kb/s时,最大传输距离可达1200 m,这能充分满足系统的"远程"要求。 2 软件设计   软件设计采用模块化程序设计方法,按功能分为4个模块,其中数据通信模块又分为 单片机串行通信程序和PC机通信程序,除与PC机通信程序使用VC++编程,其余均采用 汇编语言编制。 2.1 主程序模块   主程序主要完成对系统硬件电路的初始化,设置堆栈指针、串行口、T0、T1工作方 式、8155显示指示符,扫描键盘获取键值并进行散转处理。主程序模块负责管理和调用 各子模块。      2.2 数据采集模块   该模块完成对数据的采集及处理,中间调用了数字滤波子程序、数据转换子程序、 字形转换及显示子程序等。 系统数据采样模块框图如图3所示。      系统上电即执行初始化程序。当操作员按下采样键时执行数据采样模块。从00~07 通道间隔每秒采集每个通道的5个值,调用滤波子程序得到准确值,再通过数据转换子程 序分别送到6116数据区及8155RAM区,通过字形显示子程序显示各通道检测的数据。每采 集完一个周期后,89C51单片机通过 MAX232接口PC机查询有无通信命令,有则响应,无则继续采集数据。该程序一直按框图 流程循环执行,直至意外掉电或强迫复位后,才能终止数据采集。 2.3 故障诊断模块   数据采集过程中,若出现故障会直接影响采样结果,所得到的错误数据不允许存档 ,并应该记录故障原因及持续时间。故障诊断模块主要是89C51外围芯片 MAX691的电源监控以及掉电保护电路检测到硬件故障后向单片机发出中断请求INT0所执 行的外部中断服务子程序。该程序主要功能是在累加数据保存完毕后,置位89C51内部的 特殊功能寄存器PCON中的PD,使RAM进入掉电模式,保护数据不变,同时显示故障类型和 发生的时间。若为软件死循环引起的故障,则MAX691的"看门狗"电路自动使程序跳出陷 阱

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值