PIC16F877A单片机 (IIC总线+PCF8563芯片)
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芯片)相关推荐
- 十天学会单片机Day5 IIC总线AT2402芯片(EEPROM)应用
1.采用串行总线技术可以使系统的硬件设计大大简化.系统的体积减小.可靠性提高.同时,系统的更改和扩充极为容易. 常用的串行扩展总线有: IIC (Inter IC BUS)总线.单总线(1-WIRE ...
- 51单片机IIC总线编程
#include<reg52.h> #define uchar unsigned char sbit sda=P2^0; sbit scl=P2^1;//用单片机的两个I/O口模拟I2C接 ...
- IIC总线通讯协议、EEPROM芯片
EEPROM芯片: 掉电不会丢失数据,可以保存数据. IIC串行总线的组成及工作原理: IIC总线传输协议 IIC产生起始与终止信号: IIC字节的传送与应答: 应答位作用: 数据帧格式: 总线寻址 ...
- 用Proteus学习51单片机之I2C(IIC)总线
最近刚做好一个站,基于rails 3,教程为主,大家捧场看看,谢谢!www.yo945.com 在学习单片机的过程中,我常有这样的烦恼:随随便便一个芯片,少则占用三五个IO口,一般的就占用8个,稍微想 ...
- 郭天祥51单片机教程--- IIC总线
郭天祥51单片机教程- IIC总线 #include <reg52.h> #define uchar unsigned charsbit SDA = P2^0; //数据总线 sbit S ...
- 基于51单片机实现模拟IIC总线时序
最近用到测量光线的模块BH1750FVI时需要用到IIC总线操作, 于是就又费功夫学习了下, 基本上算是了解了, 所以呢, 就用51的IO口, 模拟出了总线时序, 并能正确操纵需要用IIC总线访问地一 ...
- STM32模拟IIC读取PCF8563
作者第一次开写博客,本着学习的态度,附上自己总结的代码,希望大家多多指点! 一.首先是对于PCF8563芯片的介绍与使用说明: PCF8563 是PHILIPS 公司推出的一款工业级内含I2C 总线接 ...
- 【学习】PCF8563芯片资料和相关功能解析
[学习]PCF8563芯片资料和相关功能解析 PCF8563芯片是以I2C通讯方式的实时时钟/日历芯片.它提供一个可编程时钟输出,一个中断输出和掉电检测器,所有的地址和数据通过 I2C 总线接口串行传 ...
- 【乌拉喵.教程】IIC总线介绍及FPGA编程
最近将多年来收集到的教学视频.国内外图书.源码等整理整合拿出来,涉及arm.Linux.python.信号完整性.FPFA.DSP.算法.stm32.单片机.制图.电子模块.kali.出版社图书等.资 ...
最新文章
- html块元素设置min-width,css min-width属性怎么用
- myeclipse10安装了activiti插件后创建BPMN 文件时报错,
- QA seven's blog
- js 加总数组中某一列_js根据对象数组中某一属性值,合并相同项,并对某一属性累加处理...
- ZeroMQ接口函数之 :zmq_proxy – 开始ZMQ内置代理
- 213.打家劫舍II(力扣leetcode) 博主可答疑该问题
- html如何转换万,如何在excel表格中设置以万为单位
- CM3基础(持续更新)
- 【PCB软件技巧】OrCAD与PADS相互搭配使用的相关要点
- win10c语言关机,win10如何设置定时关机?
- C的函数 gotoxy()
- Tomcat的安装使用,修改默认8080端口号,查询端口号命令
- visual添加mysql.dll_MySQL.VisualStudio.dll,下载,简介,描述,修复,等相关问题一站搞定_DLL之家...
- 激光测距仪构造原理及激光安全说明——TFN BKD系列双目军绿激光测距测高仪
- Houdini 导出粒子替代物至Maya渲染
- LiDAR 5 相控阵激光雷达 (OPA LiDAR)
- 声学测试软件手机版_清华31岁教授将手机天线尺寸缩小100倍,未来有望植入人体|专访...
- 品赏第一行“Android代码“---Hello World
- VisualSVN Server版本推荐
- GitHub Copilot的下载使用方法(2022最新)
热门文章
- 首个生产环境全链路压测平台Takin正式开源
- video-player的应用
- 部署Nextcloud私有云
- 全球首富贝索斯宣布辞职!“我不想一直盯着流量,要用更多时间探索太空”...
- 《javascript基础》学习笔记 一
- html如何判断某个控件是否focus
- 微信小程序云开发--拼图游戏
- 什么是 Merkle Pollard
- 计算机作品画图板软件四年级,四年级计算机《用画图软件画画》
- Samplitude pro x4完美汉化破解版|Samplitude pro x4 64位完美汉化破解版(附汉化包)下载 v15.0.1.139