数模-模数转换程序
- 格式: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;