关于C52和DAC0832的AD转换问题。
#include<reg51.h>
#define uchar unsigned char
//管脚定义
sbit jia=P1^6;
sbit jian=P1^7;
sbit LED1=P1^0;
sbit LED2=P1^1;
sbit LED3=P1^2;
sbit LED4=P1^3;
//函数声明
void delay(void); //延时
void key(void); //按键
void add01(void); //步进加0.1
void dec01(void); //步进减0.1
void shuchu(void); //显示输出和电压调节
void DA(void); //模数转换
[img=0,1]file:///C:\Users\D-Jn\AppData\Roaming\Tencent\Users\503413895\QQ\WinTemp\RichOle\[Z_I@AGY)$HO@}0)D)R1M$W.png[/img]
uchara[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
uchar bw=0,sw=0,gw=5,dw=0;
void main(void) //主程序
{
while(1)
{
key();
shuchu();
DA();
}
}
void delay(void) //延时程序
{
unsigned char i,j;
for(i=10;i>0;i--)
for(j=248;j>0;j--);
}
void key(void) //按键
{
uchar k;
P1=0xff;
k=P1;
if(k==0xff)
return;
delay();
k=P1;
if(k==0xff)
return;
while(P1!=0xff)
delay();
switch(k)
{
case 0xbf:add01();break;
case 0x7f:dec01();break;
}
}
void add01(void) //步进加 0.1
{
if(dw<9&&!(sw==1&&gw==2))
dw++;
else if(dw==9)
{
if((sw==1&&gw<2)||(sw==0&&gw<9))
{
gw++;
dw=0;
}
else if(sw==0&&gw==9)
{
sw++;
gw=0;
dw=0;
}
}
}
void dec01(void) //步进减0.1
{
if(dw>0)
dw--;
else if(dw==0&&gw>0)
{
gw--;
dw=9;
}
else if(dw==0&&gw==0&&sw>0)
{
sw--;
gw=9;
dw=9;
}
}
void shuchu(void)//修改显示数值及电压输出
{
LED2=0;
LED3=0;
LED4=0;
P0=a[bw];
LED1=1;
delay();
LED3=0;
LED4=0;
LED1=0;
P0=a[sw];
LED2=1;
delay();
LED1=0;
LED2=0;
LED4=0;
P0=a[gw]+0x80;
LED3=1;
delay();
LED1=0;
LED2=0;
LED3=0;
P0=a[dw];
LED4=1;
delay();
}
void DA(void) //模数转换
{
unsigned char temp,dianya;
temp=sw*100+gw*10+dw;
dianya=temp*2.13;
P2=dianya;
}
网上的毕业设计题。
程序如上,请问为什么temp要*2.13 这个2.13是怎么计算来的。
仿真图已经上传了。
引用文章里的描述:
该数模转换电路采用的是DAC0832单极性输出方式,输出Vo=-B*Vref/256,其中B的值为D0~D7组成的8位二进制,取值范围为0~255,Vref是参考电压,该电压有电阻R2、R10和可变电阻RV1分压所得,通过调节可变电阻可以改变参考电压Vref。
数字量取0 ~ 256,B取16, Vref取-8V,即数字量每步进16,模拟量0.03125V,要达到步进0.1V,必须放大2倍,用运放即可 。
电路仿真图