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 ... 
随机推荐
- Zabbix server(离线版)安装手册
			由于zabbix server需要依赖MySQL及PHP的相关依赖,因此需要先安装好MySQL及PHP的相关依赖后方可安装zabbixserver. 安装MySQL 目录mysql下的rpm 1.新建 ... 
- Linux安装Java开发环境
			一.JDK安装 安装JDK的实现步骤(使用root用户登录安装,避免需要对文件授权) (1)下载JDK,JDK的存放目录一般存放于 /opt目录下(Oracle官网下载jdk,需要accept lic ... 
- 数据库之ADO
			ADO是一种跨多种语言的数据库访问技术. 在MFC里面微软公司将这些函数封装为以下几个类. 在VS2013版本的MFC中,这些类是如下定义的. CDaoDatabase Class:https://m ... 
- delphi程序中定义热键
			delphi程序中定义热键 用到3个API函数 BOOL RegisterHotKey ( HWND hWnd, //响应该热键的窗口句 ... 
- JavaScript-dom1
			获取事件源 var div = document.getElementById("box"); // var arr1 = document.getElementsByTagNam ... 
- Linux-chmod_命令的详细用法讲解
			Linux chmod 命令 chmod用于改变文件或目录的访问权限.用户用它控制文件或目录的访问权限.该命令有两种用法.一种是包含 字母和操作符表达式的文字设定法:另一种是包含数字的数字设定法. 1 ... 
- MVC[xml]页面传值
			MVC 各种传值方式 ViewData传值.HomeController.cs Co de: public ActionResult Index(){ ViewData["Titl ... 
- eclipse 创建jsp报错
- shell 脚本中双引号 单引号 反引号 的区别
			转自:http://blog.csdn.net/iamlaosong/article/details/54728393 最近要编个shell脚本处理数据,需要检测数据文件是否存在,文件名中包含日期,所 ... 
- $Linux vi/vim编辑器常用命令与用法总结 (Markdown编辑版)
			vi/vim是什么? Linux世界几乎所有的配置文件都是以纯文本形式存在的,而在所有的Linux发行版系统上都有vi编辑器,因此利用简单的文字编辑软件就能够轻松地修改系统的各种配置了,非常方便.vi ... 
