PIC单片机读写DS1302
扫描二维码
随时随地手机看文章
本文介绍了PIC单片机读写DS1302程序
#i nclude
#define uchar unsigned char
#define T_CLK RC3
#define T_IO RC4
#define T_RST RC5
unsigned char TDATA;
int js;
int Order[3];
bit sci_sign=0;
int buf[2];
void Get1302(uchar *);
void RTInputByte(uchar);
uchar RTOutputByte(void) ;
void W1302(uchar , uchar );
uchar R1302(uchar);
void Set1302(uchar*);
void sciint(void);
void sci(int);
void int_to_asc(int);
//*SCI部件接收初始化子程序*/
void sciint()
{
TRISC7= 1 ;// |= 0xc0;//设置为输入
TRISC6= 0 ;
BRGH = 1 ; //高波特率选择位
SPBRG = 25 ; //((20000000/9600)/16)-1
SYNC = 0 ;//异步
SPEN = 1 ;//串口使能
RCIE = 1 ;// USART数据接收中断使能位
TXIE = 0 ;//USART数据发送中断使能位
TXEN = 1 ;//发送
CREN = 1 ;//连续接收使能位
RCIF=0;
PEIE= 1 ; //开中断
GIE=1;
}
void sci(int tran)
{
while(!TXIF);
TXREG=tran; //*发出一个字符*/
TXIF=0;
}
void RTInputByte(uchar d)
{
uchar i;
TDATA = d;
for(i=8; i>0; i--)
{
T_IO =(bit)(TDATA&0X80); //*相当于汇编中的 RRC
T_CLK = 1;
T_CLK = 0;
TDATA = TDATA >> 1;
}
}
uchar RTOutputByte(void)
{
uchar i;
TRISC4=1;
for(i=8; i>0; i--)
{
TDATA = TDATA >>1;
if(T_IO)
{
TDATA&=0X80;
}
T_CLK = 1;
T_CLK = 0;
}
TRISC4=0;
return(TDATA);
}
void W1302(uchar ucAddr, uchar ucDa)
{
T_RST = 0;
T_CLK = 0;
T_RST = 1;
RTInputByte(ucAddr); //* 地址,命令
RTInputByte(ucDa); //* 写1Byte数据
T_CLK = 1;
T_RST = 0;
}
uchar R1302(uchar ucAddr)
{
uchar ucData;
T_RST = 0;
T_CLK = 0;
T_RST = 1;
RTInputByte(ucAddr); //* 地址,命令
ucData = RTOutputByte(); //* 读1Byte数据
T_CLK = 1;
T_RST = 0;
return(ucData);
}
void Set1302(uchar *pClock)
{
uchar i;
uchar ucAddr = 0x80;
W1302(0x8e,0x00); //* 控制命令,WP=0,写操作?
for(i =7; i>0; i--)
{
W1302(ucAddr,*pClock); //* 秒 分 时 日 月 星期 年
pClock++;
ucAddr +=2;
}
W1302(0x8e,0x80); //* 控制命令,WP=1,写保护
}
void Get1302(uchar *ucCurtime)
{
uchar i;
uchar ucAddr = 0x81;
for (i=0; i<7; i++)
{
ucCurtime[i] = R1302(ucAddr);//*格式为: 秒 分 时 日 月 星期 年
ucAddr += 2;
}
}
void interrupt SCI_Admit(void)
{
if(RCIF&&RCIE) //判断是否是接收中断
{
if(Order[0]=='$')
{
js++;
Order[js]=RCREG;
if(js==2)
sci_sign=1;
}
else
{
Order[0]=RCREG;
sci_sign=0;
js=0;
}
}
}
void int_to_asc(int dat)
{
buf[0]=(dat/10)+'0';
buf[1]=(dat%10)+'0';
}
void main()
{
uchar str[]={30,10,9,20,8,1,7};
uchar dtime[]={0,0,0,0,0,0,0};
TRISC3=1;
TRISC4=1;
TRISC5=1;
sciint();
ei();
// Get1302(st);
// sci('E');
while(1)
{
if(sci_sign)
{
Get1302(dtime);
if(Order[1]=='R'&&Order[2]=='T')
{
sci('Y');
int_to_asc(dtime[6]);
sci(buf[0]);
sci(buf[1]);
sci('M');
int_to_asc(dtime[4]);
sci(buf[0]);
sci(buf[1]);
sci('T');
int_to_asc(dtime[3]);
sci(buf[0]);
sci(buf[1]);
sci('h');
int_to_asc(dtime[2]);
sci(buf[0]);
sci(buf[1]);
sci('m');
int_to_asc(dtime[1]);
sci(buf[0]);
sci(buf[1]);
sci('s');
int_to_asc(dtime[0]);
sci(buf[0]);
sci(buf[1]);
sci('W');
int_to_asc(dtime[5]);
sci(buf[0]);
sci(buf[1]);
sci(' ');
}
else if(Order[1]=='R'&&Order[2]=='S')
{
Set1302(str);
}
Order[0]=0;
Order[1]=0;
Order[2]=0;
sci_sign=0;
}
}
}