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

  • 1 基本原理
    • 1.1 IIC总线
    • 1.2 PCF8563芯片
  • 2 实现过程
    • 2.1 电路图
    • 2.2 源代码

1 基本原理

1.1 IIC总线

见前面内容PIC16F877A单片机 (IIC总线+AT24C02芯片)

1.2 PCF8563芯片





可以看出,PCF8563芯片一共有16个寄存器。也就是该芯片的内部地址最大为0x0f。上述的16个寄存器除了作为普通的存储功能外,还具备授时功能。

2 实现过程

2.1 电路图

2.2 源代码


/*---------------------函数功能:IIC总线 + PCF8563(内部只有16个地址空间
PCF8563芯片一共有16个寄存器。也就是该芯片的内部地址最大为0x0f。
上述的16个寄存器除了作为普通的存储功能外,还具备授时功能。
-----------------------------------------*/#include<pic.h>// 调用PIC16f87XA单片机的头文件
#include"delay.h"//调用延时子函数的头文件__CONFIG(0xFF32);//芯片配置字,看门狗关,上电延时开,掉电检测关,低压编程关
//__CONFIG(HS&WDTDIS&LVPDIS);/*-----------宏定义--------------*/
#define  uint  unsigned int
#define  uchar unsigned char
#define  SDA     RC6            // IIC的数据线
#define  SCL     RC5            // IIC的时钟线/*-----------子函数声明--------------*/
void IIC_start(void);       // IIC启动信号函数
void IIC_end(void);         // IIC终止信号函数void write_1Byte(uchar buf);//向IIC总线写一个字节的函数
char read_1Byte();          //从IIC总线读一个字节的函数void write_PCF8563(char address,char databuf);  //向AT24C02芯片的指定地址写一个字节的数据
char read_PCF8563(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灯的显示//TRISC=0B10011111;PORTD=0x00;          //LED的初值为0//PORTC=0X00;delay_xms(100);while(1){bufdata=read_PCF8563(0x00);// 从PCF8563中地址0x00读出数据PORTD=bufdata;delay_xms(100);bufdata=bufdata+1+0xaa;PORTD=bufdata;delay_xms(100);write_PCF8563(0x00,bufdata);//将+1的数据保存在0x00中}}/*************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,就写1elseSDA=0;            //如果buf的最高位为0,就写0asm("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 只对最低位有影响elset_byte=t_byte&0xfe;//写0SCL=0;asm("NOP");asm("NOP");}TRISC4=0;return t_byte;      // 返回的是一个字节 eg:0x3f
}/*************向PCF8563芯片的指定地址写一个字节的数据***************/
void write_PCF8563(char address,char databuf)
{IIC_start();           //发送起始信号//PCF8563芯片寄存器: 1010 A2 A1 A0 R/W_n  AT24C02芯片的高四位固定为1010// A2A1A0:从机选择,一共可以接八个AT24C02芯片。  A2A1A0=000,选择第一个芯片。  R/W_n:读/写// I2C-bus slave address: read A3h and write A2hwrite_1Byte(0xa2);        //表示写//指定该器件内部的某一个地址(确定芯片内部地址)write_1Byte(address);   //指定该芯片内部的某一个地址(一共有16个地址)//向该芯片的指定地址里面写数据write_1Byte(databuf);    //向指定地址发送数据IIC_end();               //发送结束信号
}/*************从PCF8563芯片的指定地址读一个字节的数据***************/
char read_PCF8563(char address)
{char buf;// PCF8563芯片寄存器: 1010 A2 A1 A0 R/W_n  PCF8563芯片的高四位固定为1010// A2A1A0:从机选择,一共可以接八个PCF8563芯片。  A2A1A0=000,选择第一个芯片。  R/W_n:读/写IIC_start();           //发送起始信号// I2C-bus slave address: read A3h and write A2hwrite_1Byte(0xa2);      //表示写//指定该器件内部的某一个地址(确定芯片内部地址)write_1Byte(address);   //指定该芯片内部的某一个地址(一共有256个地址)//在传输过程中,当需要改变传送方向时(写<->读),起始信号IIC_start()和从机地址write_1Byte(0xa1)都被重复产生一次//由于写变成读,所以需要下面两条指令IIC_start();            //再次启动// I2C-bus slave address: read A3h and write A2hwrite_1Byte(0xa3);        //表示读//读出该芯片指定地址的数据buf=read_1Byte();       IIC_end();              //发送结束信号return buf;             // 返回的是一个字节 eg:0x3f
}

PIC16F877A单片机 (IIC总线+PCF8563芯片)相关推荐

  1. 十天学会单片机Day5 IIC总线AT2402芯片(EEPROM)应用

    1.采用串行总线技术可以使系统的硬件设计大大简化.系统的体积减小.可靠性提高.同时,系统的更改和扩充极为容易. 常用的串行扩展总线有: IIC (Inter IC BUS)总线.单总线(1-WIRE ...

  2. 51单片机IIC总线编程

    #include<reg52.h> #define uchar unsigned char sbit sda=P2^0; sbit scl=P2^1;//用单片机的两个I/O口模拟I2C接 ...

  3. IIC总线通讯协议、EEPROM芯片

    EEPROM芯片: 掉电不会丢失数据,可以保存数据. IIC串行总线的组成及工作原理: IIC总线传输协议 IIC产生起始与终止信号: IIC字节的传送与应答: 应答位作用: 数据帧格式: 总线寻址 ...

  4. 用Proteus学习51单片机之I2C(IIC)总线

    最近刚做好一个站,基于rails 3,教程为主,大家捧场看看,谢谢!www.yo945.com 在学习单片机的过程中,我常有这样的烦恼:随随便便一个芯片,少则占用三五个IO口,一般的就占用8个,稍微想 ...

  5. 郭天祥51单片机教程--- IIC总线

    郭天祥51单片机教程- IIC总线 #include <reg52.h> #define uchar unsigned charsbit SDA = P2^0; //数据总线 sbit S ...

  6. 基于51单片机实现模拟IIC总线时序

    最近用到测量光线的模块BH1750FVI时需要用到IIC总线操作, 于是就又费功夫学习了下, 基本上算是了解了, 所以呢, 就用51的IO口, 模拟出了总线时序, 并能正确操纵需要用IIC总线访问地一 ...

  7. STM32模拟IIC读取PCF8563

    作者第一次开写博客,本着学习的态度,附上自己总结的代码,希望大家多多指点! 一.首先是对于PCF8563芯片的介绍与使用说明: PCF8563 是PHILIPS 公司推出的一款工业级内含I2C 总线接 ...

  8. 【学习】PCF8563芯片资料和相关功能解析

    [学习]PCF8563芯片资料和相关功能解析 PCF8563芯片是以I2C通讯方式的实时时钟/日历芯片.它提供一个可编程时钟输出,一个中断输出和掉电检测器,所有的地址和数据通过 I2C 总线接口串行传 ...

  9. 【乌拉喵.教程】IIC总线介绍及FPGA编程

    最近将多年来收集到的教学视频.国内外图书.源码等整理整合拿出来,涉及arm.Linux.python.信号完整性.FPFA.DSP.算法.stm32.单片机.制图.电子模块.kali.出版社图书等.资 ...

最新文章

  1. html块元素设置min-width,css min-width属性怎么用
  2. myeclipse10安装了activiti插件后创建BPMN 文件时报错,
  3. QA seven's blog
  4. js 加总数组中某一列_js根据对象数组中某一属性值,合并相同项,并对某一属性累加处理...
  5. ZeroMQ接口函数之 :zmq_proxy – 开始ZMQ内置代理
  6. 213.打家劫舍II(力扣leetcode) 博主可答疑该问题
  7. html如何转换万,如何在excel表格中设置以万为单位
  8. CM3基础(持续更新)
  9. 【PCB软件技巧】OrCAD与PADS相互搭配使用的相关要点
  10. win10c语言关机,win10如何设置定时关机?
  11. C的函数 gotoxy()
  12. Tomcat的安装使用,修改默认8080端口号,查询端口号命令
  13. visual添加mysql.dll_MySQL.VisualStudio.dll,下载,简介,描述,修复,等相关问题一站搞定_DLL之家...
  14. 激光测距仪构造原理及激光安全说明——TFN BKD系列双目军绿激光测距测高仪
  15. Houdini 导出粒子替代物至Maya渲染
  16. LiDAR 5 相控阵激光雷达 (OPA LiDAR)
  17. 声学测试软件手机版_清华31岁教授将手机天线尺寸缩小100倍,未来有望植入人体|专访...
  18. 品赏第一行“Android代码“---Hello World
  19. VisualSVN Server版本推荐
  20. GitHub Copilot的下载使用方法(2022最新)

热门文章

  1. 首个生产环境全链路压测平台Takin正式开源
  2. video-player的应用
  3. 部署Nextcloud私有云
  4. 全球首富贝索斯宣布辞职!“我不想一直盯着流量,要用更多时间探索太空”...
  5. 《javascript基础》学习笔记 一
  6. html如何判断某个控件是否focus
  7. 微信小程序云开发--拼图游戏
  8. 什么是 Merkle Pollard
  9. 计算机作品画图板软件四年级,四年级计算机《用画图软件画画》
  10. Samplitude pro x4完美汉化破解版|Samplitude pro x4 64位完美汉化破解版(附汉化包)下载 v15.0.1.139