数模-模数转换程序

  • 格式:doc
  • 大小:51.50 KB
  • 文档页数:16

/***********主函数*****************************/

/****这是用ADC0809与DAC0832设计出来的数控电源稳压电源程序*****/

#include "reg52.h"

#include "zhuanhuan.h"

#include "zhongduan.h"

#include "uihanshu.h"

/*****主函数******/

void main()

{

mcu_init();

delay(1000);

while(1)

{

cnt0();

cnt1();

}

}

/**************输入函数*******************/

#include "uihanshu.h"

#include "reg52.h"

sbit clk=P3^1;

sbit dat=P3^0;

uchar dis_u[4],dis_i[4];

uchar ad,ad1;

uchar code

tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};

/******发送显示数据*******/

void send_byte(uchar date)

{

uchar i;

for(i=0;i<8;i++)

{

if(date&0x01) dat=1; else dat=0;

clk=0;

clk=1;

date>>=1;

}

}

/****u算术平均滤波****/

void uFiliter()

{

uint sum=0;

uchar i;

for(i=0;i<10;i++)

{

sum+=ad_u[i];

}

ad1=sum/10;

}

/*****U进行标度变换****/

void cov_u()

{

uint k;

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算术平均滤波****/

void iFiliter()

{

uint sum=0;

uchar i;

for(i=0;i<10;i++)

{

sum+=ad_i[i];

}

ad1=sum/10;

}

/*****I进行标度变换****/

void cov_i()

{

uint k; 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****/

void disp_u()

{

send_byte(0x7a);

send_byte(tab[dis_u[2]]);

send_byte(tab[dis_u[1]]|0x01);

send_byte(tab[dis_u[0]]);

}

/***显示函数I****/

void disp_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"

uchar cnt=0;

uchar key=0x00;

uchar vo=0;

uchar step=1;

sbit oe=P2^4;

void delay(uint z)

{

uchar x,y;

for(x=0;x

for(y=0;y<220;y++);

} void cnt0()

{

if(cnt==0)

{

uFiliter();

cov_u();

disp_u();

delay(500);

}

}

void cnt1()

{

if(cnt==1)

{

iFiliter();

cov_i();

disp_i();

delay(500);

}

}

/*****读取AD转换结果****/

void int0() interrupt 0 using 2 {

uchar i;

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;

}

/******键盘中断******/

void int1() interrupt 2 using 3

{

uchar tep;

EX1=0;

delay(20);

tep=P1;

tep=~tep;

tep&=0xf0;

if(tep!=0)

{

switch(tep)

{

case 0x10:key=0x01;break;

case 0x20:key=0x02;break;

case 0x40:key=0x03;break;

case 0x80: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;

else vo=240;

dac0832(vo);

}

if(key==0x02)

{

key=0xff;

if(vo>1*step) vo-=1*step;

else vo=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转换*****/

void timer1() interrupt 3 using 1

{

uchar i=0;

ET1=0;

TL1=(65535-2000)%256;

TH1=(65535-2000)/256;

adc0809(cnt);

ET1=1; }

void t1_init()

{

uchar i;

i=TMOD;

i=i|0x10;

TMOD=i;

TL1=(65535-2000)%256;

TH1=(65535-2000)/256;

ET1=1;

TR1=1;

}

void timer2_init()

{

TMOD=0x02;

TL2=(65535-12)%256;

TH2=(65535-12)/256;

RCAP2L=(65535-12)%256;

RCAP2H=(65535-12)/256;

C_T2=0;

TR2=1;