📄 分钟不刷新程序备份.c
字号:
#include <reg52.h>
#include <absacc.h>
#include <intrins.h>
/*定义DS1302命令字*/
//#define AM(X) X
//#define PM(X) (X+12) // 转成24小时制
#define DS1302_SECOND 0x80
#define DS1302_MINUTE 0x82
#define DS1302_HOUR 0x84
#define DS1302_DATE 0x86
#define DS1302_MONTH 0x88
#define DS1302_DAY 0x8A
#define DS1302_YEAR 0x8C
#define DS1302_WP 0X8E
//#define DS1302_RAM(X) (0xC0+(X)*2) //用于计算 DS1302_RAM 地址的宏
sbit DS1302_CLK = P1^0;
sbit DS1302_DIO = P3^3;
sbit DS1302_RST = P1^2;
sbit DAW = P3^5;
sbit ACC0 = ACC^0;
sbit ACC7 = ACC^7;
unsigned char receive_sbuf;
unsigned char receive_7128;
unsigned char receive_1302;
unsigned char jingdu=0xff;
unsigned char weidu=0xff;
unsigned char nian=0xff;
unsigned char yue=0xff;
unsigned char ri=0xff;
unsigned char shi=0xff;
unsigned char fen=0xff;
unsigned char miao=0xff;
unsigned char OK=0xff;
unsigned char error=0;
unsigned char datareadynum=0;
void Inputbyte(unsigned char m);
void Inputbyte_R(unsigned char d);
unsigned char Outputbyte(void);
unsigned char Read1302(unsigned char Addr);
void Write1302(unsigned char Addr, unsigned char Da);
void main(void)
{
//P1=0XF0; //点灯
//外中断设置
// IT0=1; //外部中断0 下降沿中断
// PX0=0; //外部中断优先级低
//EX0=1; //开外部中断0
//串口设置
SCON=0x50; //模式1;允许接接收;标志位清0
PS=1; //串口中断高优先级
PCON=0X80;
TMOD=0x20; //方式2:自动装入
TL1=TH1=0xF3;
TR1=1; //波特率 4800@12Mhz)
ES = 1; //串口中断开
EA=1; //开总中断
_nop_();
//SBUF=0xf0;
//死循环等待中断
//while(1)
Write1302(DS1302_WP,0x00);
_nop_();
_nop_();
// Write1302(0x90,0xA5);
Write1302(DS1302_SECOND,0x00);
_nop_();
_nop_();
Write1302(DS1302_MINUTE,0x15);
_nop_();
_nop_();
Write1302(DS1302_HOUR,0x06);
_nop_();
_nop_();
Write1302(DS1302_DATE,0x27);
_nop_();
_nop_();
Write1302(DS1302_MONTH,0x08);
_nop_();
_nop_();
Write1302(DS1302_DAY,0x03);
_nop_();
_nop_();
Write1302(DS1302_YEAR,0x08);
_nop_();
_nop_();
SBUF=0XFF;
while(1);
}
//串口中断程序
void int_s(void) interrupt 4
{
ES = 0; //关闭串行中断
if(TI==1)
{
//SBUF=Read1302(0x80);
SBUF=Read1302(DS1302_MINUTE);
//SBUF=0X55;
//SBUF=P0;
TI=0;
}
if(RI==1)
{
receive_sbuf=SBUF;
switch(receive_sbuf)
{
case 'E': jingdu=weidu=nian=yue=ri=shi=fen=miao=0x00; error=1; break;
case 'J': jingdu=0x00; break;
case 'W': weidu=0x00; break;
case 'N': nian=0x00; break;
case 'Y': yue=0x00; break;
case 'R': ri=0x00; break;
case 'S': shi=0x00; break;
case 'F': fen=0x00; break;
case 'M': miao=0x00; break;
case 'O': OK=0x00; break;
default : {
if(jingdu==0x00) {jingdu=receive_sbuf; datareadynum++; break;}
if(weidu==0x00) {weidu=receive_sbuf; datareadynum++; break;}
if(nian==0x00) {nian=receive_sbuf; datareadynum++; break;}
if(yue==0x00) {yue=receive_sbuf; datareadynum++; break;}
if(ri==0x00) {ri=receive_sbuf; datareadynum++; break;}
if(shi==0x00) {shi=receive_sbuf; datareadynum++; break;}
if(fen==0x00) {fen=receive_sbuf; datareadynum++; break;}
if(miao==0x00) {miao=receive_sbuf; datareadynum++; break;}
}
}
SBUF=jingdu;
RI=0;
}
ES=1;
}
//外部中断程序
void hand(void) interrupt 0
{ //EX0=0;
ES=0; //关串口中断 (可能没必要)
// AD();
ES=1; //开串口中断
}
void Inputbyte(unsigned char m) //实时时钟写入一字节(内部函数)
{
unsigned char i;
//ACC = m;
for(i=0; i<8; i++)
{
if(m&0x01) DS1302_DIO=1;
else DS1302_DIO=0;
//DS1302_DIO = ACC0; //相当于汇编中的 RRC
// DS1302_DIO = ACC0; //相当于汇编中的 RRC
// DS1302_DIO = 1; //相当于汇编中的 RRC
// DS1302_DIO = 1; //相当于汇编中的 RRC
DS1302_CLK = 1;
DS1302_CLK = 1;
DS1302_CLK = 0;
DS1302_CLK = 0;
m=m>>1;
// ACC = ACC >> 1; //因为在前面已经定义了ACC0 = ACC^0;以便再次利用DS1302_IO = ACC0;
}
}
void Inputbyte_R(unsigned char d) //实时时钟写入一字节(内部函数)
{
unsigned char i;
for(i=0; i<8; i++)
{
if(d&0x01) DS1302_DIO=1;
else DS1302_DIO=0;
//DS1302_DIO = ACC0; //相当于汇编中的 RRC
//DS1302_DIO = ACC0; //相当于汇编中的 RRC
DS1302_CLK = 1;
DS1302_CLK = 1;
if(i!=7){ DS1302_CLK = 0; DS1302_CLK = 0;}
else { DS1302_CLK = 1; DS1302_CLK = 1;}
d=d>>1;
// ACC = ACC >> 1; //因为在前面已经定义了ACC0 = ACC^0;以便再次利用DS1302_IO = ACC0;
}
}
unsigned char Outputbyte(void) //实时时钟读取一字节(内部函数)
{
unsigned char i;
unsigned char temp=0x00;
for(i=8; i>0; i--)
{
if(DS1302_DIO) temp=temp|0x80;
DS1302_CLK = 1;
DS1302_CLK = 1;
DS1302_CLK = 1;
DS1302_CLK = 1;
DS1302_CLK = 1;
DS1302_CLK = 1;
DS1302_CLK = 1;
DS1302_CLK = 1; //???????
DS1302_CLK = 0;
DS1302_CLK = 0;
DS1302_CLK = 0;
DS1302_CLK = 0;
DS1302_CLK = 0;
DS1302_CLK = 0;
DS1302_CLK = 0;
DS1302_CLK = 0;
temp = temp >>1; //相当于汇编中的 RRC
}
return(temp);
}
void Write1302(unsigned char Addr, unsigned char Da) //ucAddr: DS1302地址, ucData: 要写的数据
{
DS1302_RST = 0;
DS1302_CLK = 0;
DS1302_CLK = 0;
DS1302_CLK = 0;
DS1302_CLK = 0;
DS1302_CLK = 0;
DS1302_RST = 1;
DS1302_RST = 1;
DS1302_RST = 1;
DS1302_RST = 1;
DS1302_RST = 1;
DS1302_RST = 1;
DS1302_RST = 1;
DS1302_RST = 1;
DS1302_RST = 1;
Inputbyte(Addr); // 地址,命令
Inputbyte(Da); // 写1Byte数据
// DS1302_CLK = 1;
DS1302_RST = 0;
}
unsigned char Read1302(unsigned char Addr) //读取DS1302某地址的数据
{
unsigned char ucData;
DS1302_RST = 0;
DS1302_CLK = 0;
DS1302_CLK = 0;
DS1302_CLK = 0;
DS1302_CLK = 0;
DS1302_CLK = 0;
DS1302_RST = 1;
DS1302_RST = 1;
DS1302_RST = 1;
DS1302_RST = 1;
DS1302_RST = 1;
DS1302_RST = 1;
DS1302_RST = 1;
DS1302_RST = 1;
DS1302_RST = 1;
Inputbyte_R(Addr|0x01); // 地址,命令
ucData = Outputbyte(); // 读1Byte数据
//DS1302_CLK = 0;
DS1302_RST = 0;
return(ucData);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -