⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 分钟不刷新程序备份.c

📁 串口程序
💻 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 + -