数模模数转换程序.docx
《数模模数转换程序.docx》由会员分享,可在线阅读,更多相关《数模模数转换程序.docx(13页珍藏版)》请在冰点文库上搜索。
数模模数转换程序
/***********主函数*****************************/
/****这是用ADC0809与DAC0832设计出来的数控电源稳压电源程序*****/
#include"reg52.h"
#include"zhuanhuan.h"
#include"zhongduan.h"
#include"uihanshu.h"
/*****主函数******/
voidmain()
{
mcu_init();
delay(1000);
while
(1)
{
cnt0();
cnt1();
}
}
/**************输入函数*******************/
#include"uihanshu.h"
#include"reg52.h"
sbitclk=P3^1;
sbitdat=P3^0;
uchardis_u[4],dis_i[4];
ucharad,ad1;
ucharcodetab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};
/******发送显示数据*******/
voidsend_byte(uchardate)
{
uchari;
for(i=0;i<8;i++)
{
if(date&0x01)dat=1;
elsedat=0;
clk=0;
clk=1;
date>>=1;
}
}
/****u算术平均滤波****/
voiduFiliter()
{
uintsum=0;
uchari;
for(i=0;i<10;i++)
{
sum+=ad_u[i];
}
ad1=sum/10;
}
/*****U进行标度变换****/
voidcov_u()
{
uintk;
k=ad/2;
dis_u[0]=k/100;
k%=100;
dis_i[1]=k/10;
k%=10;
dis_u[2]=k;
dis_u[3]=0x7a;
}
/****i算术平均滤波****/
voidiFiliter()
{
uintsum=0;
uchari;
for(i=0;i<10;i++)
{
sum+=ad_i[i];
}
ad1=sum/10;
}
/*****I进行标度变换****/
voidcov_i()
{
uintk;
k=ad1/2;
dis_i[0]=k/100;
k%=100;
dis_i[1]=k/10;
k%=10;
dis_i[2]=k;
dis_i[3]=0xee;
}
/***显示函数U****/
voiddisp_u()
{
send_byte(0x7a);
send_byte(tab[dis_u[2]]);
send_byte(tab[dis_u[1]]|0x01);
send_byte(tab[dis_u[0]]);
}
/***显示函数I****/
voiddisp_i()
{
send_byte(0xee);
send_byte(tab[dis_i[2]]);
send_byte(tab[dis_i[1]]);
send_byte(tab[dis_i[0]]|0x01);
}
/*****************中断函数**********************/
#include"zhongduan.h"
#include"zhuanhuan.h"
#include"uihanshu.h"
ucharcnt=0;
ucharkey=0x00;
ucharvo=0;
ucharstep=1;
sbitoe=P2^4;
voiddelay(uintz)
{
ucharx,y;
for(x=0;xfor(y=0;y<220;y++);
}
voidcnt0()
{
if(cnt==0)
{
uFiliter();
cov_u();
disp_u();
delay(500);
}
}
voidcnt1()
{
if(cnt==1)
{
iFiliter();
cov_i();
disp_i();
delay(500);
}
}
/*****读取AD转换结果****/
voidint0()interrupt0using2
{
uchari;
EX0=0;
oe=1;
P0=0xff;
if(cnt==0)
{
for(i=0;i<9;i++)
{
ad_u[i]=ad_u[i+1];
}
ad_u[9]=P0;
}
if(cnt==1)
{
for(i=0;i<9;i++)
{
ad_i[i]=ad_u[i+1];
}
ad_i[9]=P0;
}
oe=0;
EX0=1;
}
/******键盘中断******/
voidint1()interrupt2using3
{
uchartep;
EX1=0;
delay(20);
tep=P1;
tep=~tep;
tep&=0xf0;
if(tep!
=0)
{
switch(tep)
{
case0x10:
key=0x01;break;
case0x20:
key=0x02;break;
case0x40:
key=0x03;break;
case0x80:
key=0x04;break;
default:
key=0xff;break;
}
while(tep!
=0)
{
tep=P1;
tep=~tep;
tep&=0xf0;
}
if(key==0x01)
{
key=0xff;
if(vo<240)vo+=1*step;
elsevo=240;
dac0832(vo);
}
if(key==0x02)
{
key=0xff;
if(vo>1*step)vo-=1*step;
elsevo=0;
dac0832(vo);
}
if(key==0x03)
{
key=0xff;
cnt++;
if(cnt>1)cnt=0;
}
if(key==0x04)
{
key=0xff;
step++;
if(step>10)
step=1;
}
}
EX1=1;
}
/*****启动AD转换*****/
voidtimer1()interrupt3using1
{
uchari=0;
ET1=0;
TL1=(65535-2000)%256;
TH1=(65535-2000)/256;
adc0809(cnt);
ET1=1;
}
voidt1_init()
{
uchari;
i=TMOD;
i=i|0x10;
TMOD=i;
TL1=(65535-2000)%256;
TH1=(65535-2000)/256;
ET1=1;
TR1=1;
}
voidtimer2_init()
{
TMOD=0x02;
TL2=(65535-12)%256;
TH2=(65535-12)/256;
RCAP2L=(65535-12)%256;
RCAP2H=(65535-12)/256;
C_T2=0;
TR2=1;
}/****还不理解这个函数***/
voidint0_init()
{
EX0=1;
IT0=1;
}
voidint1_init()
{
EX1=1;
IT1=1;
}
voidmcu_init()
{
P1=0xff;
P0=0xff;
EA=1;
int0_init();
int1_init();
t1_init();
timer2_init();
}
/***************************转换函数***********************/
#include"zhuanhuan.h"
#include"intrins.h"
#definen_nop_()
sbita0=P2^0;
sbita1=P2^1;
sbitale=P2^2;
sbitstart=P2^3;
sbitload=P2^6;
/****启动AD转换****/
voidadc0809(ucharchannel)
{
if(channel==0)
{
a0=0;
a1=0;
}
if(channel==1)
{
a0=1;
a1=0;
}
ale=0;
ale=1;
n;n;
ale=0;
start=0;
start=1;
n;n;
start=0;
}
/****启动DA转换****/
voiddac0832(uchardate)///并行发送
{
P0=date;
load=0;
n;n;
load=n1;
}