STC12C5A60S2AD功能的使用

上传人:平*** 文档编号:12797038 上传时间:2017-10-20 格式:DOC 页数:5 大小:106.50KB
返回 下载 相关 举报
STC12C5A60S2AD功能的使用_第1页
第1页 / 共5页
STC12C5A60S2AD功能的使用_第2页
第2页 / 共5页
STC12C5A60S2AD功能的使用_第3页
第3页 / 共5页
STC12C5A60S2AD功能的使用_第4页
第4页 / 共5页
STC12C5A60S2AD功能的使用_第5页
第5页 / 共5页
亲,该文档总共5页,全部预览完了,如果喜欢就下载吧!
资源描述

《STC12C5A60S2AD功能的使用》由会员分享,可在线阅读,更多相关《STC12C5A60S2AD功能的使用(5页珍藏版)》请在金锄头文库上搜索。

1、STC12C5A60S2 系列单片机 AD 功能详解作者:裴博宇作者原本旨在对 STC12C5A60S2(后文简称该单片机、12C 单片机)系列单片机相对传统51 内核单片机升级内容进行详细解析,和程序应用分析,但是由于时间原因只写到了 AD 的查询方式使用,抱歉了,如果有什么错误欢迎批评指正,但是申明本人是一个学生,文章也只适合于初学者,希望行业的老人不要骂的太狠。本文以 STC12C5A60S2 系列单片机芯片手册为母本编写。一、相关寄存器介绍12C 单片机自带 8 路 10 位 AD,要使用他就必须明确其相关寄存器:P1ASF 寄存器P1 口模拟配置寄存器,地址:9DH,复位值:00H。

2、12C 单片机的 AD 转换引脚与 P1I/O 口复用,P1ASF 寄存器指定 P1 寄存器哪一位用于 AD转换,哪一位做 I/O 口用。具体是,P1ASF 寄存器的 8 位对应 P1 的 8 位,1 代表做 AD 转换通道用,0 代表做 I/O 口用。不可位寻址。ADC_CONTR 寄存器ADC 控制寄存器,地址 BCH,复位值:00H。位说明:ADC_CONTR.7(这种写法其实是有问题的,因为该寄存器不支持位寻址,仅供阅读方便)ADC_POWER。ADC 开关,要使用 AD 转换功能该位必须置“1” 。开在初始化时直接将其置“1” ,但考虑到能耗的因素,最好在使用时开启,使用结束后关闭。

3、ADC_CONTR.6SPEED1、ADC_CONTR.5 SPEED2,AD 转换速率控制寄存器。00540 个时钟周期转换一次;01360 个时钟周期转换一次;10180 个时钟周期转换一次;1190 个时钟周期转换一次。转换速率并非越快越好,当然从效率角度来讲我们希望他更快,但是转换速率愉快能耗越高,同时准确度越低,所以请选择一个合理的周期。ADC_CONTR.5FLAG,AD 转换结束标志位。当 AD 转换结束时,自动拉高,标志转换结束。注意,需用软件拉低。ADC_CONTR.4SRART, AD 转换启动位。置“1 ”AD 转换启动。ADC_CONTR.3-0CHS2-0,表示对哪一

4、个引脚的输入值进行 AD 转换,使用 BCD码,如下图ADC_RES,ADC_RESL,AUXR1 寄存器ADC_RES AD 转换结果储存高位寄存器,地址:BDH,复位值:00H 。ADC_RESL AD 转换结果储存低位寄存器,地址: BEH,复位值:00H 。AUXR1 辅助寄存器,地址:A2H,复位值:00H。当 AUXR1.2ADRJ 为 0 时,AD 转换结果的高 8 位存放在 ADC_RES 中,低 2 位存放ADC_RESL 的低 2 位中。当 ADRJ 为 1 时,AD 转换结果的高 2 位存放在 ADC_RES 的低 2 位中,低 8 位存放在ADC_RESL 中。PS:后

5、文程序中不会出现 AUXR1 寄存器,使用第一种情况。IE 寄存器中断允许寄存器,地址 A8H,复位值 00H。相信大家对这个寄存器一定非常熟悉,在传统 51 中第 7 位为 EA,第 6 位没有使用,12C单片机的 6 位就是 AD 中断允许位。这个就不多说了。IP、IPH 寄存器IP:中断优先级设置寄存器低,地址: B8H,复位值 00H。IPH:中断优先级设置寄存器高,地址:B7H,复位值 00H。IP.5 和 IPH.5 位 AD 中断优先级控制位当 PADCH=0 且 PADC=0 时, A/D 转换中断为最低优先级中断 (优先级 0)当 PADCH=0 且 PADC=1 时, A/

6、D 转换中断为较低优先级中断 (优先级 1)当 PADCH=1 且 PADC=0 时, A/D 转换中断为较高优先级中断 (优先级 2)当 PADCH=1 且 PADC=1 时, A/D 转换中断为最高优先级中断 (优先级 3)可位寻址和不可位寻址说明以上内容几乎没有提及那些寄存器可位寻址,那些寄存器不可位寻址,现在做以说明。可位寻址的寄存器(仅指上面提到的寄存器)包括 IE 和 IP,其他均不可位寻址,也就是说只有传统 51 有的寄存器才可以位寻址,但是在使用 C 编写程序是,由于我们调用的是 reg51 的头文件,并且在预编译阶段只使用 srf 语句定义了寄存器,没有使用 sbit 语句定

7、义位,所以程序的位操作,均使用“|” 和“&” 。二、C 语言程序编写说明(查询方式)从上文可以看出 12C 单片机为 AD 设置了中断,但是我们为什么不用中断呢?(之后纯属个人看法)在我看来没有使用中断的必要,因为 AD 转换所用的时间并不长,完全可以让程序在这个地方等一段时间,用到中断后势必会影响其他的中断,涉及中断优先级和嵌套的问题,但是如果你使用数码管或者点阵做显示,或者说其他的什么原因,使得你认为这些时间对你来说很重要,那么今后有缘再写吧。程序预编译#include reg51.h #include intrins.h /使用_nop_();函数#define _nop_() nop

8、/*定义相关特殊功能寄存器*/sfr ADC_CONTR = 0xBC; /ADC control register sfr ADC_RES = 0xBD; /ADC hight 8-bit result register sfr ADC_LOW2 = 0xBE; /ADC low 2-bit result register sfr P1ASF = 0x9D; /P1 secondary function control register/*由于 12C 单片机不支持 AD 相关寄存器的位寻址,需使用“|”对寄存器执行位,故定义一下内容*/ /*“|”说明,之后不再提到 X 指未知量 0x80

9、=1000 0000B 0xXX | 0x80 = 1XXX XXXXB*/*“&”说明, 0xEF=0111 1111B 0xXX & 0xEF=0XXX XXXXB*/#define ADC_POWER 0x80 /ADC power control bit #define ADC_FLAG 0x10 /ADC complete flag #define ADC_START 0x08 /ADC start control bit #define ADC_SPEEDLL 0x00 /540 clocks #define ADC_SPEEDL 0x20 /360 clocks #define

10、ADC_SPEEDH 0x40 /180 clocks #define ADC_SPEEDHH 0x60 /90 clocksAD 的初始化void InitADC( ) P1ASF = 0xff; /Set all P1 as analog input port 0xff=1111 1111B 即 P1 全部用作 AD,使用时根据实际情况赋值ADC_RES = 0; /清空转换结果存储寄存器ADC_RESL=0;ADC_CONTR = 0x00; nop; nop; nop; nop; /等待 ADC_CONTR 值写入 AD 转换函数的编写AD 转换函数编写时,我们设计函数返回值为转换结果

11、,函数参数包括要转换的引脚、转换速率,如果全部程序 AD 转换速率不变,可直接将 speed 的值在初始化时写入,如下。unsigned int GetADC(unsigned char ch,unsigned char speed)unsigned int res;ADC_CONTR =ADC_CONTR | ADC_POWER | speed | ADC_START | ch;nop; nop; nop; nop;/确保 ADC_CONTR 的值写入while(!(ADC_CONTR & 0x10); /如果 AD 转换未结束 FLAG 位为 0,程序在此等待,如果为 1,跳出循环res=ADC_RES*4+ADC_RESL; /读 AD 转换结果,公式自己理解ADC_RES=0;ADC_RESL=0;ADC_CONRT=0; /寄存器复位return res;有了这些我相信就够写一个程序了吧,但是注意这个地方还差点东西,缺一个滤波的过程,当然初学者如果对精度要求不高可以忽略这个,如果有兴趣可以去了解一下软件滤波。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号