PIC16F877A单片机 (IIC总线+AT24C02芯片)

发布者:梦幻微笑最新更新时间:2022-01-10 来源: eefocus关键字:PIC16F877A  单片机  IIC总线  AT24C02芯片 手机看文章 扫描二维码
随时随地手机看文章

1 基本原理

1.1 IIC总线

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

需要注意的是,高四位对于同种芯片而言,都是一样的。例如AT24C02芯片的高四位固定为1010。


1.2 AT24C02芯片

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

2 源代码


/*---------------------函数功能:

IIC总线 AT24C02


-----------------------------------------*/


#include// 调用PIC16f87XA单片机的头文件

#include"delay.h"//调用延时子函数的头文件


__CONFIG(0xFF32);//芯片配置字,看门狗关,上电延时开,掉电检测关,低压编程关

//__CONFIG(HS&WDTDIS&LVPDIS);


/*-----------宏定义--------------*/

#define  uint  unsigned int

#define  uchar unsigned char

#define  SDA     RC4 // IIC的数据线

#define  SCL     RC3 // IIC的时钟线


/*-----------子函数声明--------------*/

void IIC_start(void); // IIC启动信号函数

void IIC_end(void); // IIC终止信号函数


void write_1Byte(uchar buf);//向IIC总线写一个字节的函数

char read_1Byte(); //从IIC总线读一个字节的函数


void write_AT24C02(char address,char databuf); //向AT24C02芯片的指定地址写一个字节的数据

char read_AT24C02(char address); //从AT24C02芯片的指定地址读一个字节的数据




/*-----------主函数--------------*/

void main()

{

char bufdata;


// data direction register is TRISA. 

// Setting  a TRISA bit (= 1) will make the corresponding PORTA pi an input. 

// Clearing a TRISA bit (= 0) will make the corresponding PORTA pin an output.

TRISD=0x00; //RD作为输出口,作为LED灯的显示

PORTD=0x00; //LED的初值为0

delay(1000);


while(1)

{

bufdata=read_AT24C02(0x18);// 从AT24C02中地址0x18读出数据

PORTD=bufdata;

delay(1000);



bufdata=bufdata+1;

PORTD=bufdata;

delay(1000);



write_AT24C02(0x18,bufdata);//将+1的数据保存在0x18中

}

}









/*************IIC启动信号函数***************/

void IIC_start(void)

{

//为什么这样写,见IIC的时序图

SDA=1;

SCL=1;

asm("NOP");

asm("NOP");


SDA=0;

asm("NOP");

asm("NOP");


SCL=0;

asm("NOP");

asm("NOP");


}





/*************IIC终止信号函数***************/

void IIC_end(void)

{

SDA=0;

SCL=0;

asm("NOP");

asm("NOP");


SCL=1;

asm("NOP");

asm("NOP");


SDA=1;

asm("NOP");

asm("NOP");


SCL=0;//拉低

asm("NOP");

asm("NOP");


}





/*************向IIC总线写一个字节(8 bit)的函数***************/

void write_1Byte(uchar buf)

{

int k=0;

for(k=0;k<8;k++)

{

//将最高位写到SDA总线上去

//SDA=buf&0x80; // 等价于下面的if语句

if(buf&0x80) // 提取buf的最高位数据

SDA=1; //如果buf的最高位为1,就写1

else

SDA=0; //如果buf的最高位为0,就写0

asm("NOP");

asm("NOP");

SCL=1;

asm("NOP");


SCL=0; //时钟信号归零

asm("NOP");


buf=buf<<1; //左移一位,准备提取下一个待写的数据

}



// 每接收到一个字节的数据后,从机必须产生一个应答信号给主机。

// 应答器件在第9个时钟周期将SDA线拉低,表示已经接收了一个八位数据

TRISC4=1; //RC4作为输入,SDA引脚接的是RC4口   开始读数据,读SDA的值

asm("NOP");


SCL=1;

asm("NOP");

asm("NOP");

//if(RC4=0) //说明SDA=0,即成功接收

SCL=0;

TRISC4=0;

}





/*************向IIC总线读一个字节(8 bit)的函数***************/

char read_1Byte()

{

int k=0;

char t_byte=0x00;


TRISC4=1; //RC4作为输入,SDA引脚接的是RC4口     开始读数据,读SDA的值


for(k=0;k<8;k++)

{

t_byte=t_byte<<1; //左移一位

SCL=1;

asm("NOP");

asm("NOP");


//读 SDA的值

if(SDA=1) 

t_byte=t_byte|0x01;//写1 只对最低位有影响

else

t_byte=t_byte&0xfe;//写0


SCL=0;

asm("NOP");

asm("NOP");

}


TRISC4=0;


return t_byte; // 返回的是一个字节 eg:0x3f

}






/*************向AT24C02芯片的指定地址写一个字节的数据***************/

void write_AT24C02(char address,char databuf)

{

IIC_start(); //发送起始信号


//AT24C02芯片寄存器: 1010 A2 A1 A0 R/W_n  AT24C02芯片的高四位固定为1010

// A2A1A0:从机选择,一共可以接八个AT24C02芯片。  A2A1A0=000,选择第一个芯片。  R/W_n:读/写


//选择某一个从器件(确定用哪一个芯片)

write_1Byte(0xa0); //发送从器件地址000,选择第一个芯片。R/W_n=0,表示写

//指定该器件内部的某一个地址(确定芯片内部地址)

write_1Byte(address); //指定该芯片内部的某一个地址(一共有256个地址)

//向该芯片的指定地址里面写数据

write_1Byte(databuf); //向指定地址发送数据


IIC_end(); //发送结束信号

}





/*************从AT24C02芯片的指定地址读一个字节的数据***************/

char read_AT24C02(char address)

{

char buf;


//AT24C02芯片寄存器: 1010 A2 A1 A0 R/W_n  AT24C02芯片的高四位固定为1010

// A2A1A0:从机选择,一共可以接八个AT24C02芯片。  A2A1A0=000,选择第一个芯片。  R/W_n:读/写


IIC_start(); //发送起始信号

//选择某一个从器件(确定用哪一个芯片)

write_1Byte(0xa0); //发送从器件地址000,选择第一个芯片。R/W_n=0,表示写

//指定该器件内部的某一个地址(确定芯片内部地址)

write_1Byte(address); //指定该芯片内部的某一个地址(一共有256个地址)





//在传输过程中,当需要改变传送方向时(写<->读),起始信号IIC_start()和从机地址write_1Byte(0xa1)都被重复产生一次

//由于写变成读,所以需要下面两条指令

IIC_start(); //再次启动

//选择某一个从器件(确定用哪一个芯片)  此时要准备读数据

write_1Byte(0xa1); //发送从器件地址,选择第一个芯片。R/W_n=1,表示读

//读出该芯片指定地址的数据

buf=read_1Byte();



IIC_end(); //发送结束信号




return buf; // 返回的是一个字节 eg:0x3f

}

关键字:PIC16F877A  单片机  IIC总线  AT24C02芯片 引用地址:PIC16F877A单片机 (IIC总线+AT24C02芯片)

上一篇:PIC16F877A单片机 (IIC总线+PCF8563芯片)
下一篇:PIC12F629解码PT2262IR(asm程序)

推荐阅读最新更新时间:2024-11-08 11:10

基于Proteus软件的单片机实验室建设
摘要:在电类专业教学中,单片机的实验室建设大多采用硬件仿真器配目标实验板方式,不仅需采购大量的硬件设备,而且设备维护工作量也非常巨大。本文提出一种基于软件仿真的单片机实验室建设方案。该方案配置有限的硬件设备,很好地解决了资金和设备维护问题;大量的仿真工作是在软件环境中实现,大大增强了实验室向学生开放的便利性。在实际运行中,取得了良好的教学效果。该方案目前在国内高校具有较高的推广利用价值。 关键词:单片机仿真 实验室建设 Proteus 引 言   单片机技术是现代电子工程领域一门迅速发展的技术,应用于各种嵌入式系统中。单片机技术的发展和推广极大地推动了电子工业的发展,其在教学和产业界的技术推广仍然是当今业界的一个热点。单片机
[应用]
基于87C51FB单片机的跳频控制器的设计与实现
1 引言 跳频就是“多频、选码、频移键控”,即用伪码序列构成跳频指令来控制频率合成器,并在多个频率中进行选择的移频键控。 跳频通信具有抗干扰、抗截获的能力,并能做到频谱资源共享,所以,在当前现代化的电子战中,跳频通信已显示出巨大的优越性,它是战术无线电通信抗干扰措施的具体体现。另外,跳频通信也正应用到民用通信中,以抗衰落、抗多径、抗网间干扰和提高频谱利用率。 跳频控制器是跳频通信系统中的核心部件,具有跳频图案的产生、同步、自适应控制等功能。我们研制了超短波跳频通信系统中的跳频控制器。下面详细讨论其设计与实现。 2 跳频控制器设计 2.1 主要技术参数设计 考察一下系统的跳频技术性能,主要注意下列各项指标
[单片机]
基于87C51FB<font color='red'>单片机</font>的跳频控制器的设计与实现
AVR单片机I2C总线实验
AVR单片机I2C总线实验。 1、用24C02记录CPU启动次数,并在PB口上显示出来。 2、内部1 M晶振,程序采用单任务方式,软件延时。 3、进行此实验请插上JP1的所有8个短路块,JP7(LED_EN)/PC0/PC1短路块。 4、通过此实验,可以I2C总线操作有个初步认识。 */ #include "iom16v.h" extern unsigned char twi_write(unsigned char addr, unsigned char dd); extern unsigned char twi_read(unsigned char addr, unsigned char *dd); /*延时函数*/
[单片机]
恩智浦推出带有带免费DSP库的Cortex-M3微控制器
    恩智浦半导体(NXP Semiconductors)近日宣布推出两款工作频率为120 MHz的微控制器LPC1769和LPC1759,这是业界速度最快的ARM Cortex-M3微控制器。凭借这一性能水平,在成本限制型应用中实现微控制器控制与信号处理的集成已成为现实,再无需使用专用的DSP硬件。     该款微控制器的256-点16-位FFT执行时间不到190 微秒,其速度比最接近的Cortex-M3替代产品提高54%,性能上可与低成本的DSP相媲美。1024-点16-位FFT的执行时间不到0.89 毫秒。以上时间包括FFT算法的初始化时间及运行时间。     恩智浦半导体副总裁兼微控制器产品线总经理Geoff L
[嵌入式]
MCS-51单片机有哪些寻址方式,是怎样操作的?
什么是寻址方式?MCS-51单片机有哪些寻址方式,是怎样操作的?各种寻址方式的寻址空间和范围是什么? 答: MCS-51单片机有7种寻址方式:立即数寻址、寄存器寻址、直接寻址、寄存器间接寻址、变址寻址、位寻址和指令寻址。可以分为两类:操作数寻址和指令寻址。 立即数寻址的寻址空间和范围是:在程序存储空间,随指令读入MOV A,#46H 直接寻址的寻址空间和范围是:片内RAM中,低128字节和SFR MOV A,46H 寄存器寻址的寻址空间和范围是:使用R0~R7、A、B、C、DPTR MOV A,R2 寄存器间接寻址的寻址空间和范围是:片内RAM:使用@Ri,SP;范围为256B,不含SFR,片外RAM:使用@Ri,@DP
[单片机]
单片机指令功能
单片机指令功能一览表 一、传送操作   助记符 代码 说明   MOV A,Rn E8~EF 寄存器A   MOV A,direct E5 dircet 直接字节送A   MOV A,@Ri ER~E7 间接RAM送A   MOV A,#data 74 data 立即数送A   MOV Rn,A F8~FF A送寄存器   MOV Rn,dircet A8~AF dircet 直接字节送寄存器   MOV Rn,#data 78~7F data 立即数送寄存器   MOV dircet,A F5 dircet A送直接字节   MOV dircet,Rn 88~8F dircet 寄存器送直接字节   M
[单片机]
基于单片机的高速贴片机控制系统改造设计与实现
引言 随着表面贴装技术(Surface Mounted Technology,SMT)的不断优化及贴片元器件制作工艺的迅速发展,贴片机在电子制造业中的应用日益突出。CM402型高速贴片机是由日本松下公司研发和生产,针对某些特定工件、按特定工序进行批量加工的专用设备。根据笔者为期两周的现场调查和论证,传统CM402型高速贴片机在拼接料生产过程中,若出现拼接料检知停止时,停机扫料的时间将影响到生产效率。通过认真分析该设备的工序流程及阅读其用户手册,可将此拼接料检知、停机扫料程序进行技术改造,并在原有电控系统上利用PVS控制系统替代Timer(计时器),可实现接料不停机控制功能,从而可提升其生产效率。 本文以利用PIC16F628
[单片机]
基于<font color='red'>单片机</font>的高速贴片机控制系统改造设计与实现
富士通推出适合汽车应用的新型微控制器
    富士通半导体(上海)有限公司今日宣布,推出适合汽车应用的新型32位微控制器-MB91F552,该芯片最适合用于混合动力汽车(HEV)的电池的电源系统及电力传输电路。已于2013年5月13日起提供新产品样片。 图1.MB91F552     除在单一微控制器芯片上集成了控制数字电源系统(如200MHz PWM模块)的优化功能,MB91F552还支持峰值电流模式控制,大大促进了电源的稳定性并降低系统成本。     近年来随着混合动力汽车及其它电动汽车的普及,已经需要将行驶过程中产生的电力存储在车载电池中。通过这种方式储存的电力,除了对车载辅助电池进行充电,还可以向汽车上的电机、音响系统、灯光和其它板上电气元件供
[汽车电子]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved