【1】题目要求 新建工程,以I/O模式编写代码,在CT107D单片机综合训练平台上,实现以下功能:
1、将IIC总线的底层驱动代码文件正确移植到工程中。
2、光敏电阻rd1接到PCF8591的AIN1通道;可调电阻rb2接到PCF8591的AIN3通道。
3、系统上电后,循环采样AIN1通道和AIN3通道的电压,并将A/D转换结果读出,换算成对应的实际电压值,保留2位小数,单位为V。
4、在数码管上显示采样的实时电压数值,显示格式如图所示,数码管靠左端的三位,显示AIN1通道,即采样光敏电阻rd1的电压数值,数码管靠右端的三位,显示AIN3通道,即采样可调电阻rd3的电压数值,没有使用的数码管熄灭。
文章图片
【小提示】:
IIC接口的基本原理,可见本博客:《【蓝桥杯单片机进阶强化-01】IIC总线接口技术基础》。
PCF8591的基本原理,可见本博客:《【蓝桥杯单片机进阶强化-02】PCF8591的基本原理与A/D转换应用》
【2】核心源码分析
/*==================蓝桥杯单片机特训==================
【进阶05】:采样光敏电阻与可调电阻的电压
**平台:CT107D单片机综合实训平台
**模式:IO模式
**底层驱动文件:2022年竞赛资源数据包提供的文件
**设计:欧浩源(小蜜蜂老师,ohy3686@qq.com)
**时间:2022-04-01
**更多详见:www.xmf393.com
====================================================*/#include "reg52.h"
#include "iic.h"//定义动态显示中单个数码管点亮时长
#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 adc1_value = https://www.it610.com/article/0;
//AIN1的采样数据
float adc1_volt = 0;
//AIN1的换算电压
unsigned int smg1_volt = 0;
//AIN1的显示电压
unsigned char adc3_value = 0;
//AIN3的采样数据
float adc3_volt = 0;
//AIN3的换算电压
unsigned int smg3_volt = 0;
//AIN3的显示电压/*====锁存器设置和数码管显示的代码参考前面的案例====*
//===================电压值显示函数===================
void DisplaySMG_ADC()
{
//数码管右起第0位
DisplaySMG_Bit(7,SMG_NoDot[smg1_volt % 10]);
//数码管右起第1位
DisplaySMG_Bit(6,SMG_NoDot[(smg1_volt / 10) % 10]);
//数码管右起第2位
DisplaySMG_Bit(5,SMG_Dot[smg1_volt / 100]);
//数码管右起第5位
DisplaySMG_Bit(2,SMG_NoDot[smg3_volt % 10]);
//数码管右起第6位
DisplaySMG_Bit(1,SMG_NoDot[(smg3_volt / 10) % 10]);
//数码管右起第7位
DisplaySMG_Bit(0,SMG_Dot[smg3_volt / 100]);
}
//===============PCF8591电压采样处理函数===============
unsigned char Read_PCF8591_ADC(unsigned char ain)
{
unsigned char tmp;
IIC_Start();
IIC_SendByte(0x90);
//PCF8591的写设备地址
IIC_WaitAck();
if(ain == 1)
{
IIC_SendByte(0x01);
//通道1,光敏电阻电压
}
else if(ain == 3)
{
IIC_SendByte(0x03);
//通道3,可调电阻电压
}
IIC_WaitAck();
IIC_Stop();
DisplaySMG_ADC();
//等待电压转换完成
IIC_Start();
IIC_SendByte(0x91);
//PCF8591的读设备地址
IIC_WaitAck();
tmp = IIC_RecByte();
//读出AD采样数据
IIC_SendAck(1);
//产生非应答信号
IIC_Stop();
return tmp;
}
//=============采样光敏电阻和可调电阻的电压=============
void Read_AIN1_AIN3()
{
adc1_value = https://www.it610.com/article/Read_PCF8591_ADC(1);
adc1_volt = adc1_value * (5.0 / 255);
smg1_volt = adc1_volt * 100;
adc3_value = Read_PCF8591_ADC(3);
adc3_volt = adc3_value * (5.0 / 255);
smg3_volt = adc3_volt * 100;
}
【蓝桥杯单片机|蓝桥杯单片机 | 特训案例【进阶05】采样光敏电阻与可调电阻的电压】【注】:更多关于蓝桥杯单片机备赛内容,详见《蓝桥杯单片机设计与开发》小蜜蜂特训手册,本站可下载,相关更多蓝桥杯的案例完整源码及学习备赛笔记,欢迎进入 “小蜜蜂笔记” 公众号。
推荐阅读
- 蓝桥杯单片机|蓝桥杯单片机 | 特训案例【进阶04】24C02存储按键触发次数
- 蓝桥杯单片机|蓝桥杯单片机 | 特训案例【进阶06】基于PCF8591的DAC模拟电压输出
- 蓝桥杯单片机|蓝桥杯单片机-DAC-用板载板载PCF8591芯片在D/A引脚上输出指定的电压
- 蓝桥杯单片机|蓝桥杯单片机-ADC-A/D转换-测量PCF8591中AIN1通道(光敏电阻RD1)的电压
- java|2021年蓝桥杯b组省赛真题
- 蓝桥杯|2020年第十一届C/C++ A组第二场蓝桥杯省赛真题
- 蓝桥杯|蓝桥杯2021年第十二届省赛真题-异或数列
- 蓝桥杯|第十二届蓝桥杯 2021年省赛真题 (C/C++ 大学A组) 第一场
- 蓝桥杯|【蓝桥真题】三十块的蓝桥省赛模拟真题