allright
V2EX  ›  C

大家帮我看看这段代码是什么意思!

  •  
  •   allright · May 7, 2017 · 3348 views
    This topic created in 3299 days ago, the information mentioned may be changed or developed.

    temp1=(TH1256+TL1); sum1=sum1+temp1-getdat1[point1]; getdat1[point1]=temp1; point1++; point1=point1%10; tmp=sum1/10; if(tmp<10)tmp=tmp; else if(tmp<32&&tmp>=10)tmp=20-10(32-tmp)/(32-10); else if(tmp<50&&tmp>=32)tmp=30-10*(50-tmp)/(50-32); else if(tmp<67&&tmp>=50)tmp=40-10*(67-tmp)/(67-50); else if(tmp<90&&tmp>=67)tmp=50-10*(90-tmp)/(90-67); else if(tmp<100&&tmp>=90)tmp=60-10*(100-tmp)/(100-90); else if(tmp<120&&tmp>=100)tmp=70-10*(120-tmp)/(120-100); else if(tmp<140&&tmp>=120)tmp=80-10*(140-tmp)/(140-120); else if(tmp<160&&tmp>=140)tmp=90-10*(160-tmp)/(160-140); else if(tmp<170&&tmp>=160)tmp=100-10*(170-tmp)/(170-160); else if(tmp<186&&tmp>=170)tmp=110-10*(186-tmp)/(186-170); else if(tmp<216&&tmp>=186)tmp=120-10*(216-tmp)/(216-186); else if(tmp<228&&tmp>=216)tmp=130-10*(228-tmp)/(228-216); else if(tmp<246&&tmp>=228)tmp=140-10*(246-tmp)/(246-228); else if(tmp<250&&tmp>=246)tmp=150-10*(250-tmp)/(250-246); else if(tmp<289&&tmp>=250)tmp=160-10*(289-tmp)/(289-250); else if(tmp<600&&tmp>=289)tmp=300-140.0*311/(600-tmp); else if(tmp>=600)tmp=300;

    17 replies    2017-05-07 22:03:48 +08:00
    MrFireAwayH
        1
    MrFireAwayH  
       May 7, 2017 via Android
    格式惨不忍睹……

    大概是在进行某种加密算法吧
    lechain
        2
    lechain  
       May 7, 2017 via Android
    应用了某个分段函数对数据进行了处理,里面的数学函数你可以花点时间提取出来的
    daimao
        3
    daimao  
       May 7, 2017 via iPhone
    这不就是分段函数吗
    mmnsghgn
        4
    mmnsghgn  
       May 7, 2017
    Kilerd
        5
    Kilerd  
       May 7, 2017
    V2EX 第 217841 号会员,加入于 2017-02-27 22:45:30 +08:00
    AltairT
        6
    AltairT  
       May 7, 2017
    前面看起来使用 sum1 累积总的变化量,后面是根据数值大小进行修正.但是为什么要除以 10 得到 tmp 再进行修正呢?
    allright
        7
    allright  
    OP
       May 7, 2017   ❤️ 1
    #include<reg52.h>
    #include "LCD1602.h"
    #include "DS18B20.h" //头文件
    #include<intrins.h>
    #define uchar unsigned char
    #define uint unsigned int
    #define ulong unsigned long
    sbit bobao=P2^3;
    sbit key=P3^2;

    sbit back=P2^0;


    uchar data Test[16]=" sudu:00.0m/s "; //液晶显示数据
    uchar data tabt[16]=" wendu:00.0C "; //液晶显示数据
    ulong tmp;
    bit nn;
    uchar i;
    int wendu;
    long sum1=0;
    uint temp1;
    uchar point1;
    uint xdata getdat1[50];
    int xianshi;
    char moshi;
    int min,max;
    long tt;
    int sec;

    //显示函数
    void display()
    {

    /* tabt[0]=sec/100+'0';
    tabt[1]=sec%100/10+'0';
    tabt[2]=sec%10+'0';
    */
    tabt[9]=wendu/100+'0';
    tabt[10]=wendu%100/10+'0';
    tabt[12]=wendu%10+'0';
    ShowString(0,Test); //显示第一行
    ShowString(1,tabt); //显示第 2 行
    }

    //T0 定时中断,晶振 24M

    void T0_int(void) interrupt 1
    {
    static uint counter=0;
    TH0 = 0x63;
    TL0 = 0x0C0;
    if(counter++==25)
    {
    counter=0;
    temp1=(TH1*256+TL1);
    sum1=sum1+temp1-getdat1[point1];
    getdat1[point1]=temp1;
    point1++;
    point1=point1%10;
    tmp=sum1/10;
    if(tmp<10)tmp=tmp;
    else if(tmp<32&&tmp>=10)tmp=20-10*(32-tmp)/(32-10);
    else if(tmp<50&&tmp>=32)tmp=30-10*(50-tmp)/(50-32);
    else if(tmp<67&&tmp>=50)tmp=40-10*(67-tmp)/(67-50);
    else if(tmp<90&&tmp>=67)tmp=50-10*(90-tmp)/(90-67);
    else if(tmp<100&&tmp>=90)tmp=60-10*(100-tmp)/(100-90);
    else if(tmp<120&&tmp>=100)tmp=70-10*(120-tmp)/(120-100);
    else if(tmp<140&&tmp>=120)tmp=80-10*(140-tmp)/(140-120);
    else if(tmp<160&&tmp>=140)tmp=90-10*(160-tmp)/(160-140);
    else if(tmp<170&&tmp>=160)tmp=100-10*(170-tmp)/(170-160);
    else if(tmp<186&&tmp>=170)tmp=110-10*(186-tmp)/(186-170);
    else if(tmp<216&&tmp>=186)tmp=120-10*(216-tmp)/(216-186);
    else if(tmp<228&&tmp>=216)tmp=130-10*(228-tmp)/(228-216);
    else if(tmp<246&&tmp>=228)tmp=140-10*(246-tmp)/(246-228);
    else if(tmp<250&&tmp>=246)tmp=150-10*(250-tmp)/(250-246);
    else if(tmp<289&&tmp>=250)tmp=160-10*(289-tmp)/(289-250);
    else if(tmp<600&&tmp>=289)tmp=300-140.0*311/(600-tmp);
    else if(tmp>=600)tmp=300;
    if(moshi==0)
    {
    xianshi=tmp;
    }
    else if(moshi==1)
    {
    if(tmp>max)
    {
    xianshi=max=tmp;
    }
    }
    else if(moshi==2)
    {
    if(tmp<min)
    {
    xianshi=min=tmp;
    }
    }
    Test[7]=xianshi/100+'0';
    Test[8]=xianshi%100/10+'0';
    Test[10]=xianshi%10+'0';
    if(xianshi>0)tt=0;
    TH1=TL1=0;
    }
    }
    void int0(void) interrupt 0
    {
    if(key==0)
    {
    DelayMs(5);
    if(key==0)
    {
    while(key==0);
    moshi++;
    if(moshi>2)moshi=0;
    if(moshi==0)
    {
    Test[2]='s';
    Test[3]='u';
    Test[4]='d';
    Test[5]='u';
    }
    else if(moshi==1)
    {
    Test[2]=' ';
    Test[3]='m';
    Test[4]='a';
    Test[5]='x';
    max=xianshi;
    }
    else if(moshi==2)
    {
    Test[2]=' ';
    Test[3]='m';
    Test[4]='i';
    Test[5]='n';
    min=xianshi;
    }

    }
    }
    tt=0;
    }
    void main(void)
    {
    for(i=0;i<50;i++)getdat1[i]=0;
    TMOD = 0x51;/*01010001 T1 计数,T0 定时*/
    TH1 = 0;
    TL1 = 0;
    TH0=0x3c;
    TL0=0xb0;
    TR0 = 1; //开定时器 0
    TR1 = 1; //启动计时器 1
    EA = 1; //开总中断
    ET0 = 1; //开定时器 0 中断
    ET1 = 1; //开定时器 0 中断
    PT0=1; //定时器 0 优先级高
    IT0=1;
    EX0=1;

    InitLcd(); //液晶初始化
    DelayMs(25); //延时函数
    back=0;
    while(1)
    {
    wendu=ReadTemperature()/10;
    display();
    tt++;
    if(tt>2100)
    {
    tt=2100;
    WriteCommand(0x01);
    back=1;
    while(tt==2100) ;
    back=0;
    }
    }

    }


    它的完整程序是这样的,是一个用计频率的方法测风速。
    kokutou
        8
    kokutou  
       May 7, 2017
    感觉是防抖吧。。
    现实中温度不会剧烈变化,但是温度传感器读取的值会不停上下抖动。
    这段应该是去抖动的。
    Hconk
        9
    Hconk  
       May 7, 2017 via Android
    @AltairT 51 单片机的程序,用 1602 显示,可能是液晶显示的位数有限就除 10 舍掉一位。
    ijustdo
        10
    ijustdo  
       May 7, 2017   ❤️ 1
    告诉你吧 虽然没有写过 但是能猜测出 你看看风力测试器 一个杆子上一个标一吹发生唯一 然后没风又还原
    风的速度不是匀速的 呵呵呵
    基本就是风把他吹到发生位置片以后 他有他弹性自动复位初始位置
    所以在一定的频率内他的位移不是匀速的 是个角速度性质的加速度

    估计这个差不多就是 把风力测试器的位移速度转换为真实风速的一段了 。。。。
    ijustdo
        11
    ijustdo  
       May 7, 2017
    所以你要搞清楚这段代码 最快捷的方法是 找到原始的开发者
    第二科学快捷的方法是 找这段代码用到的地方的传感器硬件 然后找硬件的 pdf 和原理

    原来我的通假字吧 我笔记本装的语音输入法
    ijustdo
        12
    ijustdo  
       May 7, 2017
    不懂原理或者不懂代码运行环境的写代码 都是耍流氓
    mdzz
        13
    mdzz  
       May 7, 2017
    https://ooo.0o0.ooo/2017/05/07/590ed1fdea2ce.png
    大概是这样的
    AltairT
        14
    AltairT  
       May 7, 2017 via iPhone
    @Hconk 51 还是大学时用过😅怪不得前面有 Th*256 + Tl
    allright
        15
    allright  
    OP
       May 7, 2017
    感谢大神,好人一生平安!
    allright
        16
    allright  
    OP
       May 7, 2017
    @mdzz 万分感谢!
    allright
        17
    allright  
    OP
       May 7, 2017
    @ijustdo 感谢大神,好人一生平安!
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   1035 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 48ms · UTC 19:13 · PVG 03:13 · LAX 12:13 · JFK 15:13
    ♥ Do have faith in what you're doing.