• ADC和RTC的寄存器的读取


    ADC的寄存器读取,
    int adc_read(void)
    {
    int result;

    #if ADSTART==0
    result = ADC.ADCDAT0&0x3ff;

    while(!(ADC.ADCCON&(0x1<<15)))
    {
    }
    #elif ADSTART==1
    while(!(ADC.ADCCON&(0x1<<15)))
    {
    }

    result = ADC.ADCDAT0&0x3ff;
    #endif

    return 3300/0x3ff*result;
    }
    #endif
    **************************************
    void niuniu(void)
    {
    uart_init();
    adc_init();
    beeper_init();

    adc_read();

    while(1)
    {
    itoa(adc_read());
    if(adc_read() > 2500)
    {
    beeper_on();
    }
    else
    {
    beeper_off();
    }
    delay(10000);
    }
    }
    #endif
    **********************************
    ADC的寄存器读取出来就是Int型的十进制。,有小数所以转化为上千。
    为了打印出来所以用了itoa,比较的时候不要住转化为字符串adc_read() > 2500;
    而RTC中寄存器存的时候就用16进制,atoh字符串转化为int型16进制,我们平时用的时间比入22:19:54 就是十进制的表示,我说数字不是说他的进位,我们设置时间的两种方式:
    方法1: char time[]={0x22,0x19,0x54};
    char time[]={34,25,84};
    方法2: 利用串口,timeset 22:19:54(把字符串利用strtok切割出来放到time中)
    time[0] = atoh(p[1]);
    time[1] = atoh(p[2]);
    time[2] = atoh(p[3]);
    time[3] = atoh(p[4]);
    time[4] = atoh(p[5]);
    time[5] = atoh(p[6]);
    time[6] = atoh(p[7]);
    atoh函数看上去把字符串转化为Int型的16进制,实际不是
    int atoh(char *p)
    {
    int sum = 0;

    while(*p != '')
    {
    sum = sum*16+*p++-'0';
    }

    return sum;
    }
    举例:
    字符串14(后边有一个)
    sum=0*16+’1’(字符1的ASCII码)-'0'( 字符0的ASCII码60)
    *p++ 变为4(指的是字符4)
    sum=1*16+‘4’-‘0’=20
    atoh函数,作用你自己脑子想的10进制数14时写成字符1和字符4,利用atoh函数,脑子里想的10进制的14是十进制的20.因为你没有加0x,所以只能写成10进制。其实BCD只是2进制一种编码方式,不是16进制,而我们的寄存里存16进制,我们必须把16进制转化为10进制数(也可以直接16进制赋值,必须加0x),不加0x给寄存器,这只是给寄存器赋值,怎么赋值无所谓,只是寄存器中存的是16进制,而我们从寄存器中读数,
    void rtc_display(void)
    {
    puts(" ");
    htoa(RTC.BCDYEAR);
    putc('-');
    htoa(RTC.BCDMON);
    putc('-');
    htoa(RTC.BCDDATE);
    putc(' ');
    htoa(RTC.BCDDAY);
    putc(' ');
    htoa(RTC.BCDHOUR);
    putc(':');
    htoa(RTC.BCDMIN);
    putc(':');
    htoa(RTC.BCDSEC);
    }
    我们从寄存器里读出来的数是Int型的16进制,我们利用htoa进行转化,
    void htoa(int h)
    {
    putc(h/16+48);
    putc(h%16+48);
    }
    这个函数比如20(没有加ox,但是他是16进制),我们想要打印出来,必须化为字符,20/16+48,=1 (对应的字符‘0’)
    20%16=4,+48,对应字符4
    所以寄存器里还是存的十进制。
    *************************************
    RTC
    应用层
    void niuniu(void)
    {
    int time[7];
    char buf[32], *p[9];
    int i;

    uart_init();

    while(1)
    {
    puts(" rtc> ");
    gets(buf);
    buf[strlen(buf)-2] = '';
    p[0] = strtok(buf, " ");
    for(i=1; p[i-1]!=NULL; i++)
    {
    p[i] = strtok(NULL, " ");
    }

    if(strcmp(p[0], "timeset") == 0)
    {
    time[0] = atoh(p[1]);
    time[1] = atoh(p[2]);
    time[2] = atoh(p[3]);
    time[3] = atoh(p[4]);
    time[4] = atoh(p[5]);
    time[5] = atoh(p[6]);
    time[6] = atoh(p[7]);
    rtc_init(time);
    }

    if(strcmp(p[0], "time") == 0)
    {
    rtc_display();
    }
    }
    }
    **********************************************
    void rtc_init(int *t)
    {
    RTC.RTCCON = 0x1;
    RTC.BCDYEAR = t[0];
    RTC.BCDMON = t[1];
    RTC.BCDDATE = t[2];
    RTC.BCDDAY = t[3];
    RTC.BCDHOUR = t[4];
    RTC.BCDMIN = t[5];
    RTC.BCDSEC = t[6];
    RTC.RTCCON = 0x0;
    }

    void rtc_display(void)
    {
    puts(" ");
    htoa(RTC.BCDYEAR);
    putc('-');
    htoa(RTC.BCDMON);
    putc('-');
    htoa(RTC.BCDDATE);
    putc(' ');
    htoa(RTC.BCDDAY);
    putc(' ');
    htoa(RTC.BCDHOUR);
    putc(':');
    htoa(RTC.BCDMIN);
    putc(':');
    htoa(RTC.BCDSEC);
    }
    #endif
    *********************************
    #if STRING==1
    void itoa(int i)
    {
    putc(i/1000+48);
    putc(i%1000/100+48);
    putc(i%100/10+48);
    putc(i%10+48);
    puts(" ");
    }

    void htoa(int h)
    {
    putc(h/16+48);
    putc(h%16+48);
    }

    int atoh(char *p)
    {
    int sum = 0;

    while(*p != '')
    {
    sum = sum*16+*p++-'0';
    }

    return sum;
    }
    举例:
    字符串14(后边有一个)
    sum=0*16+’1’(字符1的ASCII码)-'0'( 字符0的ASCII码60)
    *p++ 变为4(指的是字符4)
    sum=1*16+‘4’-‘0’=20
    #endif
    ***********************************

  • 相关阅读:
    java中引用数据类型Scanner类和Random类的使用-0509
    java中运算符的理解-0509
    MySQL-ER图
    MySQL-习题
    《大型网站技术架构:核心原理与案例分析》笔记
    rabbitmq php测试使用
    gearman管理工具GearmanManager的安装与使用
    让PHP7达到最高性能的几个Tips
    linux下查看最消耗CPU、内存的进程
    Gearman分布式任务处理系统
  • 原文地址:https://www.cnblogs.com/coding4/p/5604779.html
Copyright © 2020-2023  润新知