📄 my51pro.c
字号:
#include <reg52.h>
#include <absacc.h>
#include <intrins.h>
/*DS1302命令字地址定义区*/
#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
/*控制位定义区*/
sbit DS1302_CLK = P2^5;
sbit DS1302_DIO = P3^3;
sbit DS1302_RST = P3^4;
sbit DAW = P3^5;
/*标志位与数据定义区*/
unsigned char receive_sbuf;
unsigned char receive_7128;
unsigned char receive_1302;
unsigned char jingdu=0xff;
unsigned char weidu=0xff;
unsigned char nianinit=0x08; //初始化时间的年
unsigned char zhouinit=0xff; //初始化时间的周(星期)
unsigned char yueinit=0x10; //初始化时间的月
unsigned char riinit=0x3; //初始化时间的日
unsigned char shiinit=0x10; //初始化时间的时
unsigned char feninit=0x41; //初始化时间的分
unsigned char miaoinit=0x44; //初始化时间的秒
unsigned char nian=0xff; //从1302读出的年
unsigned char zhou=0xff; //从1302读出的周(星期)
unsigned char yue=0xff; //从1302读出的月
unsigned char ri=0xff; //从1302读出的日
unsigned char shi=0xff; //从1302读出的时
unsigned char fen=0xff; //从1302读出的分
unsigned char miao=0xff; //从1302读出的秒
unsigned char OK=0x00; //0xff为接收初始化数据完毕
unsigned char configflag=0x00; //0xff为配置完毕
unsigned char receiveFnum=0x00; //接收FF计数
unsigned char receive0num=0x00; //接收00计数
unsigned char receivecount=0x00; //接收初始化数据计数
unsigned char receivecount2=0x00; //接收控制量数据计数
unsigned char receivestart=0x00; //接收初始化数据开始标志,开始为0xff
unsigned char receivestart2=0x00; //接收控制量数据开始标志,开始为0xff
unsigned char receiveend=0x00; //结束为0xff
unsigned char error=0x00; //发生为ff
unsigned char datareadynum=0;
unsigned char danum1=0x00; //高八位
unsigned char danum2=0x00; //低四位
unsigned char danum3=0x00;
unsigned char danum4=0x00;
unsigned char adnum1=0x00; // 高八位
unsigned char adnum2=0x00; // 低四位(低四位有效)
unsigned char adnum3=0x00; // 高八位
unsigned char adnum4=0x00; // 低四位(低四位有效)
unsigned char adnumflag=0x00;//0x00第一个
int dosendpc=1; //是否执行sendpc函数1不执行
int sendpcnum=0; //发送的第几个数,从0开始
int updatanum=0;
/*函数定义区*/
//DA,10位,先给高两位,后低八位,AD,12位,先高八位,后低四位 ??
void Inputbyte(unsigned char m);
unsigned char Outputbyte(void);
unsigned char Read1302(unsigned char Addr);
void Write1302(unsigned char Addr, unsigned char Da);
void DAint(unsigned char dadata_fir,unsigned char dadata_sec);
void DS1302config(void);
void Timeupdata(void);
void Send3ff(void);
void Send300(void);
void Sendpc(void);
void main(void)
{
//外中断设置
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; //串口中断开
_nop_();
//DAint(0xff,0x0f);
EA=1; //开总中断
_nop_();
Write1302(DS1302_WP,0x00);
_nop_();
_nop_();
// Write1302(0x90,0xA5); //充电模式(暂时省略)
Write1302(DS1302_SECOND,0x00); //设置秒,并启动(以后改成后启动或最后设置秒并启动)
_nop_();
_nop_();
Write1302(DS1302_MINUTE,0x50); //设置分钟
_nop_();
_nop_();
Write1302(DS1302_HOUR,0x14); //设置小时
_nop_();
_nop_();
Write1302(DS1302_DATE,0x28); //设置日期
_nop_();
_nop_();
Write1302(DS1302_MONTH,0x08); //设置月
_nop_();
_nop_();
Write1302(DS1302_DAY,0x04); //设置星期
_nop_();
_nop_();
Write1302(DS1302_YEAR,0x08); //设置年
_nop_();
_nop_();
Write1302(DS1302_WP,0xFF); //关写操作允许位
// DS1302config();
// TI=1;
// while(1);
SBUF=0X00;
while(1)
{
//updatanum++;
//if(updatanum>=20000)
// { Timeupdata();updatanum=0;}
//if (sendpcnum==0)
//updatanum++;
//if(updatanum>=20000)
// TI=1;
}
/*while(1)
{
if(OK==0xff&&configflag==0x00)
{
DS1302config();
configflag=0xff;
}
DAint(danum1,danum2);
Timeupdata();
if (sendpcnum==0)
TI=1;
}
*/
}
//串口中断程序
void int_s(void) interrupt 4
{
ES = 0; //关闭串行中断
if(TI==1)
{
SBUF=Read1302(DS1302_MONTH);
// SBUF=0X55;
/*
switch(sendpcnum)
{
case 0:SBUF=Read1302(DS1302_YEAR);sendpcnum++;break;
case 1:SBUF=Read1302(DS1302_MONTH);sendpcnum++;break;
case 2:SBUF=Read1302(DS1302_DATE);sendpcnum++;break;
case 3:SBUF=Read1302(DS1302_HOUR);sendpcnum++;break;
case 4:SBUF=Read1302(DS1302_MINUTE);sendpcnum++;break;
case 5:SBUF=Read1302(DS1302_SECOND);sendpcnum++;break;
case 6:SBUF=adnum1;sendpcnum++;break;
case 7:SBUF=adnum2;sendpcnum++;break;
case 8:SBUF=adnum3;sendpcnum++;break;
case 9:SBUF=adnum4;sendpcnum++;break;
case 10:sendpcnum=0; break;
} */
TI=0;
}
if(RI==1)
{
receive_sbuf=SBUF;
receiveFnum++;
if(receiveFnum==1)
{
if(receive_sbuf==0xff)
receivestart=0xff; //初始化数据开始标志位置位
if(receive_sbuf==0xf0)
receivestart2=0xff; //调试数据开始标志位置位
}
if(receivestart==0xff)
switch(receivecount)
{
case 0:_nop_(); receivecount++;break;
case 1: nianinit=receive_sbuf; receivecount++;break;
case 2: yueinit=receive_sbuf; receivecount++;break;
case 3: riinit=receive_sbuf; receivecount++;break;
case 4: shiinit=receive_sbuf; receivecount++;break;
case 5: feninit=receive_sbuf; receivecount++;break;
case 6: miaoinit=receive_sbuf;
OK=0xff; //接收初始化数据完毕
receivestart=0x00;
receivecount=0;
receiveFnum=0x00;
break;
}
if(receivestart2==0xff)
switch(receivecount2)
{
case 0:_nop_(); receivecount2++;break;
case 1: danum1=receive_sbuf; receivecount2++;break;
case 2: danum2=receive_sbuf; receivecount2++;break;
case 3: danum3=receive_sbuf; receivecount2++;break;
case 4: danum4=receive_sbuf;
receivestart2=0x00;
receivecount2=0;
receiveFnum=0x00;
break;
}
RI=0;
}
ES=1;
}
//外部中断程序
void ADint(void) interrupt 0
{
// ADCTL=1;
EX0=0;
if(adnumflag==0x00)
{
SBUF=P0;
adnumflag=0xff;
}
else
{
SBUF=(P0&0x0f);
adnumflag=0x00;
}
EX0=1;
//ADCTL=0;
//ADCTL=0;
}
void DAint(unsigned char dadata_fir,unsigned char dadata_sec)
{
P1=dadata_fir;
DAW=0;
_nop_();
_nop_();
_nop_();
_nop_();
P1=dadata_sec;
DAW=1;
_nop_();
}
void Inputbyte(unsigned char m) //SPI写入一个字节
{
unsigned char i;
//ACC = m;
for(i=0; i<8; i++)
{
if(m&0x01) DS1302_DIO=1;
else DS1302_DIO=0;
DS1302_CLK = 1;
DS1302_CLK = 1;
DS1302_CLK = 0;
DS1302_CLK = 0;
m=m>>1;
}
}
unsigned char Outputbyte(void) //SPI读出一个字节
{
unsigned char i;
unsigned char temp=0x00;
for(i=8; i>0; i--)
{
temp = temp >>1;
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;
}
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_RST = 0;
}
unsigned char Read1302(unsigned char Addr) //读取DS1302地址Addr的数据
{
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(Addr|0x01); // 地址,命令
ucData = Outputbyte(); // 读1Byte数据
DS1302_RST = 0;
return(ucData);
}
void DS1302config()
{
Write1302(DS1302_WP,0x00);
_nop_();
_nop_();
// Write1302(0x90,0xA5); //充电模式(暂时省略)
_nop_();
_nop_();
Write1302(DS1302_MINUTE,feninit); //设置分钟
_nop_();
_nop_();
Write1302(DS1302_HOUR,shiinit); //设置小时
_nop_();
_nop_();
Write1302(DS1302_DATE,riinit); //设置日期
_nop_();
_nop_();
Write1302(DS1302_MONTH,yueinit); //设置月
_nop_();
_nop_();
Write1302(DS1302_DAY,zhouinit); //设置星期
_nop_();
_nop_();
Write1302(DS1302_YEAR,nianinit); //设置年
_nop_();
_nop_();
Write1302(DS1302_SECOND,miaoinit|0x80); //设置秒,并启动
_nop_();
_nop_();
Write1302(DS1302_WP,0xFF); //关写操作允许位
}
void Timeupdata()
{
nian=Read1302(DS1302_YEAR);
yue=Read1302(DS1302_MONTH);
ri=Read1302(DS1302_DATE);
shi=Read1302(DS1302_HOUR);
fen=Read1302(DS1302_MINUTE);
miao=Read1302(DS1302_SECOND);
}
void Sendpc()
{
switch(sendpcnum)
{
case 0:SBUF=0x00;sendpcnum++;break;
case 1:SBUF=0x11;sendpcnum++;break;
case 2:SBUF=0x22;sendpcnum++;break;
case 3:SBUF=0x33;sendpcnum++;break;
case 4:SBUF=0x44;sendpcnum++;break;
case 5:SBUF=0x55;sendpcnum++;break;
case 6:SBUF=0x66;sendpcnum++;break;
case 7:SBUF=0x77;sendpcnum++;break;
case 8:SBUF=0x88;sendpcnum++;break;
case 9:SBUF=0x99;sendpcnum++;break;
case 10:sendpcnum=0; break;
}
}
void Send3ff()
{
SBUF=0xff;
while(TI==1);
SBUF=0xff;
while(TI==1);
SBUF=0xff;
while(TI==1);
}
void Send300()
{
SBUF=0x00;
while(TI==0);
SBUF=0x00;
while(TI==0);
SBUF=0x00;
while(TI==0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -