1. 程式人生 > >PCF8563時鐘晶片(C語言微控制器編寫)

PCF8563時鐘晶片(C語言微控制器編寫)

#i nclude <reg51.h>
#i nclude <intrins.h>
sbit SDA=P1^0;                          // 將p1.0口模擬資料口
sbit SCL=P1^1;                          // 將p1.1口模擬時鐘口
#define MIN    0x02 //秒暫存器
#define SEC    0x03 //分暫存器
#define HOUR   0x04 //時暫存器
#define DAY    0x05 //日暫存器
#define WEEK   0x06 //周暫存器
#define MONTH 0x07 //月暫存器
#define YEAR   0x08 //年暫存器
#define read_ADD 0xA3 //寫器件地址
#define write_ADD 0xA2 //讀器件地址
#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};                 
unsigned char g8563_Store[4]; /*時間交換區,全域性變數宣告*/
unsigned char code c8563_Store[4]={0x00,0x59,0x07,0x01}; /*寫入時間初值:星期一 07:59:00*/

bit   bdata SystemError;                // 從機錯誤標誌位
//--------------------------------------------------------------------------------------------------
// 函式名稱: iic_start()
// 函式功能: 啟動I2C匯流排子程式
//--------------------------------------------------------------------------------------------------
void iic_start(void)
{ EA=0;            //時鐘保持高,資料線從高到低一次跳變,I2C通訊開始
SDA = 1;        
SCL = 1;
delayNOP();      // 延時5us
SDA = 0;
delayNOP();
SCL = 0;
}
//--------------------------------------------------------------------------------------------------
// 函式名稱: iic_stop()
// 函式功能: 停止I2C匯流排資料傳送子程式
//--------------------------------------------------------------------------------------------------
void iic_stop(void)
{
SDA = 0;       //時鐘保持高,資料線從低到高一次跳變,I2C通訊停止
SCL = 1;
delayNOP();
SDA = 1;
delayNOP();
SCL = 0;
}
//--------------------------------------------------------------------------------------------------
// 函式名稱: slave_ACK
// 函式功能: 從機發送應答位子程式
//--------------------------------------------------------------------------------------------------
void slave_ACK(void)
{
SDA = 0;   
SCL = 1;
delayNOP();   
SDA = 1;
SCL = 0;
}
//--------------------------------------------------------------------------------------------------
// 函式名稱: slave_NOACK
// 函式功能: 從機發送非應答位子程式,迫使資料傳輸過程結束
//--------------------------------------------------------------------------------------------------
void slave_NOACK(void)
{
SDA = 1;  
SCL = 1;
delayNOP();
SDA = 0;
SCL = 0;
}
//--------------------------------------------------------------------------------------------------
// 函式名稱: check_ACK
// 函式功能: 主機應答位檢查子程式,迫使資料傳輸過程結束
//--------------------------------------------------------------------------------------------------
void check_ACK(void)
{
SDA = 1;      // 將p1.0設定成輸入,必須先向埠寫1
SCL = 1;
F0 = 0;
if(SDA == 1)    // 若SDA=1表明非應答,置位非應答標誌F0
   F0 = 1;
SCL = 0;
}

//--------------------------------------------------------------------------------------------------
// 函式名稱: IICSendByte
// 入口引數: ch
// 函式功能: 傳送一個位元組
//--------------------------------------------------------------------------------------------------
void IICSendByte(unsigned char ch)
{
unsigned char idata n=8;     // 向SDA上傳送一位資料位元組,共八位
while(n--)
{
   if((ch&0x80) == 0x80)    // 若要傳送的資料最高位為1則傳送位1
   {
    SDA = 1;    // 傳送位1
    SCL = 1;
    delayNOP();
    SDA = 0;
    SCL = 0;   
   }
   else
   {
    SDA = 0;    // 否則傳送位0
    SCL = 1;
    delayNOP();
    SCL = 0;
   }
   ch = ch<<1;    // 資料左移一位
}
}
//--------------------------------------------------------------------------------------------------
// 函式名稱: IICreceiveByte
// 返回接收的資料
// 函式功能: 接收一位元組子程式
//--------------------------------------------------------------------------------------------------
unsigned char IICreceiveByte(void)
{
unsigned char idata n=8;    // 從SDA線上讀取一上資料位元組,共八位
unsigned char tdata;
while(n--)
{
   SDA = 1;
   SCL = 1;
   tdata = tdata<<1;    // 左移一位,或_crol_(temp,1)
   if(SDA == 1)
    tdata = tdata|0x01;    // 若接收到的位為1,則資料的最後一位置1
   else
    tdata = tdata&0xfe;    // 否則資料的最後一位置0
   SCL=0;
}
return(tdata);
}
//--------------------------------------------------------------------------------------------------
// 使用者呼叫子程式
// 函式名稱: write_CFGbyte
// 入口引數: CFG_add暫存器地址,CFG_data要寫入暫存器的數值
// 函式功能: 傳送n位資料子程式
//--------------------------------------------------------------------------------------------------
void write_CFGbyte(unsigned char CFG_add,unsigned char CFG_data)
{         
//unsigned char idata send_da,i=0;
iic_start();                // 啟動I2C
IICSendByte(write_ADD);     // 傳送器件寫地址
check_ACK();                // 檢查應答位
    if(F0 == 1)
{
   SystemError = 1;
   return;    // 若非應答表明器件錯誤或已壞,置錯誤標誌位SystemError
}
IICSendByte(CFG_add);       // 傳送暫存器地址
check_ACK();                // 檢查應答位
    if(F0 == 1)
{
   SystemError = 1;
   return;    // 若非應答表明器件錯誤或已壞,置錯誤標誌位SystemError
}
    IICSendByte(CFG_data);       // 傳送暫存器資料
check_ACK();                // 檢查應答位
    if(F0 == 1)
{
   SystemError = 1;
   return;    // 若非應答表明器件錯誤或已壞,置錯誤標誌位SystemError
}
iic_stop();         // 全部發完則停止
}
//--------------------------------------------------------------------------------------------------
// 使用者呼叫子程式
// 函式名稱: receiveNbyte
// 入口引數: CFG_add暫存器地址地址
// 出口引數: receive_da
// 函式功能: 接收某個暫存器資料子程式
//--------------------------------------------------------------------------------------------------
unsigned char receive_CFGbyte(unsigned char idata CFG_add)
{
unsigned char idata receive_da;
iic_start();
    IICSendByte(write_ADD); //器件寫地址
check_ACK();
if(F0 == 1)
{
   SystemError = 1;
   return(0);
}
IICSendByte(CFG_add); //暫存器地址
check_ACK();
if(F0 == 1)
{
   SystemError = 1;
   return(0);
}
     iic_start();
    IICSendByte(read_ADD); //器件讀地址
   if(F0 == 1)
{
   SystemError = 1;
   return(0);
}
    receive_da=IICreceiveByte();
   slave_NOACK();       // 收到最後一個位元組後傳送一個非應答位
iic_stop();
return(receive_da);
}
//--------------------------------------------------------------------------------------------------
// 使用者呼叫函式
// 函式名稱: receive_CFGNbyte
// 入口引數: CFG_add暫存器地址地址,n連續讀數位,* buff儲存區地址
// 函式功能: 接收n個暫存器資料子程式
//--------------------------------------------------------------------------------------------------
void receive_CFGNbyte(unsigned char CFG_add, unsigned char n,unsigned char * buff)
{
unsigned char receive_da,i=0;
iic_start();
    IICSendByte(write_ADD); //器件寫地址
check_ACK();
if(F0 == 1)
{
   SystemError = 1;
   return;
}
IICSendByte(CFG_add); //暫存器地址
check_ACK();
if(F0 == 1)
{
   SystemError = 1;
   return;
}
   iic_start();
    IICSendByte(read_ADD); //器件讀地址
   if(F0 == 1)
{
   SystemError = 1;
   return;
}
while(n--)
{
   receive_da=IICreceiveByte();
   buff[i++]=receive_da;
   slave_ACK();    // 收到一個位元組後傳送一個應答位
}
slave_NOACK();    // 收到最後一個位元組後傳送一個非應答位
iic_stop();
}
//--------------------------------------------------------------------------------------------------
// 使用者呼叫函式
// 函式名稱: P8563_Readtime
// 函式功能: 讀出時間資訊
//--------------------------------------------------------------------------------------------------
void P8563_Readtime()
{   unsigned char time[7];
    receive_CFGNbyte(MIN,0x07,time);
    g8563_Store[0]=time[0]&0x7f; /*秒*/
    g8563_Store[1]=time[1]&0x7f; /*分*/
    g8563_Store[2]=time[2]&0x3f; /*小時*/
    g8563_Store[3]=time[4]&0x07; /*星期*/
}
//--------------------------------------------------------------------------------------------------
// 使用者呼叫函式
// 函式名稱: P8563_settime
// 函式功能: 寫時間修改值
//--------------------------------------------------------------------------------------------------
void P8563_settime()
{
     unsigned char i;
     for(i=2;i<=4;i++) { write_CFGbyte(i,g8563_Store[i-2]); }
     write_CFGbyte(6,g8563_Store[3]);
}
//--------------------------------------------------------------------------------------------------
// 使用者呼叫函式
// 函式名稱: P8563_init
// 函式功能: 初始設定
//--------------------------------------------------------------------------------------------------
void P8563_init()
{
    unsigned char i;
    if((receive_CFGbyte(0x0a))!=0x8) /*檢查是否第一次啟動,是則初始化時間*/
    {
        for(i=0;i<=3;i++)
   g8563_Store[i]=c8563_Store[i]; /*初始化時間*/
        P8563_settime();
        write_CFGbyte(0x0,0x00);
        write_CFGbyte(0xa,0x8); /*8:00報警*/
        write_CFGbyte(0x01,0x12); /*報警有效*/
        write_CFGbyte(0xd,0xf0);
    }
}

相關推薦

PCF8563時鐘晶片C語言微控制器編寫

#i nclude <reg51.h>#i nclude <intrins.h>sbit SDA=P1^0;                          // 將p1.0口模擬資料口sbit SCL=P1^1;                  

漢諾塔的故事C語言——遞歸

code log 圓盤 印度 return 16px move class baidu 漢諾塔:   漢諾塔(又稱河內塔)問題是源於印度一個古老傳說的益智玩具。大梵天創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞著64片黃金圓盤。大梵天命令婆羅門把圓盤

資料結構---棧C語言陣列實現

https://blog.csdn.net/morixinguan/article/details/51374184 資料結構---棧(C語言陣列實現)   棧的全名稱為堆疊,棧其實就是與佇列相反的過程,佇列是先進先出,而棧便是先進後出了,如下圖:  

資料結構---佇列C語言陣列實現

https://blog.csdn.net/morixinguan/article/details/51374296 資料結構---佇列(C語言陣列實現)   佇列是先進先出的過程。簡單地畫一幅畫來描述一下佇列: 一個簡單的、由陣列實現的佇列,可以由以下幾種最基本的操

二叉樹刪除前面節點C語言初始版

#include <stdlib.h> #include <stdio.h> typedef struct node { int key; struct node *left; struct node *right; } Btree; Btr

每日一題C語言基礎篇2

題目描述:使用C語言將一個整型數字轉換成字串並倒序列印,例如:123轉換成字串321,-1234轉換成字串-4321。 程式碼實現: #include <stdio.h> #include

51nod1005大數加法C語言實現大數

大數相加 基本思路是: 1、兩個字串把大數讀進來  然後把每一位字元換成數字存到 x y 數組裡面 2、拿 x  y 陣列從後往前 對應位相加  (注意進位) 相加的結果依次存到 c數組裡 3、然後對c陣列處理 如果最高位小於0  那麼結果肯定是負數  就列印一個負

離散數學真值表c語言程式設計實現

程式碼如下: 廢話不多說: 主要利用二進位制的轉化實現  #include <iostream> #include <math.h> using namespace std; void shuru(char *p,int s); void shu

靜態連結串列插入和刪除操作詳解C語言程式碼實現

本節主要講解靜態連結串列的插入和刪除操作,有關靜態連結串列的詳細講解請閱讀《靜態連結串列及C語言實現》一文。 在講解靜態連結串列的插入和刪除操作之前,我們假設有如下的靜態連結串列: 圖中,array[0] 用作備用連結串列的頭結點,array[1] 用作存放資料的連結串列的頭結點,array[0]

PTA練習:猜數字C語言,通俗解法

一群人坐在一起,每人猜一個 100 以內的數,誰的數字最接近大家平均數的一半就贏。本題就要求你找出其中的贏家。 輸入格式: 輸入在第一行給出一個正整數N(≤104​​)。隨後 N 行,每行給出一個玩家的名字(由不超過8個英文字母組成的字串)和其猜的正整數(≤ 100)。 輸出

樹刪除前面節點C語言初始版

#include <stdlib.h> #include <stdio.h> typedef struct node { int key; struct node *left; struct node *right

2018 第九屆藍橋杯省賽總結 + 解題報告C語言B組

2018/4/1,我參加了藍橋杯C語言B組湖南省賽,今年第三次參加藍橋杯了,雖然會的東西比去年多了不少,但是發揮卻不如上次,最大的總結就是要細心啊! 1.第幾天 2000年的1月1日,是那一年的第1天。 那麼,2000年的5月4日,是那一

每日一題C語言基礎篇1

題目描述:判斷字串2是否是字串1的子集。例如"AB"是"ABCDEF"的子集,“DEF”也是“ABCDEF”的子集。 程式碼實現: #include <stdio.h> #define

十進位制轉二進位制、八進位制、十六進位制C語言指標實現

以下程式碼可以實現十進位制到二進位制、八進位制、十六進位制的任意轉換。 #include<stdio.h> #include<string.h> void fun10_2_8_16(char *p,int number,int cet) { if(number

原碼、反碼和補碼C語言 計算機原理

原碼、反碼和補碼  1).資料在記憶體中儲存的時候都是以二進位制的形式儲存的.     int num = 10;     原碼、反碼、補碼都是二進位制.只不過是二進位制的不同的表現形式.     資料是以補碼的二進位制儲存的.  2). 1個int型別的

沒看到能打的,遍歷目錄並讀取目錄下的檔案列表。C語言,SDK

遍歷目錄並讀取目錄下的所有檔案,這個功能經常用,也簡單,很多年前就看過網上的程式碼,感覺寫複雜了,而且還浪費棧,發文的人說會“爆棧”(而且還不是一個人)。當時看到那些程式碼就覺得寫的不好,不過覺得無關痛癢沒有發博文。N年過去,遇到類似的情況,有點忍不住,這麼簡單的東西。今天專

穿越雷區第六屆藍橋杯大賽個人賽決賽C語言A組第四題

標題:穿越雷區 X星的坦克戰車很奇怪,它必須交替地穿越正能量輻射區和負能量輻射區才能保持正常運轉,否則將報廢。 某坦克需要從A區到B區去(A,B區本身是安全區,沒有正能量或負能量特徵),怎樣走才能路徑最短? 已知的地圖是一個方陣,上面用字母標出了A,B區,其它區都標了正號

快速排序演算法c語言演算法實現-------精簡原理分析

    “快速排序法”使用的是遞迴原理,下面我結合一個例子來說明“快速排序法”的原理。首先給出一個數組{53,12,98,63,18,72,80,46, 32,21},先找到第一個數--53,把它作為中間值,也就是說,要把53放在一個位置,使得它左邊的值比它小,右邊的值比它大。{21,12,32, 46,18

c語言課程設計學生成績管理系統

#include<stdio.h> #include<stdlib.h> #include<time.h> #include<conio.h> #include<string.h> #include<algo

數獨求解c語言以及python

/* ============================================================================ Name : sudoku.c Author : Joey Version