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 ...
随机推荐
- MyEclipse如何调试
我们在MyEclipse中jav添加断点,运行debug as-->open debug Dialog,然后在对话框中选类后--> Run在debug视图下.2.F5键与F6键均为单步调试 ...
- Spring第五弹—–配置Spring管理的bean的作用域和生命周期
singleton (默认方式) 在每个Spring IoC容器中一个bean定义只有一个对象实例.默认情况下会在容器启动时初始化bean,但我们可以指定bean节点的lazy-init=“true” ...
- oracle的统计信息的查看与收集
查看某个表的统计信息 SQL> alter session set NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS'; Session altered. SQL&g ...
- python手写神经网络实现识别手写数字
写在开头:这个实验和matlab手写神经网络实现识别手写数字一样. 实验说明 一直想自己写一个神经网络来实现手写数字的识别,而不是套用别人的框架.恰巧前几天,有幸从同学那拿到5000张已经贴好标签的手 ...
- 无线路由MAC地址过滤安全可靠性讨论
无线路由MAC地址过滤安全可靠性讨论/如何实现,真的有效吗,如何防范 [内容导航] 什么是MAC地址过滤 突破MAC地址过滤步骤 捕获的无线客户端MAC地址 更改MAC地址来伪造身份 在W ...
- delphi pchar 指针错误
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 var P: Pchar; //P 是指针 CSize: Cardinal; ...
- oracle 数据库误删数据,误删表的恢复
1.某表的数据误删了,那么可以查询这个表某一时间节点之前的数据,并放到一个新建的表里. create table temptable as select * from t_billdefi as O ...
- oracle连接池问题
1.数据来源. 控制台地址:172.30.252.164:7001/console 登陆: weblogic/weblogic#123数据库jdbc:oracle:thin:@172.30.252.1 ...
- Hibernate与autoCommit
JDBC 的autoCommit属性 对于每一个 JDBC connection,都有一个autoCommit属性,只有执行commit后,该connection中的操作(statement操作)才会 ...
- 获取浏览器版本型号(C#)
private string GetClientBrowserVersions() { string browserVersions = string.Empty; HttpBrowserCapabi ...