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 != '\0')
{
sum = sum*16+*p++-'0';
}

return sum;
}
举例:
字符串14(后边有一个\0)
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("\r\n");
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("\r\nrtc> ");
gets(buf);
buf[strlen(buf)-2] = '\0';
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("\r\n");
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("\r\n");
}

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

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

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

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

ADC和RTC的寄存器的读取的更多相关文章

  1. SAR ADC : 逐次逼近寄存器型(SAR)模数转换器(ADC)

    1.为实现二进制搜索算法,N位寄存器首先设置在中间刻度(即:100... .00,MSB设置为1).这样,DAC输出(VDAC)被设为VREF/2,VREF是提供给ADC的基准电压.然后,比较判断VI ...

  2. hwclock和date源码分析

    一. hwclock 1.1 hwclock源码在哪里? util-linux 或者busybox 1.2 获取源码 git clone https://github.com/karelzak/uti ...

  3. stm32寄存器版学习笔记07 ADC

    STM32F103RCT有3个ADC,12位主逼近型模拟数字转换器,有18个通道,可测量16个外部和2个内部信号源.各通道的A/D转换可以单次.连续.扫描或间断模式执行. 1.通道选择 stm32把A ...

  4. 痞子衡嵌入式:对比i.MXRT与LPC在RTC外设GPREG寄存器使用上的异同

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是对比i.MXRT与LPC在RTC外设GPREG寄存器使用上的异同. 本篇是 <在SBL项目实战中妙用i.MXRT1xxx里Syst ...

  5. STM32 ADC详细篇(基于HAL库)

    一.基础认识 ADC就是模数转换,即将模拟量转换为数字量 l  分辨率,读出的数据的长度,如8位就是最大值为255的意思,即范围[0,255],12位就是最大值为4096,即范围[0,4096] l  ...

  6. RTC实时时钟

    作者:宋老师,华清远见嵌入式学院讲师. 1.1 RTC介绍 在 一个嵌入式系统中,通常采用RTC 来提供可靠的系统时间,包括时分秒和年月日等,而且要求在系统处于关机状态下它也能够正常工作(通常采用后备 ...

  7. 重学STM32---(五)ADC

    这两天把外部中断和ADC看了下,个人感觉外部中断不是很难,也就没有把记下来了,毕竟写这个挺浪费时间.ADC是比较复杂的,如果想让完全自由的运用ADC必须经过多次实践可能才可以.由于已经学过库函数,也就 ...

  8. Linux驱动修炼之道-RTC子系统框架与源码分析【转】

    转自:http://helloyesyes.iteye.com/blog/1072433 努力成为linux kernel hacker的人李万鹏原创作品,为梦而战.转载请标明出处 http://bl ...

  9. linux rtc 接口【转】

    转自:http://blog.csdn.net/goldfighter/article/details/6126178 Linux操作系统内核对RTC的编程详解 转自: http://xenyinze ...

随机推荐

  1. 赵雅智_ListView_ArrayAdapter

    ArrayAdapter六种构造方法的作用 ArrayAdapter<T>(Context context, int textViewResourceId); 上下文,布局文件 Array ...

  2. Mysql数据库常用操作语句大全

    零.用户管理: 1.新建用户: >CREATE USER name IDENTIFIED BY 'ssapdrow'; 2.更改密码: >SET PASSWORD FOR name=PAS ...

  3. 001-shell基础,创建,运行

    一.概述 Shell 是一个用 C 语言编写的程序.Shell 既是一种命令语言,又是一种程序设计语言. Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服 ...

  4. Pytorch permute,contiguous

    permute(dims),常用的维度转换方法 将tensor的维度换位      参数:dim(int)---换位顺序 >>>x = torch.randn(,,) >> ...

  5. Loadrunner中参数化取值方式分析

    Loadrunner中参数化取值依赖两个维度: 1.取值顺序分为“顺序”“随机”“唯一”.    select next row:Sequential , Random,unique 2.更新值时分为 ...

  6. python手写bp神经网络实现人脸性别识别1.0

    写在前面:本实验用到的图片均来自google图片,侵删! 实验介绍 用python手写一个简单bp神经网络,实现人脸的性别识别.由于本人的机器配置比较差,所以无法使用网上很红的人脸大数据数据集(如lf ...

  7. Flask form(登录,注册)

    用户登录 from flask import Flask, render_template, request, redirect from wtforms import Form from wtfor ...

  8. TOSCA自动化测试工具--new Project

    1.在默认页面点击Project 进入new project页面 2.第一步出来的页面上点击new 3. 第2步弹出的页面上选择路径,project 名 3.OK之后就创建好了

  9. 【Head First Servlets and JSP】笔记 27: web 应用安全

    典型的安全问题:假冒者.窃听者.非法升级者 认证方式: Base64 .摘要认证 .客户端证书.表单认证,重点熟悉摘要算法( HASH . MD5 等) 安全机制:授权.认证.数据完整性.机密性 80 ...

  10. 【Error】安装程序无法打开注册表项 UNKNOWN\Components\...

    在安装程序的时候出现错误信息: 解决方法: 依次点击开始,所有程序,附件,右键单击命令提示符,选择以管理员身份运行.运行secedit /configure /cfg %windir%\inf\def ...