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

📄 my51pro.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

/*控制位定义区*/
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 + -