u013045220
君子筱宁
2018-05-09 07:10

PCF8563实时时钟程序 串口输出 怎么没人回答呢 大佬们帮帮忙啊

80
  • pcf8563

PCF8563实时时钟程序,需要输出时间,但现在在串口输出的时候文本模式没有输出,HEX模式下不断输出00,我需要输出时间 下边代码 懂的大佬帮帮忙看看哪出问题了 怎么解决?
main.c
#include
#include
#include
/*------------------
内振11.0592M
sbit SDA=P4^6;
sbit SCL=P4^1;
串口输出时间,波特率9600
串口不移位
------------------*/

extern void uart_init(void);
extern void P8563_init();
extern void P8563_gettime();
extern void uart_test(unsigned char length);

unsigned char TX_buf[10];
unsigned char jj,Rx_Byte,Length;
bit CmdValid;
unsigned char RX_buf[10];
extern void Delay();
void P8563_Read();
void main(void)
{
unsigned int delayl;
uart_init();

    P8563_init();

// WDT_CONTR = 0x30;
while(1)
{
//WDT_CONTR = 0x3c;
// WDT_CONTR = 0x30;
for(delayl=0;delayl<60000;delayl++){
Delay();
}

            P8563_gettime();
            P8563_Read();
        /*  TX_buf[0] = 0x01;
            TX_buf[1] = 0x02;
            TX_buf[2] = 0x02;
            TX_buf[3] = 0x03;   
            uart_test(4);   */   
    }

}
/*void ser() interrupt 4
{

if(RI)
{
RI=0;
RX_buf[Rx_Byte]=SBUF;
if(RX_buf[0]=='\n')
Rx_Byte=0;
if(RX_buf[0]==' ')
Rx_Byte=0;
if( RX_buf[0] == 0xff)
Rx_Byte = 0;

else
{

Length = RX_buf[0];
if(Rx_Byte ==Length)
{
jj=0;
CmdValid = 1;
}
Rx_Byte++;

}

}

else if(!RI && TI)
{
TI=0;
if(jj<4)
SBUF=TX_buf[jj++];//将接受的数据发出去
else
{
Rx_Byte=0;
jj = 0;
}
}
}*/

PCF8563.c
#include <reg52.h>
#include <absacc.h>
#include <intrins.h>

#define uchar unsigned char
extern uchar TX_buf[10];
extern void uart_test(unsigned char length);
sfr  P4         =   0xe8; 
sbit P40        =   0xe8; 
sbit P41        =   0xe9; 
sbit P42        =   0xea; 
sbit P43        =   0xeb; 
sbit P44        =   0xec; 
sbit P45        =   0xed; 
sbit P46        =   0xee;
sbit SDA=P4^6;
sbit SCL=P4^1;

uchar g8563_Store[6]; /*时间交换区,全局变量声明*/
uchar code c8563_Store[6]={0x17,0x08,0x09,0x18,0x00,0x00}; /*写入时间初值:星期一 07:59:00*/

/********************************************
内部函数,延时1
********************************************/
void Delay()
{
        _nop_();_nop_(); _nop_();_nop_();_nop_();_nop_();/*根据晶振频率制定延时时间*/
}
/********************************************
内部函数,I2C开始
********************************************/
void Start()
{ 
        SDA=1;
        SCL=1;
        Delay();
        SDA=0;
        Delay();
        SCL=0;
}
/********************************************
内部函数,I2C结束
********************************************/
void Stop()
{
        SDA=0;
        SCL=0;
        Delay();
        SCL=1;
        Delay();
        SDA=1;
        Delay();
}
/********************************************
内部函数,输出ACK ,每个字节传输完成,输出ack=0,结束读书据,ack=1;
********************************************/
void WriteACK(uchar ack)
{
        SDA=ack;
        Delay();
        SCL=1;
        Delay();
        SCL=0;
}
/********************************************
内部函数,等待ACK
********************************************/
void WaitACK()
{  
        uchar errtime=20;
        SDA=1;
        Delay(); /*读ACK*/
        SCL=1;
        Delay();
        while(SDA)
        {  
                errtime--;
                if(!errtime) 
                        Stop();
        }
        SCL=0;
        Delay();
}
/********************************************
内部函数.输出数据字节
入口:B=数据
********************************************/
void writebyte(uchar wdata)
{
        uchar i;
        for(i=0;i<8;i++)
        {
                if(wdata&0x80) 
                        SDA=1;
                else 
                        SDA=0;
                wdata<<=1;
                SCL=1;
                Delay();
                SCL=0;
        }
        WaitACK();     //I2C器件或通讯出错,将会退出I2C通讯
}
/********************************************
内部函数.输入数据
出口:B
********************************************/
uchar Readbyte()
{
        uchar i,bytedata;
        SDA=1;
        for(i=0;i<8;i++)
        {
                SCL=1; 
                bytedata<<=1;
                bytedata|=SDA;
                SCL=0;
                Delay();
        }
        return(bytedata);
}
/********************************************
输出数据->pcf8563
********************************************/
void writeData(uchar address,uchar mdata)
{
        Start();
        writebyte(0xa2); /*写命令*/
        writebyte(address); /*写地址*/
        writebyte(mdata); /*写数据*/
        Stop();
}
/********************************************
输入数据<-pcf8563
********************************************/
/*uchar ReadData(uchar address) //单字节
{  
        uchar rdata;
        Start();
        writebyte(0xa2); //写命令
        writebyte(address); //写地址
        Start();
        writebyte(0xa3); //读命令
        rdata=Readbyte();
        WriteACK(1);
        Stop();
        return(rdata);
}*/ 
void ReadData1(uchar address,uchar count,uchar * buff) /*多字节*/
{  
        uchar i;
        Start();
        writebyte(0xa2); /*写命令*/
        writebyte(address); /*写地址*/
        Start();
        writebyte(0xa3); /*读命令*/
        for(i=0;i<count;i++)
        {
                buff[i]=Readbyte();
                if(i<count-1) 
                        WriteACK(0);
        }
        WriteACK(1);
        Stop();
}  
/********************************************
内部函数,读入时间到内部缓冲区
********************************************/
void P8563_Read()
{   
        uchar time[7];
        ReadData1(0x02,0x07,time);
        g8563_Store[0]=time[0]&0x7f; /*秒 */
        g8563_Store[1]=time[1]&0x7f; /*分 */
        g8563_Store[2]=time[2]&0x3f; /*小时 */
        g8563_Store[3]=time[3]&0x3f; /*日 */
        g8563_Store[4]=time[5]&0x1f; /*月 */
        g8563_Store[5]=time[6]; /*年  */

        TX_buf[0] = g8563_Store[5];
        TX_buf[1] = g8563_Store[4];
        TX_buf[2] = g8563_Store[3];
        TX_buf[3] = g8563_Store[2]; 
        TX_buf[4] = g8563_Store[1]; 
        TX_buf[5] = g8563_Store[0]; 
        uart_test(6);   
}
/********************************************
读入时间到内部缓冲区----外部调用 
********************************************/
void P8563_gettime()
{
        P8563_Read();
        if(g8563_Store[0]==0)
                P8563_Read(); /*如果为秒=0,为防止时间变化,再读一次*/
}   
/********************************************
写时间修改值
********************************************/
void P8563_settime()
{
        //uchar i;
        writeData(8,g8563_Store[0]); //年 
        writeData(7,g8563_Store[1]); //月 
        writeData(5,g8563_Store[2]); //日 
        writeData(4,g8563_Store[3]); //时 
        writeData(3,g8563_Store[4]); //分  
        writeData(2,g8563_Store[5]); //秒 
}
/********************************************
P8563的初始化-----外部调用
********************************************/
void P8563_init()
{
    uchar i;
      // P8563_settime();
for(i=0;i<=5;i++) g8563_Store[i]=c8563_Store[i]; /*初始化时间*/
        P8563_settime();  
   // if((ReadData(0x0a)&0x3f)!=0x08) /*检查是否第一次启动,是则初始化时间*/
   // {
//      P3_4 = 0;
 //       for(i=0;i<=3;i++) g8563_Store[i]=c8563_Store[i]; /*初始化时间*/
 //       P8563_settime();
 //       writeData(0x0,0x00);
 //       writeData(0xa,0x8); /*8:00报警*/
 //       writeData(0x1,0x12); /*报警有效*/
  //      writeData(0xd,0xf0);  //编程输出32.768K的频率
  //  }
}


uart.c

#include
//sfr AUXR = 0x8e; //Auxiliary register
extern unsigned char TX_buf[10];
void uart_init(void)
{
SCON = 0x50; //8???,?????
// AUXR |= 0x40; //???1???Fosc,?1T
// AUXR &= 0xFE; //??1?????1???????
TMOD &= 0x02; //?????1?16???????
TL1 = 0xfd; //??????
TH1 = 0xfd; //??????
ET1 = 0; //?????1??
TR1 = 1; //?????1

// TMOD=0x20;//设置定时器1为工作方式2
// TH1=0xfd;//装初值
// TL1=0xfd;
// TR1=1; //启动定时器
// TI=1;
// //REN=1; //允许接收
// SM0=0; //设置工作方式 1
// SM1=1;
// EA=1; //开串口中断
// ES=1;

//IP = 0x10; //设置串口为高优先级
}
void uart_test(unsigned char length)
{

    unsigned char i;
    for(i=0;i<length;i++)
    {
            ES=0;
            SBUF = TX_buf[i];//将接受的数据发出去
            while(!TI); 
            TI=0;               
    }   
    ES=1;     

}

  • 点赞
  • 回答
  • 收藏
  • 复制链接分享

2条回答