#include<reg51.h>
#include"intrins.h"
#define uchar unsigned char
#define uint unsigned int
#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
sfr ADC_CONTR = 0xBC;
sfr ADC_RES = 0xBD;
sfr ADC_LOW2 = 0xBE;
sfr P1ASF = 0x9D;
sbit bit1=P1^2;//低時顯示
sbit bit2=P1^3;
sbit bit3=P1^4;
sbit bit4=P1^0;
uchar ch;
uchar V;
uint q;b;s;j;
uchar code display[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//共陽
/*********/
void delay()
{
uchar i,j;
for(i=10;i>0;i--)
for(j=248;j>0;j--);
}
void delay_AD(uint n)
{
unsigned int x;
while(n--)
{
x=5000;
while(x--);
}
}
void init_adc()
{
ADC_RES=0;
P1ASF=0x01;//1.1
ch=1;
ADC_CONTR=ADC_POWER|ADC_SPEEDLL|ADC_START|ch;
delay_AD(2);
if(ADC_FLAG)
{
V=ADC_RES;
ADC_CONTR&=!ADC_FLAG;
ADC_CONTR=ADC_POWER|ADC_SPEEDLL|ADC_START|ch;
}
}
void xiang_s()
{
q=V/100;
b=(V%100)/10;
s=V%10;
bit1=0;bit2=1;bit3=1;
P3=display[q];delay();
bit1=1;bit2=0;bit3=1;
P3=display[b];delay();
bit1=1;bit2=1;bit3=0;
P3=display[s];delay();
bit1=1;bit2=1;bit3=1;
}
void main()
{
while(1)
{
uint l;
l++;
if(l==5000)
{
init_adc();
xiang_s();
l=0;
}
}
}
上面的程序是可以實現AD轉換的,但是把AD改成中斷就不行了,改的地方如下:
void init_adc()
{
ADC_RES=0;
P1ASF=0x01;//1.1
ch=1;
ADC_CONTR=ADC_POWER|ADC_SPEEDLL|ADC_START|ch;
delay_AD(2);
}
void adc_isr() interrupt 5
{
ADC_CONTR&=!ADC_FLAG;
V=ADC_RES;
ADC_CONTR=ADC_POWER|ADC_SPEEDLL|ADC_START|ch;
}
這是為什么呢。
|