A/D是模拟量到数字量的转换,生活中如温度,长度,压力等都是模拟量,这些模拟量可以通过传感器变成与之相对应的电压,电流等电模拟量,然后单片机是一个典型的数字系统,而我们的单片机有着自己内部的ADC转换器,它可以把模拟量和数字量进行转化。
读数据手册可以知道,关键就是配置好ADC_CONTR寄存器,以及通道的选择P1ASF,和获取转化结果ADC_RES,我们的板子在P10口接了AD,还有个变压器可供我们观察电压的变化
#include <STC12C5A60S2.H>
#include "intrins.h"
//sfr ADC_CONTR = 0xBC;
//sfr ADC_RES = 0xBD;
//sfr ADC_LOW2 = 0xBE;
//sfr P1ASF = 0x9D;
#define ADC_POWER 0x80;
#define ADC_FLAG 0x10;
#define ADC_START 0x08;
#define ADC_SPEEDLL 0x00;
#define ADC_SPEEDL 0x20;
#define ADC_SPEEDH 0x40;
#define ADC_SPEEDHH 0x60;
extern void LcdShowStr(unsigned char x,unsigned char y,unsigned char *str);
extern void InitLcd1602();
void InitADC();
double Data,c;
unsigned char a[5];
unsigned char dal;
void InitADC()
{
P1ASF = 0x01; //设置P1^0口为输入
ADC_RES = 0x00; //清除高八位缓冲数据
ADC_CONTR = 0xF0; //AD转换控制寄存器,选择P1^0口
_nop_();
_nop_();
_nop_();
_nop_(); //要适当延时,才能正确读到ADC_CONTR寄存器的值
ADC_CONTR = 0xE8; //清零ADC_FLAG,置位ADC_START,并选择P1^0作为AD输入
}
void timer0() interrupt 1
{
TH0 = 0xEA;
TL0 = 0xAB;
}
void adc_isr() interrupt 5 //ADC_FLAG标志位置位后,即转换完成,触发中断
{
EA = 0;
dal = ADC_RES; //获取转换结果
ADC_CONTR&=0x7F; //关闭ADC_POWER,即打开AD,这打开关闭两步可以不用
Data = ((double)dal/256)*5; //取8位计算基准电压
c = Data;
ADC_CONTR|=0x80; //打开ADC_POWER,即打开AD
a[0] = ((int)c%10+0x30); //个位,0x30对应的ASCAL码为“0”
a[1] = 0x2E; //小数点
a[2] = ((int)(c*10)%10+0x30); //十位
a[3] = ((int)(c*100)%10+0x30); //百位
a[4] = '\0'; //结束符
LcdShowStr(0,0,a); //进行LCD显示
ADC_CONTR&=0xEF; //ADC_FLAG标志位清零
ADC_CONTR|=0x80; //打开ADC_POWER,即打开AD
EA = 1;
}
void main()
{
InitLcd1602();
InitADC();
TMOD = 0x01;
TH0 = 0xEA;
TL0 = 0xAB;
EA = 1;
ET0 = 1;
EADC = 1;
TR0 = 1;
while(1);
}
|