PCF8563的51程序

发布者:心愿成真最新更新时间:2016-10-30 来源: eefocus关键字:PCF8563  51程序 手机看文章 扫描二维码
随时随地手机看文章
#include

sbit SDA=P2^2;
sbit SCL=P2^1;
void start(void);                     // I2C起始
void stop(void);                     // I2C结束
void ACK(void);                     // CPU应答
void NACK(void);                   // CPU非应答
bit Sendbyte(unsigned char data0); // 向pcf8563发送1字节数据或地址
unsigned char Receivebyte(void);   // 读取pcf8563 1字节数据
void Set8563(unsigned char *p2);   // 设置pcf8563初始时间
void Get8563(void);                        // 读取pcf8563当前时间
void delaynms(unsigned char k);    // ms延时
void delay1s();                                // 延时子程序 1s
void leddisplay();                            // 数码管显示
unsigned char ledxs[8];                  // 年-月-日  时-分-秒  轮流显示缓冲区
unsigned char time[7];                   // 当前时间,格式: 秒 分 时 日  星期  月  年
unsigned char settime[9]={0x00,0x1f,0x00,0x28,0x09,0x27,0x02,0x04,0x10};
           //时间初始值: 控制1 控制2  秒   分   时   日 星期   月   年
unsigned char code tab[]={0xb7,0x12,0x67,0x76,0xd2,0xf4,0xf5,0x16,0xf7,0xf6,0xd7,0xf1,0xa5,0x73,0xe5,0xc5,0,0xff,0x40};
                          //共阴极代码 0-F,  全灭,全亮,‘-’
void main()
{
  unsigned char i,j,k;
  delaynms(200);
  Set8563(settime); // 设置初始时间
  while(1)
  {
    k=3;
    while(k>0)   // 年-月-日  显示3秒   ( 10-04-27 )
    {
      Get8563();    //取得当前时间
      ledxs[0]=time[6]>>4;
      ledxs[1]=time[6]&0x0f;  // 年
      ledxs[2]=18;        // -
      ledxs[3]=(time[5]&0x1f)>>4;
      ledxs[4]=(time[5]&0x1f)&0x0f; // 月
      ledxs[5]=18;       // -
      ledxs[6]=(time[3]&0x3f)>>4;
      ledxs[7]=(time[3]&0x3f)&0x0f; // 日
      for(i=0;i<8;i++) //显示
      {
        SBUF=tab[ledxs[i]];
        while(TI==0);
        TI=0;
      }
      k--;
      delay1s();
     }
     k=100;
     while(k>0)    // 时-分-秒   显示10秒    ( 09-28-00 )
     {
       Get8563();    //取得当前时间
       ledxs[0]=(time[2]&0x3f)>>4;
       ledxs[1]=(time[2]&0x3f)&0x0f;//  时
       ledxs[2]=18;
       ledxs[3]=(time[1]&0x7f)>>4;
       ledxs[4]=(time[1]&0x7f)&0x0f; //  分
       ledxs[5]=18;
       ledxs[6]=(time[0]&0x7f)>>4;
       ledxs[7]=(time[0]&0x7f)&0x0f; //  秒
       for(i=0;i<8;i++)  //显示
       {
         SBUF=tab[ledxs[i]];
         while(TI==0);
         TI=0;
       }
       k--;
       delaynms(100);
     }
   }
}

//-------------------------------------------------------------------
//CPU产生I2C起始信号,SCL高电平期间,SDA由1到0
//------------------------------------------------------------------
void start()
{
  unsigned char i;
  SDA=1;            //SDA置1
  i=2;while(--i);
  SCL=1;            //SCL置为高电平
  i=2;while(--i);
  SDA=0;            //SDA清0
  i=2;while(--i);
  SCL=0;            //SCL恢复低电平
}
//---------------------------------------------------------------------
//CPU产生I2C结束信号,SCL高电平期间,SDA由0到1
//--------------------------------------------------------------------
void stop()
{
  unsigned char i;
  SDA=0;            //SDA清0
  i=2;while(--i);
  SCL=1;            //SCL置为高电平
  i=2;while(--i);
  SDA=1;            //SDA置1
  i=2;while(--i);
  SCL=0;            //SCL恢复低电平
}
//--------------------------------------------------------------------------------------
//CPU产生应答信号(CPU接收数据后)接收方产生应答或非应答信号
//24c64自动产生,cpu需要调用程序
//---------------------------------------------------------------------------------------
void ACK()
{
  unsigned char i;
  SDA=0;            //SDA清0
  i=2;while(--i);
  SCL=1;
  i=2;while(--i);
  SCL=0;
  i=2;while(--i);
  SDA=1;
}
//-------------------------------------------------------
//CPU产生非应答信号 (CPU接收数据后)
//-------------------------------------------------------
void NACK()
{
  unsigned char i;
  SDA=1;            //SDA置1
  i=2;while(--i);
  SCL=1;
  i=2;while(--i);
  SCL=0;
  i=2;while(--i);
}
//-------------------------------------------------------------------------------------------
//CPU向pcf8563发送一个字节数据或地址,并检查pcf8563发回的确认信号
//返回标志位flag,0应答,1非应答。
//-------------------------------------------------------------------------------------------
bit Sendbyte(unsigned char data0)
{
  unsigned char i,j;
  bit flag;
  for(j=0;j<8;j++)    //发送一个字节 (1次发送1位)
  {
    SCL=0;
    i=2;while(--i);
    if(data0&0x80)   //取data0最高位
       SDA=1;
    else
       SDA=0;
    i=2;while(--i);
    SCL=1;
    i=2;while(--i);
    data0=data0<<1;  //data0左移1位
  }
//以下为检查pcf8563应答信号
  SCL=0;
  i=2;while(--i);
  SDA=1;           //数据线拉高
  i=2;while(--i);
  SCL=1;
  i=2;while(--i);
  flag=SDA;       //读应答信号
  SCL=0;
  i=2;while(--i);
  return flag;  //pcf8563正确接收,返回0(ACK);不正确接收,返回1(NOACK)。
}
//--------------------------------------------------
//CPU接收pcf8563发送来的一个字节
//--------------------------------------------------
unsigned char Receivebyte()
{
  unsigned i,j,data0;
  SCL=0;
  i=2;while(--i);
  SDA=1;
  for(j=0;j<8;j++)   //1次接收1位
  {
    data0=data0<<1;
    SCL=1;
    i=2;while(--i);
    if(SDA) data0=data0+1;  //接收数据存在最低位
    i=2;while(--i);
    SCL=0;
    i=2;while(--i);
  }
  return data0;      //返回接收的数据
}

//---------------------------------------------------------------------------------
// 功能: 设置初始时间
// 初始时间格式为: 秒 分 时 日  星期 月 年
// 向pcf8563写入9个字节,前2个为控制字,后7个为初始时间
//---------------------------------------------------------------------------------
void Set8563(unsigned char *p1)
{        
  unsigned char flag,count=9,addr=0x00;
  start();                      // CPU发起始信号
  flag=Sendbyte(0xa2);          // CPU发器件地址
  while(flag) {Sendbyte(0xa2);} // 检查确认信号,不正确则重发
  flag=Sendbyte(addr);          // CPU发起始单元地址
  while(flag) {Sendbyte(addr);} // 检查确认信号,不正确则重发
  while(count--)
  {
    flag=Sendbyte(*p1);            // 发送1个数据
    while(flag) {Sendbyte(*p1);}   // 检查确认信号,不正确则重发
    p1++;                          // 修改指针
  }
  stop();                          //CPU发结束信号
  delaynms(10);
}
//------------------------------------------------------------------------
// 功能: 读取DS1302当前时间
// 时间格式为: 秒 分 时 日 星期 月 年
// 读取7个字节
//------------------------------------------------------------------------
void Get8563(void)
{
  unsigned char i,flag,addr=0x02;
  //以下是伪写
  start();                       // CPU发起始信号
  flag=Sendbyte(0xa2);           // CPU发器件地址
  while(flag) {Sendbyte(0xa2);}  // 检查确认信号,不正确则重发
  flag=Sendbyte(addr);           // CPU发起始单元地址
  while(flag) {Sendbyte(addr);}  // 检查确认信号,不正确则重发
  //以下是读n个字节
  start();                       // CPU发起始信号
  flag=Sendbyte(0xa3);           // CPU发器件地址
  while(flag) {Sendbyte(0xa3);}
  for(i=0;i<6;i++)               // 读取前6个字节
  {
    time[i]=Receivebyte();       // 读取1个字节
    ACK();                       // cpu发应答信号
    addr++;                      // 修改地址
  }
  time[6]=Receivebyte();         // 读取最后1个字节
  NACK();                        // cpu发送非应答信号
  stop();                        // CPU发结束信号
}
void delaynms(unsigned char k)  //延时 n ms
{
  while(k)
  {
  int i;
  i=110;
  while(i--);
  k=k-1;
  }
}
void delay1s()         //延时 1 s
{
  int i;
  i=56000;
  while(i--);
  i=56000;
  while(i--);
}

关键字:PCF8563  51程序 引用地址:PCF8563的51程序

上一篇:矩阵键盘的51程序
下一篇:X9313的51程序

推荐阅读最新更新时间:2024-03-16 15:18

基于C8051F020的示波器监控程序的设计
  监控程序负责系统中全部硬件和软件资源的分配、调度工作,它提供用户接口,使用户获得友好的工作环境,是系统设计中一个重要组成部分。   1 C8051F020单片机概述   伴随着电子技术快速的发展,越来越多的人加入电子开发的大军。在学习电子技术和研发项目的过程中,避免不了要使用一些仪器,例如万用表、示波器等等,然而对于一些非专业的爱好者,拥有一台数字示波器是比较 奢侈 的。本设计C8051F020单片机,因其具有成本低、制作简单、测量精度高等优势,恰恰满足了这一部分人的需求。   C8051F020单片机是高度集成的片上系统。在芯片内集成了2个多通道ADC子系统(每个子系统包括1个可编程增益放大器和1个模拟多路选择
[单片机]
基于C80<font color='red'>51</font>F020的示波器监控<font color='red'>程序</font>的设计
IC总线读写程序-51
//-----------------------函数声明,变量定义-------------------------------------------------------- #include #include sbit SDA=P1^0; // 将p1.0口模拟数据口 sbit SCL=P1^1; // 将p1.1口模拟时钟口 #define NUM 10 // 接收和发送缓存区的深度 #define delayNOP(); {_nop_();_nop_();_nop_();_nop
[单片机]
MCS-51汇编语言程序的一般格式
与8086不同,没有代码段、数据段等区分,统一编址。 程序由指令行或注释行组成,指令行每行只能写一条指令。 指令前可用“标号:”表示指令地址,以便在指令中引用;标号是符号名,以字母开头。 注释行应以“;”号开头;指令后也可用“;”号分隔,附加注释。 程序由伪指令ORG XXXXH 定位,ORG中的16位地址就是将来写入程序存储器的绝对地址。程序中的ORG应按地址从小到大排列。由ORG定位的程序段可以不连续,汇编程序将会在段间的空地址上填00H,即NOP。因此,每个ORG段的最后一条指令一般应是转移指令。 数据由伪指令DB(字节)或DW(双字节)说明。数值应以数码0-9开头;尾缀说明:B-二进制,D-十进制,H-十六进
[单片机]
LED流星雨C51程序
P1口上接8个led灯可以实现流星雨效果,测试成功. #include reg52.h #define uchar unsigned char #define led P1 bit flag=0; uchar code lshift ={0x07,0x03,0x01}; uchar code shift ={0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe}; //imitate PWM data uchar code sta0 ={ 0x0f,0x8f,0x8f,0x8f,0x8f,0x8f,0x8f,0x8f,0x8f,0x8f, 0xcf,0xcf,0xcf,0x
[单片机]
51单片机PID的算法实现程序C语言
/* 用整型变量来实现PID算法,由于是用整型数来做的,所以也不是很精确,但是对于很多的使用场合,这个精度也够了, 关于系数和采样电压全部是放大10倍处理的.所以精度不是很高. 但是也不是那么低,大部分的场合都够了. 实在觉得精度不够, 可以再放大10倍或者100倍处理,但是要注意不超出整个数据类型的范围就可以了.本程序包括PID计算和输出两部分. 当偏差 10度全速加热,偏差在10度以内为PID计算输出. 具体的参考代码参见下面: */ //================================================================ // pid.H // Operation abou
[单片机]
基于51单片机直流电机PWM调速程序
这是一款AT89C51单片机直流电机PWM调速程序,程序可以直接用于AT89C52、AT89S51、AT89S51,STC89C51、STC89C52单片机中,单片机晶振采用11.0592M,直流电机由L298集成电路控制,产生的PWM的频率约为91Hz。L298各引脚已在程序中标明,原理图大家可以自己画一下,这里就不具给出。下面是源程序。 #include[reg52.h》//注意请把‘ [ ’换成 “《”,下同。否则编译时会出错。 #include [intrins.h》// #define uchar unsigned char #define uint unsigned int sbit en1=P2^0; sbit
[单片机]
基于<font color='red'>51</font>单片机直流电机PWM调速<font color='red'>程序</font>
51单片机 Keil C 延时程序的简单研究
应用单片机的时候,经常会遇到需要短时间延时的情况。需要的延时时间很短,一般都是几十到几百微妙(us)。有时候还需要很高的精度,比如用单片机驱动DS18B20的时候,误差容许的范围在十几us以内,不然很容易出错。这种情况下,用计时器往往有点小题大做。而在极端的情况下,计时器甚至已经全部派上了别的用途。这时就需要我们另想别的办法了。 以前用汇编语言写单片机程序的时候,这个问题还是相对容易解决的。比如用的是12MHz晶振的51,打算延时20us,只要用下面的代码,就可以满足一般的需要: mov r0, #09h loop: djnz r0, loop 51单片机的指令周期是晶振频率的1/12,也就是1us一个周期。
[单片机]
C51单片机与PC串口通信的单片机部分程序
注意波特率是9600 功能:电脑通过串口给单片机发一个字节,单片机收到后又给电脑发回去 #include reg52.h #define uchar unsigned char #define uint unsigned int uint temp; bit flag; void init_ser1(); main() { init_ser1(); while(1) { if(RI==1) { P1=SBUF; RI=0; } if(flag==1) { ES=0;//暂时关闭接收 flag=0; SBUF=temp; while(!TI);//等待发送完毕 TI=0; ES=
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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