久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 42017|回復: 5
收起左側

PCF8563實時時鐘芯片51單片機簡單例程

  [復制鏈接]
ID:70941 發表于 2015-1-23 04:34 | 顯示全部樓層 |閱讀模式
做時鐘顯示如果用單片機做,會產生很大的累積誤差,本程序采用時鐘芯片PCF8563

一:芯片主要電氣特性:
1)大工作電壓范圍:1.0~5.5V
2)400KHz 的 I2C 總線接口(VDD=1.8~5.5V 時)。


時鐘頻率最大400KH

3)i2C 總線從地址:讀,0A3H;寫,0A2H .

二:管腳



電路接線圖:


單片機和PCF8563通信采用IIC協議,單片機讀取時鐘芯片內寄存器數據或者時鐘芯片輸出時間信息給單片機.
本程序知識簡單的顯示時間,也沒有加入芯片損壞延時判斷應答子函數.,只是了解芯片使用方法

IIC總線和LCD1602函數包屬于標準代碼。

IIC協議子函數包

#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int

sbit SDA=P2^2;   //SDA口設置
sbit SCL=P2^3;   //SCL口設置


void delay()    //略微延時  6us約>4.7us
{
_nop_();
  _nop_();
   _nop_();
    _nop_();
         _nop_();
          _nop_();
}

void iic_start()   //啟動信號
{
  SDA=1;
  SCL=1;
  delay();
  SDA=0;
  delay();
  SCL=0;

}

void iic_stop()  //停止信號
{
SDA=0;
SCL=1;
delay();
SDA=1;
delay();
SCL=0;
}

void iic_ack()   //應答信號
{
uchar i=0;
SCL=1;
delay();
while((SDA==1)&&(i<255))
i++;
SCL=0;
delay();
}

void iic_send_byte(uchar bat)  //發送數據
{
uchar i,temp;
temp=bat;
for(i=0;i<=7;i++)
{
  temp=temp<<1;
  SCL=0;
  SDA=CY;
  delay();
  SCL=1;
  delay();
}
SCL=0;
delay();
SDA=1;
delay();
}

uchar iic_rev()  //接受數據
{
  uchar temp,i;
  SCL=0;
  delay();
  SDA=1;
  for(i=0;i<=7;i++)
  {
   SCL=1;
   delay();
   temp=(temp<<1)|SDA;
   SCL=0;
   delay();
  }
  delay();
  return temp;
}

void iic_send_add_byte(uchar add,uchar bat) //向某個地址發送某數據
{
iic_start();
iic_send_byte(0xa2);
iic_ack();
iic_send_byte(add);
iic_ack();
iic_send_byte(bat);
iic_ack();
iic_stop();
}

uchar iic_rec_add_byte(uchar add) //從某個地址讀出數據
{
   uchar temp;
   iic_start();
   iic_send_byte(0xa2);
   iic_ack();
   iic_send_byte(add);
   iic_ack();
   iic_start();
   iic_send_byte(0xa3);
   iic_ack();
   temp=iic_rev();
   iic_stop();
   return temp;
}


LCD1602函數包:

**********************************/
#define LCD1602_DATAPINS P0
sbit LCD1602_E=P2^7;
sbit LCD1602_RW=P2^5;
sbit LCD1602_RS=P2^6;


void Delay1us(uint a)
{       
uint b,c;
for(c=a;c>0;c--)               
for(b=110;b>0;b--);
}

void LCD1602_WriteCom(uchar com)          //寫入命令
{
        LCD1602_E=0;
        LCD1602_RS=0;
        LCD1602_RW=0;
        LCD1602_DATAPINS=com;        //由于4位的接線是接到P0口的高四位,所以傳送高四位不用改
        Delay1us(10);
        LCD1602_E=1;
        Delay1us(10);
        LCD1602_E=0;
        Delay1us(10);
        LCD1602_DATAPINS=com<<4;
        Delay1us(10);
        LCD1602_E=1;
        Delay1us(10);
        LCD1602_E=0;
}

void LCD1602_WriteData(uchar dat)                        //寫入數據
{
        LCD1602_E=0;
        LCD1602_RS=1;
        LCD1602_RW=0;
        LCD1602_DATAPINS=dat;        //由于4位的接線是接到P0口的高四位,所以傳送高四位不用改
        Delay1us(10);
        LCD1602_E=1;
        Delay1us(10);
        LCD1602_E=0;
        LCD1602_DATAPINS=dat<<4;
        Delay1us(10);
        LCD1602_E=1;
        Delay1us(10);
        LCD1602_E=0;
}

void LCD1602_Init()                                                  //LCD初始化子程序
{
        LCD1602_WriteCom(0x32);         //將8位總線轉為4位總線
        LCD1602_WriteCom(0x28);         //在四位線下的初始化
        LCD1602_WriteCom(0x0c);  //開顯示不顯示光標
        LCD1602_WriteCom(0x06);  //寫一個指針加1
        LCD1602_WriteCom(0x01);  //清屏
        LCD1602_WriteCom(0x80);  //設置數據指針起點
}

//----- 主函數---------
#include <reg52.h>
#include "lcd.h"
#include "iic.h"

//-----------延時用于穩定-------------
void delay_kk(uint k)
{
  while(k--);
}

//------------------------------BCD碼講解---
比如十六進制數0x56  如果代表BCD碼,則其就是代表10進制的56  但是在計算機里面如果用于計算他就是86(十進制),所以后面例出BCD轉10進制子函數    PCF8563顯示的數都是BCD碼


//-----------時間預設定值---------
void time_init()
{
   iic_send_add_byte(0x02,0x50);         //0秒
        iic_send_add_byte(0x03,0x59);         //0分鐘   
    iic_send_add_byte(0x04,0x23);          //0小時            
         iic_send_add_byte(0x05,0x26);  //26號
         iic_send_add_byte(0x07,0x05);           //5月  20世紀的
         iic_send_add_byte(0x08,0x14);         //2014年
}



//----------------PCF8563初始化-----------------
void pcf_init()
{
        iic_send_add_byte(0x00,0x00);  //啟動時鐘
}

//----------------BCD轉10進制-----------
uchar bcd_dec(uchar bat)
{
uchar temp1,temp2,tol;
temp1=bat&0x0f;
temp2=(bat&0xf0)>>4;
tol=temp2*10+temp1;
return tol;
}

//------------LCD1602顯示:年,月,日,小時,分鐘,秒,
void display_time(uchar sec,min,hour,dat,moom,year)
{
  LCD1602_WriteCom(0x80);
  LCD1602_WriteData('_');
LCD1602_WriteData('2');
LCD1602_WriteData('0');
LCD1602_WriteData(year/10+48);
LCD1602_WriteData(year%10+48);
LCD1602_WriteData('/');
LCD1602_WriteData(moom+48);
LCD1602_WriteData('/');
LCD1602_WriteData(dat/10+48);
LCD1602_WriteData(dat%10+48);
  LCD1602_WriteCom(0xc4);
   LCD1602_WriteData(hour/10+48);
    LCD1602_WriteData(hour%10+48);
LCD1602_WriteData(':');
LCD1602_WriteData(min/10+48);
LCD1602_WriteData(min%10+48);
LCD1602_WriteData(':');
LCD1602_WriteData(sec/10+48);
LCD1602_WriteData(sec%10+48);
}

void main()
{
   uchar sec,min,hour,dat,moom,year,sec1,min1,hour1,dat1,moom1,year1;  //PCF8563讀出的變量和代轉換成的十進制變量
   LCD1602_Init();
   iic_send_add_byte(0x00,0x20);  // 關閉時鐘
  delay_kk(1000);
         time_init();    //時鐘芯片初始時間設置
         pcf_init();
    delay_kk(1000);
  while(1)
  {
            sec=0x7f&iic_rec_add_byte(0x02);    //讀取秒
         min=0x7f&iic_rec_add_byte(0x03);   //讀取分鐘
         hour=0x3f&iic_rec_add_byte(0x04);  //讀取小時
         dat=0x3f&iic_rec_add_byte(0x05);   //讀取天數
         moom=0x1f&iic_rec_add_byte(0x07);  //讀取月
         year=0xff&iic_rec_add_byte(0x08);    //讀取年
         sec1=bcd_dec(sec);                   //將讀取的BCD碼秒轉換成十進制秒以便運算
         min1=bcd_dec(min);
         hour1=bcd_dec(hour);
         dat1=bcd_dec(dat);
         moom1=bcd_dec(moom);
         year1=bcd_dec(year);
         display_time(sec1,min1,hour1,dat1,moom1,year1);   //LCD1602顯示時間
  }                                          
}












回復

使用道具 舉報

ID:110935 發表于 2016-6-14 22:56 | 顯示全部樓層
沒得調時鐘嗎?
調時鐘時光標如何設置走動
回復

使用道具 舉報

ID:574155 發表于 2019-6-28 15:34 | 顯示全部樓層
感謝樓主分享
回復

使用道具 舉報

ID:190832 發表于 2019-6-29 10:09 | 顯示全部樓層
8563一點都不好用。如果用到PCF8563的中斷的話建議用RX8025,PCF8563需要軟件清中斷,用起來麻煩,可能會打斷IIC時序,程序處理不方便。RX8025不用軟件清中斷,很方便
回復

使用道具 舉報

ID:538496 發表于 2020-3-27 10:56 | 顯示全部樓層
感謝樓主分享學習了
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 97伦理电影网 | 国产精品特级毛片一区二区三区 | 视频1区 | 日本成人在线观看网站 | 色伊人久久 | 嫩草视频网 | 国产精品色 | 日韩免费1区二区电影 | 国产精品视频二区三区 | 国产一区二区三区视频 | 久久精品网 | 色综合久久88色综合天天 | 精品免费视频一区二区 | www.久久久久久久久久久 | 国产一区二区黑人欧美xxxx | av黄色免费 | 精品乱子伦一区二区三区 | 欧洲视频一区二区 | 男人天堂网址 | 99久久免费精品国产男女高不卡 | 日韩成人国产 | 国产91久久精品一区二区 | 国产极品粉嫩美女呻吟在线看人 | 人人干人人爽 | 爱高潮www亚洲精品 中文字幕免费视频 | 中文字幕av一区二区三区 | 国产精品地址 | www.久久 | 高清久久久 | www.精品一区 | 日韩精品一区二区三区中文在线 | av手机在线免费观看 | 婷婷国产一区二区三区 | 久久久视 | 国产美女自拍视频 | 成人在线精品视频 | 欧美极品视频 | 黄网站在线播放 | 精品1区2区 | 国产精品日韩在线观看一区二区 | 久久精品国产一区二区电影 |