typedef unsigned int WORD
#include "reg51.h"
#include "intrins.h"
/*Declare SFR associated with the ADC */
sfr ADC_CONTR = 0xBC
sfr ADC_RES = 0xBD
sfr ADC_LOW2= 0xBE
sfr P1ASF = 0x9D
sfr P2M0 = 0x96
sfr P2M1 = 0x95
/厅卖*Define ADC operation const for ADC_CONTR*/
#define ADC_POWER 0x80
#define ADC_FLAG0x10
#define ADC_START 0x08
#define ADC_SPEEDLL 0x00
#define ADC_SPEEDL 0x20
#define ADC_SPEEDH 0x40
#define ADC_SPEEDHH 0x60
//延时知宽
void Delay(WORD n)
{
WORD x
while (n--)
{
x = 5000
while (x--)
}
}
//初始AD寄存器
void InitADC()
{
P1ASF = 0xff
ADC_RES = 0
ADC_CONTR = ADC_POWER | ADC_SPEEDLL
Delay(2)
}
//AD转换
BYTE GetADCResult(BYTE ch)
{
ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START
_nop_()
_nop_()
_nop_()
_nop_()
while (!(ADC_CONTR &ADC_FLAG))
ADC_CONTR &= ~ADC_FLAG
return ADC_RES
}
void main()
{ BYTE temp
P2M1=0 P2M0=0x03 //搭伏亮P2.0和P2.1强推挽
InitADC()
while (1)
{
temp=GetADCResult(0)//转换P1.0
if(temp>1)
P2|=0x03//P1.0有电压 P2.0和P2.1输出高
else
P2&=0xFC//P1.0无电压 P2.0和P2.1输出低
}
}
#define ADCFrequency 1000000 /* 转换时钟1MHz */void ADCInit( void )//初始化
{
LPC_SYSCON->SYSAHBCLKCTRL |= (1 <<16) /* 允许I/O配置模块的时钟 */
LPC_IOCON->PIO1_10 &= ~0xBF/* 配置PIO1_10为模拟输入模式*/
LPC_IOCON->PIO1_10 |= 0x01 /* PIO1_10模拟输入通道6 */
LPC_IOCON->PIO1_11 &= ~0xBF/* 配置PIO1_1 为模拟输入模式*/
LPC_IOCON->PIO1_11 |= 0x01 /* PIO1_1 模拟输入通道7 */
LPC_SYSCON->PDRUNCFG &= ~(0x01 <<4) /* ADC模块上电 */
LPC_SYSCON->SYSAHBCLKCTRL |= (0x01 <<13) /* 使能ADC模块时钟 */
LPC_ADC->CR = ( 0x01 <<6 ) |/* SEL=6,选择ADC6 */
( 0x01 <<7 ) |/* SEL=7,选择ADC7 */
(( SystemFrequency / ADCFrequency - 1 ) <<8 ) | /* 转换时钟1MHz */
( 1 <<16 ) | /* BURST=1,使用Burst模式*/
( 0 <<17 ) | /* 使用11 clocks转换*/
( 0 <蔽档<24 ) | /* ADC转换停止 */
( 0 <<27 ) /* 直接启动ADC转换,此位无效*/
NVIC_EnableIRQ(ADC_IRQn) /* 使能ADC中断,并配置优先级 */
NVIC_SetPriority(ADC_IRQn, 2)
LPC_ADC->INTEN = (1 <<6) /* 通道6 中断使能逗并察 */
LPC_ADC->INTEN = (1 <<7) /山茄* 通道7 中断使能 */
}
void ADC_IRQHandler(void)//中断过程
{
bAdcFlag = 1
Channel_1 = ( (LPC_ADC->DR[6]) >>6) &0x3FF/* Channel_1 读取通道6的值*/
Channel_2 = ( (LPC_ADC->DR[7]) >>6) &0x3FF/* Channel_2 读取通道7的值*/
}
INT16U sTreatmentADC(INT16U wAdcChannel)//处理过程
{
............
if(bAdcFlag == 1){
bAdcFlag = 0 /* 清零标志*/
...........
}
P1ASF是选择哪个口模拟AD转换功能孙局尺,(1<<ADC_CH0)(ADC_CH0相当于0)故P1ASF第0位被置1,选择P1.0为模拟通道。
第二个则高是对ADC_CONTR寄存腊配器进行了设置,(1 <<7)将第八位置1,(1 <<5)将第六位置1,ADC_CONTR = ADC_360T | ADC_ON 将ADC_CONTR寄存器第六位和第八位置1,具体功能就是开启AD转换,选择转换速度。
如有不对请指正!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)