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

📄 未改完的程序.c

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