51单片机 C语言ADC程序怎么写

51单片机 C语言ADC程序怎么写,第1张

typedef unsigned char BYTE

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转换,选择转换速度。

如有不对请指正!


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12424578.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存