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 != '\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的寄存器的读取的更多相关文章
- SAR ADC : 逐次逼近寄存器型(SAR)模数转换器(ADC)
1.为实现二进制搜索算法,N位寄存器首先设置在中间刻度(即:100... .00,MSB设置为1).这样,DAC输出(VDAC)被设为VREF/2,VREF是提供给ADC的基准电压.然后,比较判断VI ...
- hwclock和date源码分析
一. hwclock 1.1 hwclock源码在哪里? util-linux 或者busybox 1.2 获取源码 git clone https://github.com/karelzak/uti ...
- stm32寄存器版学习笔记07 ADC
STM32F103RCT有3个ADC,12位主逼近型模拟数字转换器,有18个通道,可测量16个外部和2个内部信号源.各通道的A/D转换可以单次.连续.扫描或间断模式执行. 1.通道选择 stm32把A ...
- 痞子衡嵌入式:对比i.MXRT与LPC在RTC外设GPREG寄存器使用上的异同
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是对比i.MXRT与LPC在RTC外设GPREG寄存器使用上的异同. 本篇是 <在SBL项目实战中妙用i.MXRT1xxx里Syst ...
- STM32 ADC详细篇(基于HAL库)
一.基础认识 ADC就是模数转换,即将模拟量转换为数字量 l 分辨率,读出的数据的长度,如8位就是最大值为255的意思,即范围[0,255],12位就是最大值为4096,即范围[0,4096] l ...
- RTC实时时钟
作者:宋老师,华清远见嵌入式学院讲师. 1.1 RTC介绍 在 一个嵌入式系统中,通常采用RTC 来提供可靠的系统时间,包括时分秒和年月日等,而且要求在系统处于关机状态下它也能够正常工作(通常采用后备 ...
- 重学STM32---(五)ADC
这两天把外部中断和ADC看了下,个人感觉外部中断不是很难,也就没有把记下来了,毕竟写这个挺浪费时间.ADC是比较复杂的,如果想让完全自由的运用ADC必须经过多次实践可能才可以.由于已经学过库函数,也就 ...
- Linux驱动修炼之道-RTC子系统框架与源码分析【转】
转自:http://helloyesyes.iteye.com/blog/1072433 努力成为linux kernel hacker的人李万鹏原创作品,为梦而战.转载请标明出处 http://bl ...
- linux rtc 接口【转】
转自:http://blog.csdn.net/goldfighter/article/details/6126178 Linux操作系统内核对RTC的编程详解 转自: http://xenyinze ...
随机推荐
- Linux 超级用户和普通用户切换命令
默认登录的是普通用户权限显示$符 tree@ubuntu:/usr$ 从普通用户切换超级用户权限: sudo su tree@ubuntu:/usr$ sudo su 输入密码 [sudo] pass ...
- #pragma 的用法
它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作.#pragma指令对每个编译器给出了一个方法,在保持与C和C++语言完全兼容的情况下,给出主机或操作系统专有的特征.依据定义,编译指示是机 ...
- PKU 2513 Colored Sticks(并查集+Trie树+欧拉路径(回路))
题目大意: 给定一些木棒,木棒两端都涂上颜色,求是否能将木棒首尾相接,连成一条直线,要求不同木棒相连接的一端必须是同颜色的. 解题思路: 可以用图论中欧拉路的知识来解这道题,首先可以把木棒两端看成节点 ...
- XDU 1056
解法一:简单搜索肯定TLE,只是单纯的想写一发搜索练练手 #include<cstdio> #include<cstring> #define maxn 1005 using ...
- Dom与Bom,增删改查
对Web标准的理解:web标准是由一系列标准组合而成的,页面有三个部分组成:结构,表现和行为.因而web标准即由结构化标准语言主要有 xml和xhtml,表现标准语言css,行为标准主要包括对象模型( ...
- Django学习笔记之Django QuerySet的方法
一般情况下,我们在写Django项目需要操作QuerySet时一些常用的方法已经满足我们日常大多数需求,比如get.filter.exclude.delete神马的感觉就已经无所不能了,但随着项目但业 ...
- Python面试题之Python正则表达式re模块
一.Python正则表达式re模块简介 正则表达式,是一门相对通用的语言.简单说就是:用一系列的规则语法,去匹配,查找,替换等操作字符串,以达到对应的目的:此套规则,就是所谓的正则表达式.各个语言都有 ...
- Python面试题之列表推导式
题目要求: 生成如下列表 [[0,0,0,0,0,],[0,1,2,3,4,],[0,2,4,6,8,],[0,3,6,9,12,]] (考察列表生成式和基本逻辑推理) 方法1: list1 = [] ...
- iframe跨页面调用函数
在项目中难免会遇到这样一个问题就是页面引入了IFrame并且需要父页面调用子页面函数或者子页面需要调用父页面函数.比如说:现在有两个页面parent.html和child.html.其中parent. ...
- 20145310《Java程序设计》第2次实验报告
20145310<Java程序设计>第2次实验报告 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 了解设计 ...