蓝桥杯模板(七) IIC和PCF8591 & AT24C02

iic.c

先引入赛点资源包文件

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

#define DELAY_TIME	5

sbit sda = P2^1;
sbit scl = P2^0;
//
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);
}


PCF8591

//iic.c续写
unsigned char PCF8591_ADC(unsigned char channel)
{
	unsigned char temp;
	
	I2CStart();
	I2CSendByte(0x90);
	I2CWaitAck();

	I2CSendByte(channel);
	I2CWaitAck();
	I2CStop();

	I2CStart();
	I2CSendByte(0x91);
	I2CWaitAck();

	temp = I2CReceiveByte();
	I2CSendAck(1);
	I2CStop();

	return temp;
}

void PCF8591_DAC(unsigned char trans_data)
{
	I2CStart();
	I2CSendByte(0x90);
	I2CWaitAck();

	I2CSendByte(0x41);
	I2CWaitAck();

	I2CSendByte(trans_data);
	I2CSendAck(1);
	I2CStop();
}

AT24C02

void Write_EEPROM(unsigned char *EEPROM_String,unsigned char addr,unsigned char num)
{
	I2CStart();
	I2CSendByte(0xA0);
	I2CWaitAck();

	I2CSendByte(addr);
	I2CWaitAck();
	
	while(num--)
	{
		I2CSendByte(*EEPROM_Sring++);
		I2CWaitAck();
		I2C_Delay(20);
	}
	I2CStop();
}

void Read_EEPROM(unsigned char *EEPROM_Sring,unsigned char addr,unsigned char num)
{
	I2CStart();
	I2CSendByte(0xA0);
	I2CWaitAck();

	I2CSendByte(addr);
	I2CWaitAck();
	I2CStop();

	I2CStart();
	I2CSendByte(0xA1);
	I2CWaitAck();

	while(num--)
	{
		*EEPROM_Sring++ = I2CReceiveByte();
		if(num) I2CSendAck(0);
		else I2CSendAck(1);
	}
	I2CStop();
}

iic.h

#ifndef __IIC_H__
#defien __IIC_H__

#include <stc15f2k60s2.h>
#include <intrins.h>

unsigned char PCF8591_ADC(unsigned char channel);
void PCF8591_DAC(unsigned char trans_data);
void Write_EEPROM(unsigned char *EEPROM_String,unsigned char addr,unsigned char num);
void Read_EEPROM(unsigned char *EEPROM_Sring,unsigned char addr,unsigned char num);

#endif
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值