欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
15W205S單片機+PCF8563 時鐘不動 求幫助
[打印本頁]
作者:
jeffphoon
時間:
2020-7-20 14:00
標題:
15W205S單片機+PCF8563 時鐘不動 求幫助
找了很多資料,還是不能讓時鐘動起來。
請大家看看我的原始碼有哪里做錯了。
單片機源程序如下:
#include "reg52.h"
#include "stdio.h"
#include "intrins.h"
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#define S1_S0 0x40 //P_SW1.6
#define S1_S1 0x80 //P_SW1.7
sfr P_SW1 = 0xA2;
#define _Nop() _nop_() /*定義空指令*/
sfr P5=0xC8;
sbit SCL=P5^5; //I2C 時鐘
sbit SDA=P5^4; //I2C 數據
bit ack; /*應答標志位*/
uchar tmpdate[7]={0x50,0x30,0x17,0x25,0x05,0x12,0x20}; //時間初始化:秒、分、時、日、星期、月、年
uchar rtc_address[7]={0x02,0x03,0x04,0x05,0x06,0x07,0x08}; //PCF8563中的秒、分、時、日、星期、月、年寄存器地址
int sqsend,MsCount;
void Init(void)
{
//Serial P36,P37
ACC = P_SW1;
ACC &= ~(S1_S0 | S1_S1); //S1_S0=1 S1_S1=0
ACC |= S1_S0; //(P3.6/RxD_2, P3.7/TxD_2)
P_SW1 = ACC;
//定時器
AUXR |= 0x80; //定時器時鐘1T模式
TMOD &= 0xF0; //設置定時器模式
TL0 = 0xCD; //設置定時初值
TH0 = 0xD4; //設置定時初值
ET0 = 1;
TR0 = 1; //定時器0開始計時
EA = 1;
//Braud 9600
SCON = 0x50;
AUXR |= 0x01;
AUXR |= 0x04;
T2L = 0xE0;
T2H = 0xFE;
AUXR |= 0x10;
sqsend=0;
MsCount=0;
}
/*******************************************************************
起動總線函數
函數原型: void Start_I2c();
功能: 啟動I2C總線,即發送I2C起始條件.
********************************************************************/
void Start_I2c()
{
SDA=1; /*發送起始條件的數據信號*/
_Nop();
SCL=1;
_Nop(); /*起始條件建立時間大于4.7us,延時*/
_Nop();
_Nop();
_Nop();
_Nop();
SDA=0; /*發送起始信號*/
_Nop(); /* 起始條件鎖定時間大于4μs*/
_Nop();
_Nop();
_Nop();
_Nop();
SCL=0; /*鉗住I2C總線,準備發送或接收數據 */
_Nop();
_Nop();
}
/*******************************************************************
結束總線函數
函數原型: void Stop_I2c();
功能: 結束I2C總線,即發送I2C結束條件.
********************************************************************/
void Stop_I2c()
{
SDA=0; /*發送結束條件的數據信號*/
_Nop(); /*發送結束條件的時鐘信號*/
SCL=1; /*結束條件建立時間大于4μs*/
_Nop();
_Nop();
_Nop();
_Nop();
_Nop();
SDA=1; /*發送I2C總線結束信號*/
_Nop();
_Nop();
_Nop();
_Nop();
}
/*******************************************************************
字節數據發送函數
函數原型: void SendByte(UCHAR c);
功能: 將數據c發送出去,可以是地址,也可以是數據,發完后等待應答,并對
此狀態位進行操作.(不應答或非應答都使ack=0)
發送數據正常,ack=1; ack=0表示被控器無應答或損壞。
********************************************************************/
void SendByte(unsigned char c)
{
unsigned char BitCnt;
for(BitCnt=0;BitCnt<8;BitCnt++) /*要傳送的數據長度為8位*/
{
if((c<<BitCnt)&0x80)SDA=1; /*判斷發送位*/
else SDA=0;
_Nop();
SCL=1; /*置時鐘線為高,通知被控器開始接收數據位*/
_Nop();
_Nop(); /*保證時鐘高電平周期大于4μs*/
_Nop();
_Nop();
_Nop();
SCL=0;
}
_Nop();
_Nop();
SDA=1; /*8位發送完后釋放數據線,準備接收應答位*/
_Nop();
_Nop();
SCL=1;
_Nop();
_Nop();
_Nop();
if(SDA==1)ack=0;
else ack=1; /*判斷是否接收到應答信號*/
SCL=0;
_Nop();
_Nop();
}
/*******************************************************************
字節數據接收函數
函數原型: UCHAR RcvByte();
功能: 用來接收從器件傳來的數據,并判斷總線錯誤(不發應答信號),
發完后請用應答函數應答從機。
********************************************************************/
unsigned char RcvByte()
{
unsigned char retc;
unsigned char BitCnt;
retc=0;
SDA=1; /*置數據線為輸入方式*/
for(BitCnt=0;BitCnt<8;BitCnt++)
{
_Nop();
SCL=0; /*置時鐘線為低,準備接收數據位*/
_Nop();
_Nop(); /*時鐘低電平周期大于4.7μs*/
_Nop();
_Nop();
_Nop();
SCL=1; /*置時鐘線為高使數據線上數據有效*/
_Nop();
_Nop();
retc=retc<<1;
if(SDA==1)retc=retc+1; /*讀數據位,接收的數據位放入retc中 */
_Nop();
_Nop();
}
SCL=0;
_Nop();
_Nop();
return(retc);
}
/********************************************************************
應答子函數
函數原型: void Ack_I2c(bit a);
功能: 主控器進行應答信號(可以是應答或非應答信號,由位參數a決定)
********************************************************************/
void Ack_I2c(bit a)
{
if(a==0)SDA=0; /*在此發出應答或非應答信號 */
else SDA=1;
_Nop();
_Nop();
_Nop();
SCL=1;
_Nop();
_Nop(); /*時鐘低電平周期大于4μs*/
_Nop();
_Nop();
_Nop();
SCL=0; /*清時鐘線,鉗住I2C總線以便繼續接收*/
_Nop();
_Nop();
}
/*******************************************************************
向有子地址器件發送字節數據函數
函數原型: bit ISendByte(uchar sla,ucahr c);
功能: 從啟動總線到發送地址,數據,結束總線的全過程,從器件地址sla.
如果返回1表示操作成功,否則操作有誤。
注意: 使用前必須已結束總線。
********************************************************************/
bit ISendByte(unsigned char suba,unsigned char c)
{
Start_I2c(); /*啟動總線*/
SendByte(0x0a2); /*發送器件地址*/
if(ack==0)return(0);
SendByte(suba); /*發送子器件地址*/
if(ack==0)return(0);
SendByte(c); /*發送數據*/
if(ack==0)return(0);
Stop_I2c(); /*結束總線*/
return(1);
}
/*******************************************************************
向有子地址器件發送多字節數據函數
函數原型: bit ISendStr(uchar sla,uchar suba,ucahr *s,uchar no);
功能: 從啟動總線到發送地址,子地址,數據,結束總線的全過程,從器件
地址sla,子地址suba,發送內容是s指向的內容,發送no個字節。
如果返回1表示操作成功,否則操作有誤。
注意: 使用前必須已結束總線。
********************************************************************/
bit ISendStr(unsigned char suba,unsigned char *s,unsigned char no)
{
unsigned char i;
Start_I2c(); /*啟動總線*/
SendByte(0x0a2); /*發送器件地址*/
if(ack==0)return(0);
SendByte(suba); /*發送器件子地址*/
if(ack==0)return(0);
for(i=0;i<no;i++)
{
SendByte(*s); /*發送數據*/
if(ack==0)return(0);
s++;
}
Stop_I2c(); /*結束總線*/
return(1);
}
/*******************************************************************
向有子地址器件讀字節數據函數
函數原型: bit IRcvByte(uchar sla,ucahr *c);
功能: 從啟動總線到發送地址,讀數據,結束總線的全過程,從器件地
址sla,返回值在c.
如果返回1表示操作成功,否則操作有誤。
注意: 使用前必須已結束總線。
********************************************************************/
bit IRcvByte(unsigned char suba,unsigned char *c)
{
Start_I2c(); /*啟動總線*/
SendByte(0x0a2); /*發送器件地址*/
if(ack==0)return(0);
SendByte(suba); /*發送器件子地址*/
if(ack==0)return(0);
Start_I2c(); /*啟動總線*/
SendByte(0x0a3); /*發送器件地址*/
if(ack==0)return(0);
*c=RcvByte(); /*讀取數據*/
Ack_I2c(1); /*發送非就答位*/
Stop_I2c(); /*結束總線*/
return(1);
}
/*******************************************************************
向有子地址器件讀取多字節數據函數
函數原型: bit ISendStr(uchar sla,uchar suba,ucahr *s,uchar no);
功能: 從啟動總線到發送地址,子地址,讀數據,結束總線的全過程,從器件
地址sla,子地址suba,讀出的內容放入s指向的存儲區,讀no個字節。
如果返回1表示操作成功,否則操作有誤。
注意: 使用前必須已結束總線。
********************************************************************/
bit IRcvStr(unsigned char suba,unsigned char *s,unsigned char no)
{
unsigned char i;
Start_I2c(); /*啟動總線*/
SendByte(0x0a2); /*發送器件地址*/
if(ack==0)return(0);
SendByte(suba); /*發送器件子地址*/
if(ack==0)return(0);
Start_I2c();
SendByte(0x0a3);
if(ack==0)return(0);
for(i=0;i<no-1;i++)
{
*s=RcvByte(); /*發送數據*/
Ack_I2c(0); /*發送就答位*/
s++;
}
*s=RcvByte();
Ack_I2c(1); /*發送非應位*/
Stop_I2c(); /*結束總線*/
return(1);
}
/**************************************************
函數名稱:set_rtc()
函數功能:BCD處理,將十進制數轉化為BCD編碼(按十六進制數計算)
***************************************************/
void set_rtc() //設定時鐘數據(pcf8563芯片中的數據是以bcd形式存儲和處理)
{
ISendStr(0x02,tmpdate,7); //將數據寫入PCF8563相應寄存器
}
/**************************************************
函數名稱:rtc_init()
函數功能:時鐘初始化
***************************************************/
void rtc_init() //時鐘初始化
{
set_rtc(); //將預設的時間進行DEC->BCD轉換
ISendByte(0x00,0x00);
ISendByte(0x01,0x00);
}
/**************************************************
函數名稱:ead_rtc()
函數功能:讀時鐘函數,將讀出的數據存入tmpdate緩存數組中
***************************************************/
void read_rtc() //讀時鐘函數,將讀出的數據存入tmpdate緩存數組中
{
IRcvStr(0x02,tmpdate,7);
tmpdate[0]=tmpdate[0]&0x7f; //秒
tmpdate[1]=tmpdate[1]&0x7f; //分
tmpdate[2]=tmpdate[2]&0x3f; //時
tmpdate[3]=tmpdate[3]&0x3f; //日
tmpdate[4]=tmpdate[4]&0x07; //星期
tmpdate[5]=tmpdate[5]&0xff; //月
tmpdate[6]=tmpdate[6]&0xff; //年
}
void Delay100us() //@11.0592MHz
{
uchar i, j;
_nop_();
_nop_();
i = 2;
j = 15;
do
{
while (--j);
} while (--i);
}
void SendData(char c)
{
ES=0;
SBUF=c;
while(!TI);
TI=0;
ES=1;
Delay100us();
}
/**********************主函數*******************************************/
void main()
{
rtc_init(); //時間初始化
Init();
while(1)
{
read_rtc(); //讀時間并處理
SendData(tmpdate[6]);
SendData(tmpdate[5]);
SendData(tmpdate[3]);
SendData(tmpdate[2]);
SendData(tmpdate[1]);
SendData(tmpdate[0]);
}
}
void exter0() interrupt 1
{
TL0 = 0xCD; //設置定時初值
TH0 = 0xD4; //設置定時初值
}
void ser() interrupt 4
{
RI=0;
}
復制代碼
輸出
201225173050
201225173050
201225173050
201225173050
201225173050
復制代碼
時鐘永遠都是201225173050,不會改變。
希望大家幫幫忙看看哪里出錯。
謝謝!
作者:
滄海一粒
時間:
2020-7-22 10:16
初乍看 很難看出問題在哪里的,我覺得最好是先檢查硬件,再查軟件,逐步排查吧!
作者:
zxc05812438
時間:
2020-11-22 21:42
你把STOP位置一試下
作者:
hhdsdy
時間:
2020-11-22 23:41
201225173050是你設定的初始時間(可以改成2020年的時間了
),你的主程序里 rtc_init(); 只是將初始化的數值寫入,并沒有調時的程序,所以時間肯定是2012年,加之沒有判斷,每次上電都寫入相同的數值,所以每次讀出肯定都是一樣的。你先把8563的備用電源加上,運行一次程序,然后屏蔽325行的 set_rtc(); 并再次寫入程序,看看秒是不是有走?
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1