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

📄 无警告.c

📁 串口程序
💻 C
字号:

#include <reg52.h>
#include <absacc.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_WEEK	0x8A
#define DS1302_DAY	0x86
#define DS1302_MONTH	0x88
#define DS1302_YEAR	0x8C
#define DS1302_WP       0X8E
//#define DS1302_RAM(X)	(0xC0+(X)*2)   	//用于计算 DS1302_RAM 地址的宏

sbit  CLK = P1^0;
sbit  DIO = P1^1;
sbit  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 DS1302_init();
void Inputbyte(unsigned char d);
unsigned char Outputbyte(void);
unsigned char Read1302(unsigned char ucAddr);
void Write1302(unsigned char ucAddr, unsigned char ucDa);
void DA(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;         //开总中断

 //SBUF=0xf0;
        //死循环等待中断
  Write1302(DS1302_WP,0x00);
  SBUF=Read1302(DS1302_WP);
 // Write1302(DS1302_SECOND,0X50);
 // SBUF=Read1302(DS1302_SECOND);
 while(1);


}

//串口中断程序
void int_s(void) interrupt 4
{
        ES = 0;       //关闭串行中断
        if(TI==1)
         {
                //SBUF=0xff;
                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;     //关串口中断 (可能没必要)
    P2=P2+0X01;
    // port=0X44;
    // EX0=1;
    ES=1;      //开串口中断
}

void Inputbyte(unsigned char d) 	//实时时钟写入一字节(内部函数)
{
    unsigned char i;
    ACC = d;
    for(i=8; i>0; i--)
    {
        DIO=ACC0;           	//相当于汇编中的 RRC
        CLK=0;                   //?????  0   1?  P1口应该先置0
        CLK=1;
        ACC = ACC >> 1;     //因为在前面已经定义了ACC0 = ACC^0;以便再次利用DS1302_IO = ACC0;
    }
}

unsigned char Outputbyte(void) 	//实时时钟读取一字节(内部函数)
{
    unsigned char i;
    for(i=8; i>0; i--)
    {
        ACC7 = DIO;				//????????
        CLK = 0;
        CLK = 1;
        ACC = ACC >>1;         			//相当于汇编中的 RRC (原来在最前)
    }
    return(ACC);
}

void Write1302(unsigned char ucAddr, unsigned char ucDa)	//ucAddr: DS1302地址, ucData: 要写的数据
{
    RST = 0;
    CLK = 0;
    RST = 1;
    Inputbyte(ucAddr);       	// 地址,命令
    Inputbyte(ucDa);       	// 写1Byte数据
    CLK = 1;
    RST = 0;
}

unsigned char Read1302(unsigned char ucAddr)	//读取DS1302某地址的数据
{
    unsigned char ucData;
    RST = 0;
    CLK = 0;
    RST = 1;
    Inputbyte(ucAddr);        // 地址,命令
    ucData = Outputbyte();         // 读1Byte数据
    CLK = 1;
    RST = 0;
    return(ucData);
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -