实验共用到CLOKCON、SLEEP、PERCFG、U0CSR、U0GCR、U0BAUD、IEN0、U0BUF、ADCCON1、ADCCON3、ADCH和ADCL几个个寄存器。其中CLOKCON为时钟控制寄存器,SLEEP为睡眠模式控制寄存器,PERCFG为外设控制寄存器,U0CSR为串口0控制状态寄存器,U0CSR为串口0常规控制寄存器,U0BAUD为串口0波特率控制寄存器,U0BUF为串口0收发缓冲。
这个实验的串口部分和上一个实验基本上是一样的,这里就不详细的介绍了。这里我想主要介绍一下ADCCON1、ADCCON3、ADCH和ADCL这几个个寄存器。这几个寄存器是进行AD转换的时候用到的寄存器。我们先来看一下ADCCON1这个寄存器:
Bit 7:ADC结束标志位(0:ing。1:end)
Bit 6:手动启动AD转换(0:没有AD转换。1:启动AD转换)
Bit(5:4):AD转换启动方式选择
(00,外部触发;01,全速转换,不需要触发;10,T1通道0比较触发;11,手动触发)
Bit(3:2):16位随机数发生器控制位(写01,10会在执行后返回00)
(00,普通模式;01,开启LFSE时钟一次;10,生成调节器种子;11,使用随机数发生器)
Bit(1:0):保留,总是写1
接着再来看一下ADCCON3寄存器的每位的定义
Bit(7:6):选择单次AD转换参考电压
Bit(5:4):选择单次AD转换分辨率
Bit(3:0):单次AD转换选择,如果写入时ADC正在运行,则在完成序列AD转换后立即开始,否则写入后立
即开始AD转换,转换完成后自动清0。
使用的主要寄存器介绍完了现在就要看一下AD初始化程序了。
void InitialAD(void)
{
//P1 out
P1DIR = 0x03; //P1控制LED
led1 = 1;
led2 = 1; //关LED
ADCH &= 0X00; //清EOC标志
ADCCON3=0xbf; //单次转换,参考电压为电源电压,对1/3 AVDD进行A/D转换
//14位分辨率
ADCCON1 = 0X30; //停止A/D
ADCCON1 |= 0X40; //启动A/D
}
最后看看主程序的部分
if(ADCCON1>=0x80) //完成一次AD转换
{
led1 = 1; //转换完毕指示
temp[1] = ADCL;
temp[0] = ADCH;
ADCCON1 |= 0x40; //开始下一转换
temp[1] = temp[1]>>2;
temp[1] |= temp[0]<<6;
temp[0] = temp[0]>>2; //数据处理
temp[0] &= 0x3f;
num = (temp[0]*256+temp[1])*3.3/8192; //有一位符号位,取2^13;
num /= 2;
//定参考电压为3.3V。14位精确度
adcdata[1] = (char)(num)%10+48;
//adcdata[2] = '.';
adcdata[3] = (char)(num*10)%10+48;
UartTX_Send_String(adcdata,6); //串口送数
//包括空格
Delay(30000);
led1 = 0; //完成数据处理
Delay(30000);
}
说实话具体的计算部分我并没有看懂,但是对ADC的寄存器还是有一定的了解的,这就是这个试验的目的我想。我们主要是明白ADCCON1、ADCCON3、ADCH和ADCL这几个个寄存器的用法就可以了。一定要注意每一位的定义。
文章评论(0条评论)
登录后参与讨论