

#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^6; //定义锁存器的锁存端
sbit wela=P2^7; //定义锁存器的锁存端
sbit adwr=P3^6; //定义AD转换器的WR端口
sbit adrd=P3^7; //定义AD转换器的RD端口
//共阴数码管
unsigned char code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,
};
void delayms(uint xms) //延时函数
{
uint i,j;
for(i=xms;i>0;i--)
{
for(j=110;j>0;j--);
}
}
void display(uchar bai,uchar shi,uchar ge) //显示函数
{
wela=1;
P0=0x7d; //0111 1101 显示第2位和选中AD转换器
wela=0;
P0=0xff; //送位选数据时关闭所有显示;防止打开位选锁存;
dula=1; //数码管显示
P0=table[bai];
dula=0;
delayms(5);
wela=1;
P0=0x7b; //0111 1011 显示第3位数码管并选中AD转换器
wela=0;
P0=0xff;
dula=1;
P0=table[shi];
dula=0;
delayms(5);
wela=1;
P0=0x77; //0111 0111 显示第4位数码管并选中AD转换器
wela=0;
P0=0xff;
dula=1;
P0=table[ge];
dula=0;
delayms(5);
}
void main()
{
uchar a,A1,A2,A3,adval;
A1=1;
A2=2;
A3=3;
wela=1;
P0=0x7f; //0111 1111 选通CSAD
wela=0;
while(1)
{
adwr=1;
_nop_();
adwr=0; //启动AD转换;
_nop_(); //延时一个机器周期
adwr=1;
for(a=10;a>0;a--)
{
display(A1,A2,A3);
}
P1=0xff; //1111 1111 读取P1之前先全给1
adrd=1; //选通ADCS
_nop_();
adrd=0; //AD读使能;
_nop_();
adval=P1; //AD数据读取赋值给P1
A1=adval/100;
A2=adval%100/10;
A3=adval%10;
}
}

DAC0832引脚:

- CS:片选信号输入端,低电平有效。
- WR1:输入寄存器的写选通输入端,负脉冲有效。当CS为0,ILE为1,WR1有效时,DI0-DI7状态被锁存到输入寄存器。
- DI0-DI7:数据输入端,TTL电平。
- Vref:基准电压输入端,电压范围为-10V-+10V。
- Rfb:反馈电阻端,芯片内部此端与IOUT1接有一个15K的电阻。
- IOUT1:电流输出端,当输入全为1,电流最大。
- IOUT2:电流输出端,其值与IOUT1电流之和为一常数。
- XFER:数据传输控制信号输入端,低电平有效。
- WR2:DAC寄存器的写选通输入端,负脉冲有效。当XFER为0且WR2有效时,输入寄存器的状态被传到DAC寄存器中。
- ILE:数据锁存允许信号输入端,高电平有效。
DAC0832工作方式:
- 双缓冲
- 单缓冲
- 直通:片选、写信号、传送控制都接地。
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^6; //段选
sbit wela=P2^7; //位选
sbit dawr=P3^6; //DA的WR端口
sbit dacs=P3^2; //DA的CS端口
sbit beep=P2^3; //蜂鸣器端口
void delayms(uint xms) //延时xms
{
uint i,j;
for(i=xms;i>0;i--)
{
for(j=110;j>0;j--);
}
}
void main()
{
uchar val,flag;
dula=0; //关闭段选
wela=0; //关闭位选
dacs=0; //片选信号,选中DAC
dawr=0; //输入寄存器的写信号选通端
P0=0;
while(1)
{
if(flag==0)
{
val+=5;
P0=val;
if(val==255)
{
flag=1;
beep=1;
delayms(100);
beep=0;
}
delayms(50);
}
else
{
val-=5;
P0=val;
if(val==0)
{
flag=0;
beep=1;
delayms(100);
beep=0;
}
delayms(50);
}
}
}