这个是我的程序,AD部分是照手册抄的,应该没有问题,但是不知道要怎么把结果从寄存器里取出来并显示,还想问下,是把模拟电压直接接到单片机的I/O口上然后得到一个数字值吗,那这个模拟电压的范围是多少?谢谢啦~~
#include <reg52.h>
#include <intrins.h>
#define FOSC 18432000L
#define BAUD 9600
#define scanp P2
#define segled P0
typedef unsigned char BYTE;
typedef unsigned int WORD;
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
#define output P3
unsigned char const disply[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
unsigned char code seg[]={0,1,2,3,4,5,6,7};
void InitUart();
void SendData(BYTE dat);
void Delay(WORD n);
void InitADC();
void leddata(unsigned char);
BYTE ch = 0;
void main()
{
InitUart();
InitADC();
IE = 0xa0;
output=0x01;
while(1);
}
void adc_isr() interrupt 5
{
ADC_CONTR &= !ADC_FLAG;
SendData(ch);
SendData(ADC_RES);
if (++ch > 7) ch = 0;
ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | ch;
}
void InitADC()
{
P1ASF = 0xff;
ADC_RES = 0;
ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | ch;
Delay(2);
}
void InitUart()
{
SCON = 0x5a;
TMOD = 0x20;
TH1 = TL1 = -(FOSC/12/32/BAUD);
TR1 = 1;
}
void SendData(BYTE dat)
{
while (!TI);
TI = 0;
SBUF = dat;
leddata(ADC_RES);
}
void leddata(unsigned char data_in)
{
int result;
char i,j;
result=data_in*5/256;
for(i=0;i<4;i++)
{
if(i==0)
{
j=result/10;
segled=disply[j];
scanp=seg[i];
Delay(2);
}
if(i==1)
{
j=result%10;
segled=disply[j];
scanp=seg[i];
Delay(2);
}
if(i==2)
{
j=(result*10)%10;
segled=disply[j];
scanp=seg[i];
Delay(2);
}
if(i==3)
{
j=(result*100)%10;
segled=disply[j];
scanp=seg[i];
Delay(2);
}
}
}
void Delay(WORD n)
{
WORD x;
while (n--)
{
x = 50000;
while (x--);
}
}