ADSCR:ADC状态控制寄存器
ADICLK:ADC时钟控制寄存器
ADC时钟分频
ADIV2 |
ADIV1 |
ADIV0 |
ADC时钟分频 |
0 |
0 |
0 |
输入时钟/1 |
0 |
0 |
1 |
输入时钟/2 |
0 |
1 |
0 |
输入时钟/4 |
1 |
x |
x |
输入时钟/8 |
ADR:ADC 数据寄存器 所在地址$03D
八位数据存储。
典型例子:
许多时候,我们总是去网上和书上找例子,然而多半与其他的内容掺合在一起,本文就举一例,引导大家提炼知识点,之所以要给出一个综合性的例子,是因为采集出来的值如果不显示的话看不到实验效果。实在没有办法,只能把它和数码管联合起来才能观看到结果。
查询式数据采集:
任务:采集变化的电压与VCC的比值(百分数),并通过五位七段数码管显示。
#include
#include
int i,b;
void delay(int n){
for (i=0;i<=n;i++){;}
}
void main(void)
{
CONFIG2=0x01;//初始化设置
CONFIG1=0x01;
PCTL=0x00;//锁相环设置
PBWC=0x80;
PMSH=0x02;
PMSL=0x58;
PMRS=0x80;
PCTL=0x22;
PCTL_PLLON=1;
PBWC_LOCK=0;
PCTL_BCS=1;
SPCR=0x3a;//与MC14489数码管驱动器的串行通信初始化
SPSCR=0x01;
DDRB=0x7f;//端口方向
DDRD=0xff;
DDRE=0xff;
ADCLK=0x40;//A/D数据采集
ADSCR=0x27;
while(1)
{
while(ADSCR_COCO==0){;} //当A/D转换器未完成转换时,做死循环。
b=ADR;//将A/D转换后的数字值取出
PTE_PTE1=0;//送至七段数码管显示
SPDR=0;
delay(5);
SPDR=0;
delay(5);
SPDR=0;
delay(5);
PTE_PTE1=1;
PTE_PTE1=0;
SPDR=b;
delay(5);
PTE_PTE1=1;
}
}
试验结果:当转动可变电阻时,数码管的值随之变化。
这么长的例子(作为一个能运行的程序,实在不好简化了),怎么分析呢?
不管你是不是内行,蒙也能蒙出来,这种单片机工作之初总是要初始化的,初始化的特点就是一连串的寄存器等于某些值。如本例,从main函数一开始,就进入了初始化阶段。很典型的做了CONFIG初始化和PLL锁相环的初始化。随后是七段数码管的驱动芯片的通讯初始化。如果知道端口寄存器的朋友应该知道随后的是端口方向初始化。我们让PTB7作A/D信号的输入端。随后进入了我们今天的主题,A/D数据采集4步走
(1) 设置ADCLK
(2) 设置ADSCR
(3) 进入一个死循环。
(4) 检测如果A/D转换器转换成功一个值,则取出该值,并送交显示。如果没有,则等待。
如果你能看懂上面的代码结构的话,请分析下面一段非常类似的代码:
这段代码的作用是将采集上来的值通过串口传递出去。
#include
#include
long a;
void main(void)
{
CONFIG2=0x39;
CONFIG1=0x01;
PCTL=0x00;
PBWC=0x80;
PMSH=0x02;
PMSL=0x58;
PMRS=0x80;
PCTL=0x22;
PCTL_PLLON=1;
PBWC_LOCK=0;
PCTL_BCS=1;
SCBR_SCR1=1;//串口初始化
SCBR_SCR0=1;
SCC1_ENSCI=1;
SCC2_TE=1;
SCC2_RE=1;
DDRB=0x7f;
DDRC=0xff;
ADCLK=0x40;
ADSCR=0x27;
while(1)
{
while(ADSCR_COCO==0){;}
a=ADR;//将采集来的值放入a变量
if(SCS1_SCTE==1)//如果串行接口发送器空
SCDR=a;//将此值发送
}
}
相信你读完这篇文章后,对简单的A/D采集编程方法已经很熟悉了,以后的工作无非就是数据处理了。当然,如果你有兴趣的话,建议学习中断方式的AD采集,毕竟,查询和中断总是做事情的两个大套路