📄 未改完的程序.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
//#define ADCOV XBYTE[]
//#define ADCOV XBYTE[]
//#define ADCOV XBYTE[]
sbit DS1302_CLK = P2^5;
sbit DS1302_DIO = P3^3;
sbit DS1302_RST = P3^4;
sbit DAW = P3^5;
sbit ADCTL=P2^6; //(R/C)
sbit A0 =P2^4;
sbit CS =P3^6;
sbit CE =P3^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 zhou=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=0x00; //发生为ff
unsigned char datareadynum=0;
unsigned char danum1=0x00; //高八位
unsigned char danum2=0x00; //低四位
unsigned char adnum1=0x00; // 高八位
unsigned char adnum2=0x00; // 低四位(低四位有效)
unsigned char adnumflag=0x00;//0x00第一个
int playflag;
int countnum=0;
unsigned char serputflag=0x00; //0x00允许发送
//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 putdata(void);
void Delay(void);
void main(void)
{
//ADCTL=1;
playflag=0;
//外中断设置
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=0x77;
_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); //关写操作允许位
// P2=0x00;
//DAint(0xff,0x0f);
//while(1) ;
CE=1;
A0=0;
ADCTL=0;
CS=0;
EA=1; //开总中断
_nop_();
while(1);
//danum1++;
// if(danum1==0xff){ danum1=0x00;danum2++;}
// DAint(0x03,0xff);
// playflag++;
//if(playflag==30000) SBUF=0x88;
}
//串口中断程序
void int_s(void) interrupt 4
{
ES = 0; //关闭串行中断
if(TI==1)
{
//SBUF=P2;
//SBUF=0x33;
//SBUF=P2&0X0F;
//if(playflag>=30000)
// SBUF=adnum1;
/* switch(countnum)
{
case 0: SBUF=Read1302(DS1302_YEAR); break;
case 1: SBUF=Read1302(DS1302_MONTH); break;
case 2: SBUF=Read1302(DS1302_DATE); break;
case 3: SBUF=Read1302(DS1302_HOUR); break;
case 4: SBUF=Read1302(DS1302_MINUTE); break;
case 5: SBUF=Read1302(DS1302_SECOND);break;
case 6: SBUF=Read1302(DS1302_DAY); break;
case 7: SBUF=0X88;break;
case 8: SBUF=adnum2;break;
case 9: SBUF=adnum1;break;
//case 10:playflag=0;
}
countnum++;
if(countnum==10) countnum=0; */
// SBUF=playflag++;
TI=0;
}
if(RI==1)
{
receive_sbuf=SBUF;
switch(receive_sbuf)
{
case 'E': jingdu=weidu=nian=yue=ri=shi=fen=miao=0xff; 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 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,fen); //设置分钟
_nop_();
_nop_();
Write1302(DS1302_HOUR,shi); //设置小时
_nop_();
_nop_();
Write1302(DS1302_DATE,ri); //设置日期
_nop_();
_nop_();
Write1302(DS1302_MONTH,yue); //设置月
_nop_();
_nop_();
Write1302(DS1302_DAY,zhou); //设置星期
_nop_();
_nop_();
Write1302(DS1302_YEAR,nian); //设置年
_nop_();
_nop_();
Write1302(DS1302_SECOND,miao|0x80); //设置秒,并启动
_nop_();
_nop_();
Write1302(DS1302_WP,0xFF); //关写操作允许位
}
void Delay()
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -