STC12C5A60S2单片机的AD转换(8位)

更新时间:2023-12-21 13:35:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

A/D转换测试程序(ADC查询方式)

#include “stc12c5a.h”//头文件在STC公司主页上下载 #include ”intrins.h”

//与STC12C5A60S2单片机ADC相关的寄存器说明//

Sfr ADC_CONTR = 0xBC;//AD转换控制寄存器 Sfr ADC_RES = 0xBD;//AD转换结果寄存器高 Sfr ADC_RESL = 0xBE;//AD转换结果寄存器低

Sfr P1ASF = 0x9D;//P1口模拟转换功能控制寄存器 Sfr AURX1 = 0xA2;//AD转换结果存储方式控制位

#define ADC_POWER 0x80 //ADC电源开

#define ADC_FLAG 0x10 //ADC结束标志位

#define ADC_START 0x08 //ADC启动控制位设为开

#define ADC_SPEEDLL 0x00 //设为540个时钟周期ADC一次 #define ADC_SPEEDL 0x20 //设为360个时钟周期ADC一次 #define ADC_SPEEDH 0x40 //设为180个时钟周期ADC一次 #define ADC_SPEEDHH 0x60 //设为90个时钟周期ADC一次

void AD_init(void);

void delay(unsigned int a);

unsigned int AD_get(unsigned char n); float AD_work(unsigned char n);

void main() {

unsigned char i; AD_init(); while(1) {

for(i=0;i<8;i++)

{

AD_work(i); delay(20);

} }

}

unsigned int AD_get(unsigned char n) //第n通道ADC采样函数 {

unsigned int adc_data; ADC_RES = 0; //清零

ADC_CONTR=ADC_POWER|ADC_SPEEDLL|n|ADC_START;//打开AD转换

电源、设定转换速度、设定通道号、AD转换开始

_nop_();_nop_();_nop_();_nop_();//要经过4个CPU时钟的延时,其值才能够保证被

设置进ADC_CONTR 寄存器

while(!(ADC_CONTR&ADC_FLAG)); //等待转换完成 adc_data=ADC_RES; //转换结果计算,取8位结果

ADC_CONTR&=~ADC_FLAG;//关闭AD转换,ADC_FLAG位由软件清0 return adc_data; //返回ADC的值

}

float AD_work(unsigned char n) {

float AD_val; //定义处理后的数值AD_val为浮点数 unsigned char i; for(i=0;i<100;i++)

AD_val+=AD_get(n); //转换100次求平均值(提高精度) AD_val/=100;

AD_val=(AD_val*5)/256; //AD的参考电压是单片机上的5v,所以乘5即为实际电压值

return AD_val; }

void AD_init(void) {

P1ASF = 0xff; //P1口全部作为模拟功能A/D使用 ADC_RES = 0; //清零转换结果寄存器高8位 ADC_CONTR = ADC_POWER|ADC_SPEEDLL; delay(2); //等待1ms,让AD电源稳定 }

void delay(unsigned int a) {

unsigned int i; while (a--) {

i=5000; while(i--);

} }

本文来源:https://www.bwwdw.com/article/2085.html

Top