蓝桥杯电子类单片机学习三——PCF8591 AD/DA转化器,AT24C02 EEPROM存储器(iic驱动)

该博客为准备蓝桥杯单片机组的同学提供参考,介绍了IIC总线通信及底层驱动代码,还讲解了PCF8591 AD/DA转化器和AT24C02掉电不丢失存储器的相关知识,包括原理、ROM检测、控制字和代码实现等,最后给出代码总结及测试功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

前言

单片机资源数据包_2023(点击下载)

一、关于iic总线

1.iic总线通信

2.iic底层驱动代码

二、PCF8591 AD/DA转化器

1.关于PCF8591

2.AD/DA转化

3.ROM检测

4.PCF8591的控制字

5.代码实现

 三、AT24C02掉电不丢失存储器

1.关于AT24C02

2.ROM检查

3.AT24C02的读写

4.代码实现

 四、代码总结



前言

本系列文章意在帮助各位正在准备蓝桥杯单片机组的同学,提供一个参考与指南,但是所有指南的前提是,默认你已经有单片机基础,本系列文章会提供本人对蓝桥杯单片机组编程方面的一些源码实现。当然,或许与你写代码的style完全不想同,那咱们也可以彼此相互交流各自的优缺点,或许你可能只是一个小白,就是想来抄一些可供借鉴的代码,这些都不重要,重要的是能给正在准备单片机组的同学提供到一些帮助。

此外代码可能有写的不完善的地方,但是每一个代码都是经过测试可行之后才发出来的,不敢保证十全十美,但是跑起来应该没问题。

此外,比赛时会提供一个单片机资源数据包,里面的内容比较多,这里只放一个下载链接,是2023年省赛是提供的单片机资源数据包(今年才2024,已经是最新的资源数据包了),正文中会直接使用资源数据包内的资料:

单片机资源数据包_2023(点击下载)

关于此资源数据包还得补充两句,他的3-底层驱动代码参考与往些年不同(但其实差异也很小,这里不再赘述),而且还是快比赛时才公布的这个资源数据包。也就是说,在写底层驱动代码时,我都是以2023年的资源数据包为基础写的,如果你使用的不是2023年的资源数据包的话,可能会跟我使用的底层驱动不完全相同,不过影响也不大。

下图为单片机资源数据包_2023内的所有资源,其中最关键的就是3-底层代码驱动以及SCH_硬件原理图V30了,当然共阳数码管段码表也十分常用,不过一般也就新写一个项目时,会把里面的东西CV到main函数里,然后这个文件就用不着了。

​​

一、关于iic总线

1.iic总线通信

IIC总线是一种串行通信协议,也被称为I2C(Inter-Integrated Circuit)总线。

IIC总线采用两根线进行通信,一根是时钟线(SCL,Serial Clock),另一根是数据线(SDA,Serial Data)。通过这两根线,多个设备可以在同一总线上进行通信,每个设备通过一个唯一的地址进行识别。

IIC总线具有以下特点:

  1. 串行通信:数据在时钟的控制下以位的方式传输,节约通信线路的数量。
  2. 主从结构:IIC总线中有一个主设备(Master)和多个从设备(Slave)。主设备负责发起通信请求,而从设备则被动应答。
  3. 多设备共享:多个设备可以在同一个总线上共享,通过设备地址进行识别和通信。
  4. 支持多速率:IIC总线支持不同的时钟速率,高速模式和标准模式之间可以进行切换。
  5. 双向传输:数据线上既可以传输主设备发送的数据,也可以传输从设备返回的数据。

IIC总线广泛应用于各种电子设备中,特别是在嵌入式系统中。它可以用于连接各种外围设备,如传感器、存储器、显示器等,实现设备之间的数据交换和通信。

在蓝桥杯比赛中,iic总线上挂载了两个设备,分别是PCF8591 AD/DA转化器,以及AT24C02 掉电不丢失数据存储器,也就是eeprom存储器。这就比第二篇讲的,onewire要复杂了,因为那个总线只挂载了一个简单的温度传感器,而且一般我们只需要从温度传感器读取数据;而iic总线上挂载的两个设备,都是我们不单需要读取,而且还需要写入数据的。不过在比赛时,一般也只会出其中的一小部分,不会两个外设的读写程序同时用上,下面提到时在详细介绍。

2.iic底层驱动代码

单片机资源数据包_2023中给出来iic驱动的底层代码:

/*	#   I2C代码片段说明
	1. 	本文件夹中提供的驱动代码供参赛选手完成程序设计参考。
	2. 	参赛选手可以自行编写相关代码或以该代码为基础,根据所选单片机类型、运行速度和试题
		中对单片机时钟频率的要求,进行代码调试和修改。
*/

#define DELAY_TIME	5

//
static void I2C_Delay(unsigned char n)
{
    do
    {
        _nop_();_nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();_nop_();		
    }
    while(n--);      	
}

//
void I2CStart(void)
{
    sda = 1;
    scl = 1;
	I2C_Delay(DELAY_TIME);
    sda = 0;
	I2C_Delay(DELAY_TIME);
    scl = 0;    
}

//
void I2CStop(void)
{
    sda = 0;
    scl = 1;
	I2C_Delay(DELAY_TIME);
    sda = 1;
	I2C_Delay(DELAY_TIME);
}

//
void I2CSendByte(unsigned char byt)
{
    unsigned char i;
	
    for(i=0; i<8; i++){
        scl = 0;
		I2C_Delay(DELAY_TIME);
        if(byt & 0x80){
            sda = 1;
        }
        else{
            sda = 0;
        }
		I2C_Delay(DELAY_TIME);
        scl = 1;
        byt <<= 1;
		I2C_Delay(DELAY_TIME);
    }
	
    scl = 0;  
}

//
unsigned char I2CReceiveByte(void)
{
	unsigned char da;
	unsigned char i;
	for(i=0;i<8;i++){   
		scl = 1;
		I2C_Delay(DELAY_TIME);
		da <<= 1;
		if(sda) 
			da |= 0x01;
		scl = 0;
		I2C_Delay(DELAY_TIME);
	}
	return da;    
}

//
unsigned char I2CWaitAck(void)
{
	unsigned char ackbit;
	
    scl = 1;
	I2C_Delay(DELAY_TIME);
    ackbit = sda; 
    scl = 0;
	I2C_Delay(DELAY_TIME);
	
	return ackbit;
}

//
void I2CSendAck(unsigned char ackbit)
{
    scl = 0;
    sda = ackbit; 
	I2C_Delay(DELAY_TIME);
    scl = 1;
	I2C_Delay(DELAY_TIME);
    scl = 0; 
	sda = 1;
	I2C_Delay(DELAY_TIME);
}

当然,把这个代码复制到project里面之后,点击编译还是会报错。在正常使用之前,我们需要定义正确的管脚,以及引用头文件。此外,为了方面main函数引用,我们还需要手动添加一个iic.h的头文件,并将main.c和iic.c引用iic.h头文件。

从原理图可以看出,scl连接的是P20引脚,sda连接的是P21的引脚,再加上需要引用的头文件,因此我们需要再iic.c开头加上以下代码:

#include "iic.h"
#include <stc15.h>
#include <intrins.h>
sbit sda=P2^1;
sbit scl=P2^0;

并创建空的iic.h文件

#ifndef _IIC_H_
#define _IIC_H_


#endif

这样再次点击编译就不会报错了,但是仍旧会有许多警告,这些警告都是关于已经定义的函数未被调用的,不影响我们正常使用。

二、PCF8591 AD/DA转化器

1.关于PCF8591

PCF8591是一个8位的AD/DA转化器,8位的意思就是,它的精度是8位,也就是0到255.与onewire驱动的DS18B20温度传感器不同,PCF8591的采样速率取决于iic的速度,换言之,PCF8591的采样速度比iic总线的速度还要快,所以采样速度取决于iic的速度;而温度传感器因为需要进行温度转化,温度转化的速度往往很慢(最慢好像可以达到700ms,当然700ms的温度转换也就意味着温度的精度更高)。

PCF8591有四个通道,如果需要同时读取多个通道的话会出现意料之外的情况,因为比赛时也很少遇到需要读取两个甚至以上通道的情况,这里不再赘述。

2.AD/DA转化

<
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值