蓝桥杯单片机|蓝桥杯单片机 | 特训案例【进阶06】基于PCF8591的DAC模拟电压输出

【1】题目要求 新建工程,以I/O模式编写代码,在CT107D单片机综合训练平台上,实现以下功能:
1、将IIC总线的底层驱动代码文件正确移植到工程中。
2、将J5配置BTN模式,把S4设置为独立按键,选择DAC的输出模式。
3、数码管的显示格式如下图,数码管最左边3位显示当前的DAC输出模式,数码管最右边3位显示当前DAC的输出电压,电压单位为V,保留2位小数。
蓝桥杯单片机|蓝桥杯单片机 | 特训案例【进阶06】基于PCF8591的DAC模拟电压输出
文章图片

4、DAC的输出模式有3种。
模式1中,数码管左边显示“-1-”,DAC输出固定电压2.00V。
模式2中,数码管左边显示“-2-”,DAC输出固定电压4.00V。
模式3中,数码管左边显示“-3-”,数码管右边显示PCF8591芯片AIN3通道的实时输入电压,并将该电压作为DAC的输出参数,使DAC的输出电压和PCF8591芯片AIN3通道的输入电压保持同步变化,通过改变Rb2可调电阻可以改变DAC的输出电压。
5、系统上电后,工作在模式1。在模式1中按下S4按键,进入模式2;在模式2中按下S4按键,进入模式3;在模式3中按下S4按键,重新回到模式1,如此循环。
6、使用万用表测量J3的19和20引脚,即DAC输出电压,万用表显示的数值应与数码管右侧显示的电压基本一致。
【小提示】:
IIC接口的基本原理,可见本博客:《【蓝桥杯单片机进阶强化-01】IIC总线接口技术基础》。
PCF8591的基本原理,可见本博客:《【蓝桥杯单片机进阶强化-02】PCF8591的基本原理与A/D转换应用》
【2】核心源码分析

/*==================蓝桥杯单片机特训================== 【进阶06】:基于PCF8591的DAC模拟电压输出 **平台:CT107D单片机综合实训平台 **模式:IO模式 **底层驱动文件:2022年竞赛资源数据包提供的文件 **设计:欧浩源(小蜜蜂老师,ohy3686@qq.com) **时间:2022-04-05 **更多详见:www.xmf393.com ====================================================*/#include "reg52.h" #include "iic.h"sbit S4 = P3^3; //定义动态显示中单个数码管点亮时长 #define TSMG 500 //-------共阳数码管的段码编码表(无小数点)-------- //0 1 2 3 4 5 6 7 8 9 A B C D E F - . unsigned char code SMG_NoDot[18]={0xc0,0xf9, 0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90, 0x88,0x80,0xc6,0xc0,0x86,0x8e,0xbf,0x7f}; //-------共阳数码管的段码编码表(带小数点)-------- //0. 1. 2. 3. 4. 5. 6. 7. 8. 9. unsigned char code SMG_Dot[10]={0x40,0x79, 0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10}; //-----------------------------------------------unsigned char adc_value = https://www.it610.com/article/0; //AIN3的采样数据 float adc_volt = 0; //AIN3的换算电压 unsigned int smg_volt = 0; //AIN3的显示电压unsigned char stat_smg = 1; //当前显示界面标志 unsigned char mode = 1; //模式/*====锁存器设置和数码管显示的代码参考前面的案例====*/

//===================电压值显示函数=================== void DisplaySMG_ADC() { //输出电压 DisplaySMG_Bit(7,SMG_NoDot[smg_volt % 10]); DisplaySMG_Bit(6,SMG_NoDot[(smg_volt / 10) % 10]); DisplaySMG_Bit(5,SMG_Dot[smg_volt / 100]); //工作模式 DisplaySMG_Bit(2,SMG_NoDot[16]); DisplaySMG_Bit(1,SMG_NoDot[mode]); DisplaySMG_Bit(0,SMG_NoDot[16]); }//===============PCF8591电压采样处理函数=============== void Read_PCF8591_AIN3() { IIC_Start(); IIC_SendByte(0x90); //PCF8591的写设备地址 IIC_WaitAck(); IIC_SendByte(0x43); //输出DAC,转换AIN3 IIC_WaitAck(); IIC_Stop(); DisplaySMG_ADC(); //等待电压转换完成 IIC_Start(); IIC_SendByte(0x91); //PCF8591的读设备地址 IIC_WaitAck(); adc_value = https://www.it610.com/article/IIC_RecByte(); //读出AD采样数据 IIC_SendAck(1); //产生非应答信号 IIC_Stop(); //将ADC采样到的数据换算成对应的电压值 adc_volt = adc_value * (5.0 / 255); smg_volt = adc_volt * 100; } //===============PCF8591电压输出设置函数=============== void Set_PCF8591_DAC(unsigned char dat) { IIC_Start(); IIC_SendByte(0x90); //PCF8591的写设备地址 IIC_WaitAck(); IIC_SendByte(0x43); //输出DAC,转换AIN3 IIC_WaitAck(); IIC_SendByte(dat); //设置DAC电压输出参数 IIC_WaitAck(); //产生非应答信号 IIC_Stop(); }

//===================按键扫描处理函数================== void Scan_Keys() { if(S4 == 0) { DelaySMG(500); if(S4 == 0) { if(mode == 1) { mode = 2; //切换为模式2 Set_PCF8591_DAC(204); //输出固定电压4V smg_volt = 400; //显示电压:4.00 } else if(mode == 2) { mode = 3; //切换为模式3 } else if(mode == 3) { mode = 1; //切换为模式1 Set_PCF8591_DAC(102); //输出固定电压2V smg_volt = 200; //显示电压:2.00 } while(S4 == 0)//松手检测 { DisplaySMG_ADC(); //保持数码管动态显示 } } } }

【蓝桥杯单片机|蓝桥杯单片机 | 特训案例【进阶06】基于PCF8591的DAC模拟电压输出】【注】:更多关于蓝桥杯单片机备赛内容,详见《蓝桥杯单片机设计与开发》小蜜蜂特训手册,本站可下载,相关更多蓝桥杯的案例完整源码及学习备赛笔记,欢迎进入 小蜜蜂笔记 公众号。

    推荐阅读