📄 发送总为零的莫名程序备份.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 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 DS1302_init();
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 DA(unsigned char da);
unsigned char AD(void);
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; //开总中断
DA(0X55);
//SBUF=0xf0;
//死循环等待中断
while(1)
{ Write1302(0x8e,0x00); }
Write1302(0x90,0xA5);
Write1302(0x80,0x00);
Write1302(0x82,0x50);
SBUF=0XFF;
while(1);
}
//串口中断程序
void int_s(void) interrupt 4
{
ES = 0; //关闭串行中断
if(TI==1)
{
SBUF=Read1302(0x80);
// SBUF=Read1302(0x82);
// SBUF=0X55;
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++)
{
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;
ACC = ACC >> 1; //因为在前面已经定义了ACC0 = ACC^0;以便再次利用DS1302_IO = ACC0;
}
}
void Inputbyte_R(unsigned char d) //实时时钟写入一字节(内部函数)
{
unsigned char i;
ACC = d;
for(i=0; i<8; i++)
{
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;}
ACC = ACC >> 1; //因为在前面已经定义了ACC0 = ACC^0;以便再次利用DS1302_IO = ACC0;
}
}
unsigned char Outputbyte(void) //实时时钟读取一字节(内部函数)
{
unsigned char i;
ACC=0;
for(i=8; i>0; i--)
{
ACC = ACC >>1; //相当于汇编中的 RRC
ACC7 = DS1302_DIO; //????????
ACC7 = DS1302_DIO; //???????
DS1302_CLK = 0;
DS1302_CLK = 0;
DS1302_CLK = 1;
DS1302_CLK = 1;
}
return(ACC);
}
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);
}
void DA(unsigned char da)
{
DAW=0;
P0=da;
}
unsigned char AD()
{
unsigned char res;
res=P0;
return res;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -