设计51单片机和DAC0832的接口电路,满量程电压为5V 编写程序,输出下列要求的模拟电压。 (1) 幅值为4V,周期为2ms 的方波。 (2)周期为5ms的阶梯波,阶梯的电压幅值分别为1V、2V、3V、4V、5V,每一个阶梯1ms。
时间: 2023-06-18 19:08:36 浏览: 109
基于51单片机ADC0832双通道电压检测仿真
5星 · 资源好评率100%
接口电路:
DAC0832的引脚连接:
- CS连接P2.0
- WR连接P2.1
- D0-D7连接P0口
- A0,A1,A2连接P1口的0,1,2号引脚
- VCC连接5V电源
- VREF连接5V电源
- AGND连接GND
- DGND连接GND
- OUT连接模拟电路
注意:因为DAC0832是单向数字模拟转换器,所以不需要将模拟信号接回单片机。
程序实现:
```
#include <reg51.h>
#define uint unsigned int
#define uchar unsigned char
sbit CS = P2^0;
sbit WR = P2^1;
void delay(uint i) { // 延时函数
while(i--);
}
void write_dac(uchar channel, uchar dat) { // 向DAC写入数据
CS = 0; // 选中DAC
WR = 1; // 置高WR
WR = 0; // 先置低WR
P0 = channel << 1; // 将channel转为控制字
WR = 1; // 上升沿,发送控制字
WR = 0; // 再次置低
P0 = dat; // 发送数据
WR = 1; // 上升沿,发送数据
WR = 0; // 再次置低
CS = 1; // 取消选中
}
void main() {
uchar i = 0;
while(1) {
// 输出幅值为4V,周期为2ms的方波
if(i < 128) { // 前半周期输出1
write_dac(0, 0x80);
} else { // 后半周期输出0
write_dac(0, 0x00);
}
i++;
if(i >= 256) i = 0; // 周期为256
delay(500); // 周期为2ms,等待500us
// 输出周期为5ms的阶梯波
if(i < 50) {
write_dac(0, 0x08); // 输出1V
} else if(i < 100) {
write_dac(0, 0x10); // 输出2V
} else if(i < 150) {
write_dac(0, 0x18); // 输出3V
} else if(i < 200) {
write_dac(0, 0x20); // 输出4V
} else {
write_dac(0, 0x28); // 输出5V
}
i++;
if(i >= 250) i = 0; // 周期为250
delay(1000); // 周期为5ms,等待1ms
}
}
```
注意:
- 此程序是简单的示例程序,实际使用需要根据具体情况进行修改。
- 方波的幅值为4V,需要将DAC输出的模拟电压调整到4V,即DAC的满量程电压5V对应于4V,即需要将数字量0对应到0V,数字量255对应到4V,所以需要将输出数据向右移3位(除以8)。
- 阶梯波的电压幅值分别为1V、2V、3V、4V、5V,需要将DAC输出的模拟电压调整到5V,即DAC的满量程电压5V对应于5V,即需要将数字量0对应到0V,数字量255对应到5V,所以需要将输出数据乘以5/255。
阅读全文