pic 16 使用8563 rtc iic 通讯 内部iic

发布者:zhihua最新更新时间:2020-09-04 来源: eefocus关键字:pic  rtc  iic  通讯  内部iic 手机看文章 扫描二维码
随时随地手机看文章

void init_iic()
{
    
    time.second=57;
    time.minute=2;
    time.hour=12;
    time.day=1;
    time.week=3;
    time.month=3;
    time.year=17;//默认时间
    TRISCbits.TRISC3=1;  //iic主模式配置为输入
    TRISCbits.TRISC4=1;
    SSP1STAT=0x00;  
    SSP1CON1=0x38; //使能iic主模式
    SSP1CON2=0x00;  
    SSP1ADD=0x19;//波特率设置 400K HZ
}

void IIC_write_n(unsigned char addr,unsigned char length,unsigned char *pbuf)//写

    unsigned char send_da;
unsigned char i=0; 
    SSP1IF=0;  //MSSP 中断标志位 0 表示没有等待你相应的中断
 // SEN=1;//启动位  启动使能位仅在IIC主模式  //在SDA和SCL线上建立和发送一个启动信号时序
  SSP1CON2bits.SEN=1;
while(!SSP1IF); 
SSP1IF=0;  
SSP1BUF=0xA2;//写控制位 //发送外设IIC器件地址和写信号
while(!SSP1IF); 
SSP1IF=0; //软件清零 不会自动清零
SSP1BUF=addr;//起始地址
while(!SSP1IF); 
SSP1IF=0; 

for(i=0;i{
send_da=*(pbuf++);
SSP1BUF=send_da;
while(!SSP1IF); 
SSP1IF=0;
}
SSP1CON2bits.PEN=1;
//PEN=1;//停止位  //在SDA和SCL线上建立和发送一个停止信号时序
while(!SSP1IF); //如果收到停止信号同样会置位
SSP1IF=0; 
  
 } 

void IIC_write(unsigned char addr,unsigned char data)//写

    SSP1IF=0;  //MSSP 中断标志位 0 表示没有等待你相应的中断
    SSP1CON2bits.SEN=1;
 // SEN=1;//启动位  启动使能位仅在IIC主模式  //在SDA和SCL线上建立和发送一个启动信号时序
while(!SSP1IF); 
SSP1IF=0;  
SSP1BUF=0xA2;//写控制位 //发送外设IIC器件地址和写信号
while(!SSP1IF); 
SSP1IF=0; //软件清零 不会自动清零
SSP1BUF=addr;//写地址 //发送要读外设IIC器件数据的地址
while(!SSP1IF); 
SSP1IF=0;  
SSP1BUF=data;//写数据 //发送要读外设IIC器件要存储的数据或命令
while(!SSP1IF); 
SSP1IF=0;  
SSP1CON2bits.PEN=1;
//PEN=1;//停止位  //在SDA和SCL线上建立和发送一个停止信号时序
while(!SSP1IF); //如果收到停止信号同样会置位
SSP1IF=0; 
     
 } 

unsigned  char IIC_read_n(unsigned char addr,unsigned char length,unsigned char *pbuf)//读 
{  //unsigned char data;  
//unsigned int receive_da;
unsigned char i=0;
SSP1IF=0;  
SSP1CON2bits.SEN=1;
//SEN=1;//开始位 
while(!SSP1IF); 
SSP1IF=0; 
SSP1BUF=0xA2;//控制位写 
while(!SSP1IF);
SSP1IF=0;  
SSP1BUF=addr;//写地址  
while(!SSP1IF); 
SSP1IF=0; 
SSP1CON2bits.RSEN=1;
 // RSEN=1;//重新开始位
     while(!SSP1IF); 
     SSP1IF=0; 
     SSP1BUF=0xA3;//控制位读 
     while(!SSP1IF); 
     SSP1IF=0; 
//     RCEN=1;//使能接收 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
//     while(!SSPIF); 
     for(i=0;i{
         SSP1CON2bits.RCEN=1;//使能接收 
     while(!SSP1IF); 
*pbuf =SSP1BUF;
//SSPBUF=send_da;
while(!SSP1IF); 
SSP1IF=0;
SSP1CON2bits.ACKDT=0;
 //  ACKDT=0;
SSP1CON2bits.ACKEN=1;
    // ACKEN=1;//使能应答位 
      while(!SSP1IF); 
     SSP1IF=0;
     pbuf++;
}
     SSP1CON2bits.RCEN=0;
     // RCEN=0;
     SSP1CON2bits.PEN=1;
    // PEN=1;//停止位 
     while(!SSP1IF); 
     SSP1IF=0; 
     return *pbuf;   
     
}

//unsigned  char IIC_read(unsigned char addr)//读 
//{  unsigned char data;  
//
//SSP1IF=0;  
//SSP1CON2bits.SEN=1;
SEN=1;//开始位 
//while(!SSP1IF); 
//SSP1IF=0; 
//SSP1BUF=0xA2;//控制位写 
//while(!SSP1IF);
//SSP1IF=0;  
//SSP1BUF=addr;//写地址  
//while(!SSP1IF); 
//SSP1IF=0;
//SSP1CON2bits.RSEN=1;
// // RSEN=1;//重新开始位
//     while(!SSP1IF); 
//     SSP1IF=0; 
//     SSP1BUF=0xA3;//控制位读 
//     while(!SSP1IF); 
//     SSP1IF=0; 
//     SSP1CON2bits.RCEN=1;
//    // RCEN=1;//使能接收 
//     while(!SSP1IF); 
//     data=SSP1BUF;//读数据 
//     while(!SSP1IF);
//     SSP1IF=0;
//     SSP1CON2bits.ACKDT=0;
//    // ACKDT=0;
//     //ACKEN=1;//使能应答位 
//     SSP1CON2bits.ACKEN=1;
//     while(!SSP1IF); 
//     SSP1IF=0;
//     SSP1CON2bits.RCEN=0;
//    // RCEN=0;
//     SSP1CON2bits.PEN=1;
//    // PEN=1;//停止位 
//     while(!SSP1IF); 
//     SSP1IF=0; 
//     return(data);  
//}

unsigned char BCD2Val(unsigned char x)   //BCD转十进制
{
    unsigned char tmp = 0;

tmp = ((unsigned char)(x & (unsigned char)0xF0) >> (unsigned char)0x04) * 10;
return (tmp + (x & (unsigned char)0x0F));


}

unsigned char Val2BCD(unsigned char x)   //十进制转BCD码子程序
{
    
    
    unsigned char bcdhigh = 0;

while (x >= 10)
{
bcdhigh++;
x -= 10;
}

return ((unsigned char)(bcdhigh << 4) | x);
 
}
unsigned char P8563_Read_Time()   //PCF8563读取时间子程序
{
    
    unsigned char temp[7];
IIC_read_n(0x02,0x07,temp);

time.second=BCD2Val(temp[0]&0x7f);
time.minute=BCD2Val(temp[1]&0x7f);
time.hour=BCD2Val(temp[2]&0x3f);
time.day=BCD2Val(temp[3]&0x3f);
time.week=BCD2Val(temp[4]&0x07);
time.month=BCD2Val(temp[5]&0x1f);
time.year=BCD2Val(temp[6]);
return 0;
 
}

void P8563_Set_Time()   //PCF8563设置时间子程序
{
unsigned char temp[7];
unsigned char i;
for(i=0;i<7;i++)
{
temp[i]=Val2BCD(((unsigned char *)(&time))[i]);
}
 IIC_write_n(0x02,7,temp);
}

关键字:pic  rtc  iic  通讯  内部iic 引用地址:pic 16 使用8563 rtc iic 通讯 内部iic

上一篇:pic 16 f1947 两路usart
下一篇:pic操作lcd 模拟spi 9非标准spi 9位数据位

推荐阅读最新更新时间:2024-11-09 15:53

PIC16F877A单片机 (IIC总线+AT24C02芯片)
1 基本原理 1.1 IIC总线 需要注意的是,高四位对于同种芯片而言,都是一样的。例如AT24C02芯片的高四位固定为1010。 1.2 AT24C02芯片 2 源代码 /*---------------------函数功能: IIC总线 AT24C02 -----------------------------------------*/ #include pic.h // 调用PIC16f87XA单片机的头文件 #include delay.h //调用延时子函数的头文件 __CONFIG(0xFF32);//芯片配置字,看门狗关,上电延时开,掉电检测关
[单片机]
<font color='red'>PIC</font><font color='red'>16</font>F877A单片机 (<font color='red'>IIC</font>总线+AT24C02芯片)
STM32-串口通讯协议开发03
硬件连接 原理图: e-link32与DragongFly连接图: 本实验用到USART1,他的Tx引脚对应MCU的PA9,Rx引脚对应MCU的PA10。我们将PA9和PA10引出来到OpenMV的接口排针Tx- P5,Rx- P4。 软件实现 IO引脚复用功能初始化 我们需要将PA9和PA10当做USART1的Tx和Rx引脚来用,也就是说此节课的PA9和PA10已不是通用IO的作用了,而是芯片内部的外设的接口引脚。STM32将这种应用叫做“I0引脚复用”,这也就说PA9将被配置成“复用推挽输出模式”,PA10将被配置成“复用上拉输入模式”。 IO引脚的复用功能 我们知道,STM32F4 有很多的片内外设,这些
[单片机]
STM32-串口<font color='red'>通讯</font>协议开发03
74ls164驱动数码管电路 74ls164应用电路
74ls164应用电路 本文采用了74LS164 这个串入并出的移位寄存器,很好地解决了2051 与L ED 的显示接口电路。 1 硬件电路 2051 余下的并行I/ O 口线不足8 根,数据的并行输出已不可能,但可以考虑串行输出方法,图1 给出串行口扩展的4 位L ED 显示接口电路。该电路只使用2051 的3 个端口,配接4 片串入并出移位寄存器74LS164 与1 片三端可调稳压器LM317T 3 结束语 本串行口扩展的LED 显示接口电路已被笔者成功地应用到以AT89C2051 单片机为核心的智能仪表中,如单片机湿度测量仪、单片机温度测量仪等。现场运行表明,LED 显示清晰稳定不闪烁,特别是在现场环境如光照强弱不同的
[单片机]
74ls<font color='red'>16</font>4驱动数码管电路 74ls<font color='red'>16</font>4应用电路
PLC串口通讯通讯接口知识汇总
在使用PLC的时候会接触到很多的通讯协议以及通讯接口,最基本的PLC串口通讯和基本的通讯接口你都了解吗? 一、什么是串口通讯? 串口是一种接口标准,是计算机上一种非常通用设备通信的协议。它规定了接口的电气标准,没有规定接口插件电缆以及使用的协议。典型的串口通讯标准常见有如下三种。 EIA RS232(通常简称“RS232”): 1962年由美国电子工业协会(EIA)制定。 EIA RS485(通常简称“RS485”): 1983年由美国电子工业协会(EIA)制定。 EIA RS422(通常简称“RS485”): 1924年由美国电子工业协会(EIA)制定。 二、串口通讯的使用 串口通讯使用3根线完成:地线;发送;接收。由于
[嵌入式]
PLC串口<font color='red'>通讯</font>和<font color='red'>通讯</font>接口知识汇总
基于Kinetis微控制器和16位/24位MAX5556的立体声音频接口设计
本文给出基于Kinetis MK60N512微控制器和16位/24位音频数模转换器MAX5556的立体声音频接口设计。MK60N512由I2S总线向MAX55 56传输音频数据,输出音频信号经有源滤波器进行滤波,保证音频质量的同时提高其带负载能力。由MK60N512内部高性能可编程的增强型DMA向I2S模块传送音频数据,减轻微控制器内核的负担。 引言 MK60N512是飞思卡尔公司Kinetis系列微控制器集成度最高的芯片,它基于ARM Cortex—M4内核,具有功耗低、性能高、成本低的特点,旨在为嵌入式音频、汽车电子和电源管理等提供灵活的解决方案。MAX5556是美信公司一款低功耗、立体声音频数/模转换器(DAC),支持标
[嵌入式]
基于Kinetis微控制器和<font color='red'>16</font>位/24位MAX5556的立体声音频接口设计
9、PIC系列-输出比较-双比较模式
1、PIC32参考资源 PIC32系列参考手册 中文版 链接地址:PIC32系列参考手册 第16章 输出比较 2、双比较匹配模式简介 当控制位 OCM 2:0 (OCxCON 2:0 )= 100 或 101 时,输出比较配置为 • 单输出脉冲模式 • 连续输出脉冲模式 在双比较模式下,模块在处理比较匹配事件时使用 OCxR 和 OCxRS 这两个寄存器。将 OCxR 寄存器的值与递增定时器 TMRy 计数的值作比较,并且在发生比较匹配事件时,在 OCx 引脚上产生脉冲的前 (上升)沿。然后 OCxRS 寄存器的值与同一个递增定时器 TMRy 计数的值作比较,并且在发生比较匹配事件时,在 OCx 引脚上产生脉冲的
[单片机]
9、<font color='red'>PIC</font>系列-输出比较-双比较模式
iOS 16首个公开测试版将于7月发布 因存在BUG而延后
根据彭博社 Mark Gurman 预测,iOS 16 的首个公开测试版本将会在今年 7 月发布,与通常的时间框架要稍晚一些。首个公开测试版将会第三个开发者测试版同时进行。 通常情况下,苹果在发布第二个开发者测试版时发布 iOS 的第一个公开测试版。因此,如果该消息属实,我们可以推测 iOS 16 的第一个公开测试版将比平时晚几周到达。 Mark Gurman 建议,iOS 16 公开测试版可能会落后进度,而内部的种子在目前是存在一些错误。然而,这些只是目前的猜测,如果事情进展顺利,苹果可能会按时发布公测版。因此,请务必谨慎对待这些消息,因为最终的决定权在苹果手中。 iOS 16 将在下个月的苹果 WWDC 大会上公布。开发人
[手机便携]
iOS <font color='red'>16</font>首个公开测试版将于7月发布 因存在BUG而延后
龙口16个重点项目集中签约 3个项目和储能相关
  5月27日上午,龙口市重点项目签约仪式举行,市委书记吕波出席仪式并致辞,市委副书记、市长李万平主持仪式。   李万平在主持时强调,这次签约的重点项目主要集中在新一代信息技术、高端装备制造、新能源、新材料、旅游康养等领域,是我市加快新旧动能转换、推动高质量发展的动能保障,也是打造县域高质量发展北方样板、山东龙头的重要支撑。牵头部门单位要成立专门工作组推进项目落实,争取项目早落地、早开工、早投产、早见效。   其中3个项目和储能相关   √新能源锂电池及储能设备项目   该项目由山东德晋新能源科技有限公司与新加坡PTS公司合资设立,总投资6亿元,其中外资1000万美元。项目新上2GWh锂电池生产线及储能设
[新能源]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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