蓝桥杯——AD/DA模块

AD/DA模块代码

AD模块

unsigned char AD_in(unsigned char add)
{
   unsigned char dat;
	IIC_Start();
	IIC_SendByte(0x90);
  	IIC_WaitAck();
	IIC_SendByte(add);//当有DAC输出时改为0x43
	IIC_WaitAck();
	IIC_Stop();
	
	IIC_Start();
	IIC_SendByte(0x91);
	IIC_WaitAck();
	dat=IIC_RecByte();
	IIC_Stop();
   return dat;
}

当需要显示电压时

显示范围调用方法
0-5.0(V)Vp=(float)AD_in(0x03)*50/255;
0-5.00(V)Vp=(float)AD_in(0x03)*500/255;
0-100(V)Vp=(float)AD_in(0x03)*100/255;
  • 对于代码中add的填写解释
通道add
光敏电阻0x01/0x41
滑动电阻0x03/0x43

对于0x03和0x43的区别在于:
在这里插入图片描述
上图中的0旁边的第7位(也就是最下面解释的控制位),他是控制模拟输出的开关位。
在通过电位器控制输出电压时需要使能这个位,通常情况下建议使能该位以做到通用。

DA模块

void DA_put(unsigned char val)
{
	IIC_Start();
	IIC_SendByte(0x90);
	IIC_WaitAck();
	IIC_SendByte(0x40);
	IIC_WaitAck();
	IIC_SendByte(val);
	IIC_WaitAck();
	IIC_Stop();
}

DA输出:

val范围电压V
val(0-255)0-5(V)
51*val(0-5)0-5(V)
<think>嗯,用户想了解蓝桥杯竞赛中单片机AD/DA转换的相关知识、教程和实例。首先,我需要回忆蓝桥杯常用的单片机型号,比如STC15系列,特别是STC15F2K60S2,这个型号在竞赛中经常出现。AD/DA转换是单片机应用中的一个重要部分,涉及模拟信号与数字信号的转换。 接下来,要分清楚ADDA的基本概念。AD转换是把模拟信号(如电压)转换为数字量,而DA则是反过来。蓝桥杯的题目可能会涉及到具体的电路连接、寄存器配置以及编程实现。需要确定用户是否需要基础理论,还是更偏向于实际操作的代码示例。 然后,考虑AD/DA转换在竞赛中的常见应用场景,比如温度测量、光强检测、波形生成等。这些应用通常需要结合传感器和单片机的外设。用户可能需要具体的实例代码,包括初始化配置、数据读取和处理的步骤。 另外,硬件电路部分也很重要。比如,AD转换可能需要连接电位器或光敏电阻,DA转换可能需要连接运放电路来生成模拟电压。需要说明如何连接这些硬件,并确保电路设计正确,避免短路或信号干扰。 寄存器配置是关键步骤。对于STC15系列,AD转换涉及到的寄存器包括ADC_CONTR、ADC_RES和ADC_RESL,需要设置通道选择、转换速度、启动转换等位。DA转换可能使用PWM模拟或者专用的DA芯片,比如使用PCA模块生成PWM波,再通过滤波电路得到平滑的电压。 可能还需要提到一些常见问题,比如转换精度、参考电压的选择、滤波处理的方法,以及如何通过软件校准提高测量精度。此外,代码示例中的关键点,如延时等待转换完成、数据拼接,都需要详细说明,避免用户在实际操作中出现错误。 最后,生成相关问题时要覆盖AD/DA的基本原理、编程步骤、硬件连接、性能优化和应用实例,这样用户可以从多个角度深入理解。需要确保回答结构清晰,分点说明,并引用相关的知识点,比如寄存器配置参考蓝桥杯官方文档或教程。</think># 蓝桥杯单片机AD/DA转换专题解析 ## 一、AD/DA基础概念 1. **AD转换原理** 将模拟信号(如电压)转换为数字量,公式:$$D = \frac{V_{in}}{V_{ref}} \times 2^n$$ 其中$V_{ref}$为参考电压,$n$为ADC位数(蓝桥杯常用12位ADC) 2. **DA转换原理** 将数字量转换为模拟电压,公式:$$V_{out} = \frac{D}{2^n} \times V_{ref}$$ 蓝桥杯常用PWM模拟DA输出[^2] ## 二、硬件电路设计要点 1. **AD转换电路** - 使用P1口连接电位器/光敏电阻 - 参考电压选择:$V_{ref}=5V$(STC15系列内置) - 输入阻抗匹配:需加滤波电容(典型值0.1μF) 2. **DA输出电路** ```circuit PWM输出 → RC滤波 → 运算放大器 → 电压输出 ``` ## 三、STC15F2K60S2编程实现 ### AD转换示例代码 ```c #include <stc15.h> uint16_t ADC_Read(uchar channel) { P1ASF = 1 << channel; // 设置模拟输入通道 ADC_RES = 0; ADC_RESL = 0; ADC_CONTR = 0x80 | channel; // 使能ADC+选择通道 _nop_(); _nop_(); // 等待稳定 ADC_CONTR |= 0x08; // 启动转换 while (!(ADC_CONTR & 0x10));// 等待完成 return (ADC_RES << 8) | ADC_RESL; } ``` ### DA输出实现(PWM模拟) ```c void PWM_Init() { P_SW2 |= 0x80; // 使能访问XSFR PWMCFG = 0x00; // 配置为普通PWM模式 PWMCKS = 0x00; // 时钟选择 PWMCH = 0x00; // 周期设置高字节 PWMCL = 0xFF; // 周期设置低字节 PWMCR |= 0x80; // 使能PWM输出 } ``` ## 四、典型应用场景 1. **温度测量系统** - 使用NTC热敏电阻 - 采集公式:$$R_t = \frac{V_{adc} \times R_{ref}}{V_{ref} - V_{adc}}$$ 2. **波形发生器** - 通过DA输出正弦波/方波 - 采用查表法生成波形数据 ## 五、竞赛技巧 1. **精度提升方法** - 软件滤波(滑动平均/中值滤波) - 参考电压校准 - 温度补偿(对高精度测量) 2. **常见问题排查** - 检查P1ASF寄存器配置 - 验证ADC时钟分频设置 - 确保PWM输出引脚配置正确 [^1]: 参考蓝桥杯官方训练教程第5章 [^2]: STC15系列单片机数据手册PWM章节
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值