实验五 A/D转换实验
一、实验目的
1. 了解单片机的A/D的工作原理。
2. 掌握单片机的A/D的应用。
二、实验内容
//1. 编写程序,使用单片机的A/D转换口,采集外部输入电压,并把采集到的电压在四位数码管上显示出来,单位为V,并保留两位小数。
typedef unsigned char uchar;
typedef unsigned char u8;
typedef unsigned int u16;
typedef unsigned int uint;
#include <stc15.h>
#include <intrins.h>
void AdInit();
void Timer1Init(void); //2毫秒@11.0592MHz
void tuiwan();
// 0 1 2 3 4 5 6 7 8 9 A B C D E F
u8 code BLOCK[]={ 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};
uint advcc[8]={0};
uint advin[8]={0};
u16 vin,vcc,vee;
uchar n=0;
uchar ch=3;
u8 wei=1;
void main()
{
tuiwan();
Timer1Init(); //2毫秒@11.0592MHz
AdInit();
EA=1;
while(1)
{
}
}
void AdInit()
{
P1M0=0x00;
P1M1=0xFF;
P1ASF=0x28;
ADC_CONTR=0x80;
EADC=1;
ADC_CONTR=0x88|ch;
}
void Adsevr() interrupt 5
{
ADC_CONTR=0x80;
if(ch==3)
{
advcc[n]=(ADC_RES<<2)+(ADC_RESL&0x03);
ch=5;
ADC_CONTR=0x88|ch;
}
else if(ch==5)
{
advin[n]=(ADC_RES<<2)+(ADC_RESL&0x03);
n++;
if(n>=8)
{
n=0;
}
ch=3;
ADC_CONTR=0x88|ch;
}
}
void tuiwan()
{
P2M0 |= 0xF0;
P2M1 &= ~0xF0;
P0M0 = 0xFF;
P0M1 = 0x00;
}
void Timer1Init(void) //2毫秒@11.0592MHz
{
AUXR |= 0x40; //定时器时钟1T模式
TMOD &= 0x0F; //设置定时器模式
TL1 = 0x9A; //设置定时初值
TH1 = 0xA9; //设置定时初值
TF1 = 0; //清除TF1标志
ET1 = 1; //使能定时器0中断
TR1 = 1; //定时器1开始计时
}
void tm1_isr() interrupt 3
{
u8 i;
vin=0;
vcc=0;
for(i=0;i<8;i++)
{
vin=vin+advin[i];
vcc=vcc+advcc[i];
}
vcc=vcc>>3;
vin=vin>>3;
vin=vcc/1024.0*vin;
switch ( wei )
{
case 1:
P27=1;
P0=BLOCK[vin/1000%10]|0x80;
P24=0;
wei=2;
break;
case 2:
P24=1;
P0=BLOCK[vin/100%10] ;
P25=0;
wei=3;
break;
case 3:
P25=1;
P0=BLOCK[vin/10%10];
P26=0;
wei=4;
break;
case 4:
P26=1;
P0=BLOCK[vin%10];
P27=0;
wei=1;
break;
}
}
|