【蓝桥杯单片机笔记】12-AT24C02

【蓝桥杯单片机笔记】12-AT24C02,第1张

朴实无华,没有笔记
真的不是因为懒的写😁

练习:开电源就往地址0x01写入数据1,然后显示在数码管上,每开机一次,数据就加1

main.c

#include"reg52.h"
#include"iic.h"
unsigned char code duanma[]={~0x3F,~0x06,~0x5B,~0x4F,~0x66,~0x6D,~0x7D,~0x07,~0x7F,~0x6F};
void SelectHC573(unsigned char n)
{
	  switch(n)
	  {
	  	case 4:
		P2 = (P2 & 0x1f) | 0x80;
		break;
		case 5:
		P2 = (P2 & 0x1f) | 0xa0;
		break;
		case 6:
		P2 = (P2 & 0x1f) | 0xc0;
		break;
		case 7:
		P2 = (P2 & 0x1f) | 0xe0;
		break; 
	  }
}
void SystemInit()
{
	  SelectHC573(4);
	  P0=0xff;
	  SelectHC573(5);
	  P0=0x00;

}
void delay(unsigned int t)
{
	 while(t--);
}
void Display(unsigned char pos,unsigned char value)
{	 
	 SelectHC573(7);
	 P0=0xff;
 	 SelectHC573(6);
	 P0=0x01<<pos;
	 SelectHC573(7);
	 P0=value;

}

unsigned char dat1=0;
void AT24C02()
{
    
	dat1 = Read24c02(0x01);
	dat1 = dat1+1;
	Write24c02(0x01,dat1);
	if(dat1==255)
	{
	dat1=0;
	}
}

unsigned char a,b,c;
void show(){
	a=dat1/100;
	b=(dat1%100)/10;
	c=dat1%10;

	Display(5,duanma[a]);
	delay(500);

	Display(6,duanma[b]);
	delay(500);

	Display(7,duanma[c]);
	delay(500);
}
 void main()
 {
 	SystemInit();
	AT24C02();
 	 while(1)
	 {
	 	  show();
	 }
 
 
 }

iic.c

/*
  程序说明: IIC总线驱动程序
  软件环境: Keil uVision 4.10 
  硬件环境: CT107单片机综合实训平台 8051,12MHz
  日    期: 2011-8-9
*/

#include "reg52.h"
#include "intrins.h"

#define DELAY_TIME 5

#define SlaveAddrW 0xA0
#define SlaveAddrR 0xA1

//总线引脚定义
sbit SDA = P2^1;  /* 数据线 */
sbit SCL = P2^0;  /* 时钟线 */

void IIC_Delay(unsigned char i)
{
    do{_nop_();}
    while(i--);        
}
//总线启动条件
void IIC_Start(void)
{
    SDA = 1;
    SCL = 1;
    IIC_Delay(DELAY_TIME);
    SDA = 0;
    IIC_Delay(DELAY_TIME);
    SCL = 0;	
}

//总线停止条件
void IIC_Stop(void)
{
    SDA = 0;
    SCL = 1;
    IIC_Delay(DELAY_TIME);
    SDA = 1;
    IIC_Delay(DELAY_TIME);
}

//发送应答
void IIC_SendAck(bit ackbit)
{
    SCL = 0;
    SDA = ackbit;  					// 0:应答,1:非应答
    IIC_Delay(DELAY_TIME);
    SCL = 1;
    IIC_Delay(DELAY_TIME);
    SCL = 0; 
    SDA = 1;
    IIC_Delay(DELAY_TIME);
}

//等待应答
bit IIC_WaitAck(void)
{
    bit ackbit;
	
    SCL  = 1;
    IIC_Delay(DELAY_TIME);
    ackbit = SDA;
    SCL = 0;
    IIC_Delay(DELAY_TIME);
    return ackbit;
}

//通过I2C总线发送数据
void IIC_SendByte(unsigned char byt)
{
    unsigned char i;

    for(i=0; i<8; i++)
    {
        SCL  = 0;
        IIC_Delay(DELAY_TIME);
        if(byt & 0x80) SDA  = 1;
        else SDA  = 0;
        IIC_Delay(DELAY_TIME);
        SCL = 1;
        byt <<= 1;
        IIC_Delay(DELAY_TIME);
    }
    SCL  = 0;  
}

//从I2C总线上接收数据
unsigned char IIC_RecByte(void)
{
    unsigned char i, da;
    for(i=0; i<8; i++)
    {   
    	SCL = 1;
	IIC_Delay(DELAY_TIME);
	da <<= 1;
	if(SDA) da |= 1;
	SCL = 0;
	IIC_Delay(DELAY_TIME);
    }
    return da;    
}
 //要背,需要自己添加的部分
unsigned char Read24c02(unsigned char addr)
{
	unsigned char dat;

	IIC_Start();
	IIC_SendByte(0xa0);
	IIC_WaitAck();

	IIC_SendByte(addr);
	IIC_WaitAck();
	
	IIC_Start();
	IIC_SendByte(0xa1);
	IIC_WaitAck();

	dat = IIC_RecByte();
	IIC_SendAck(1);
	IIC_Stop();

	return dat;
}

void Write24c02(unsigned char addr,unsigned char dat)
{
	IIC_Start();
	IIC_SendByte(0xa0);
	IIC_WaitAck();

	IIC_SendByte(addr);
	IIC_WaitAck();

	IIC_SendByte(dat);
	IIC_WaitAck();

	IIC_Delay(200);
	IIC_Stop();
}

iic.h

#ifndef _IIC_H
#define _IIC_H

void IIC_Start(void); 
void IIC_Stop(void);  
bit IIC_WaitAck(void);  
void IIC_SendAck(bit ackbit); 
void IIC_SendByte(unsigned char byt); 
unsigned char IIC_RecByte(void); 

unsigned char Read24c02(unsigned char addr);
void Write24c02(unsigned char addr,unsigned char dat); 


#endif

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/584849.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-12
下一篇 2022-04-12

发表评论

登录后才能评论

评论列表(0条)

保存