📄 无警告.c
字号:
#include <reg52.h>
#include <absacc.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_WEEK 0x8A
#define DS1302_DAY 0x86
#define DS1302_MONTH 0x88
#define DS1302_YEAR 0x8C
#define DS1302_WP 0X8E
//#define DS1302_RAM(X) (0xC0+(X)*2) //用于计算 DS1302_RAM 地址的宏
sbit CLK = P1^0;
sbit DIO = P1^1;
sbit 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 DS1302_init();
void Inputbyte(unsigned char d);
unsigned char Outputbyte(void);
unsigned char Read1302(unsigned char ucAddr);
void Write1302(unsigned char ucAddr, unsigned char ucDa);
void DA(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; //开总中断
//SBUF=0xf0;
//死循环等待中断
Write1302(DS1302_WP,0x00);
SBUF=Read1302(DS1302_WP);
// Write1302(DS1302_SECOND,0X50);
// SBUF=Read1302(DS1302_SECOND);
while(1);
}
//串口中断程序
void int_s(void) interrupt 4
{
ES = 0; //关闭串行中断
if(TI==1)
{
//SBUF=0xff;
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; //关串口中断 (可能没必要)
P2=P2+0X01;
// port=0X44;
// EX0=1;
ES=1; //开串口中断
}
void Inputbyte(unsigned char d) //实时时钟写入一字节(内部函数)
{
unsigned char i;
ACC = d;
for(i=8; i>0; i--)
{
DIO=ACC0; //相当于汇编中的 RRC
CLK=0; //????? 0 1? P1口应该先置0
CLK=1;
ACC = ACC >> 1; //因为在前面已经定义了ACC0 = ACC^0;以便再次利用DS1302_IO = ACC0;
}
}
unsigned char Outputbyte(void) //实时时钟读取一字节(内部函数)
{
unsigned char i;
for(i=8; i>0; i--)
{
ACC7 = DIO; //????????
CLK = 0;
CLK = 1;
ACC = ACC >>1; //相当于汇编中的 RRC (原来在最前)
}
return(ACC);
}
void Write1302(unsigned char ucAddr, unsigned char ucDa) //ucAddr: DS1302地址, ucData: 要写的数据
{
RST = 0;
CLK = 0;
RST = 1;
Inputbyte(ucAddr); // 地址,命令
Inputbyte(ucDa); // 写1Byte数据
CLK = 1;
RST = 0;
}
unsigned char Read1302(unsigned char ucAddr) //读取DS1302某地址的数据
{
unsigned char ucData;
RST = 0;
CLK = 0;
RST = 1;
Inputbyte(ucAddr); // 地址,命令
ucData = Outputbyte(); // 读1Byte数据
CLK = 1;
RST = 0;
return(ucData);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -