- #include <AI8H.H>
- #include <intrins.h>
- #include <absacc.h>
- #include <string.h>
- #include <stdarg.h>
- #include <stdio.h>
- #include <math.h>
-
- //#define TR P33
-
- #define FOSC 24000000UL //主时钟
- #define BAUD 9600UL //波特率
- #define TMRF 200UL //定时器频率
- #define BRT (0x10000-(FOSC/BAUD+2)/4) //波特率发生器值
- #define TMR (0x10000-FOSC/TMRF/12) //定时器值
- #define T_Buf_Len 64 //Uart1发送缓存长度
- #define R_Buf_Len 64 //Uart1接收缓存长度
- #define Master_Addr 0x00 //Uart主机地址
- #define Slave_Addr 0x01 //Uart从机地址
- #define Broad_Addr 0xFF //Uart广播地址
- //#define R 0 //485接收
- //#define T 1 //485发送
-
- unsigned char RP; //Uart1接收指针
- unsigned char TP; //Uart1发送指针
- unsigned char Uart_R_Len; //Uart1接收长度
- unsigned char Uart_T_Len; //Uart1发送长度
- unsigned char xdata R_Buf[R_Buf_Len]; //Uart1接收缓存
- unsigned char xdata T_Buf[T_Buf_Len]; //Uart1发送缓存
-
- bit RTC_1s_Flag;
-
- void Delay_ms(unsigned char ms)
- {
- unsigned int i;
- do
- {
- i=FOSC/10000;
- while(--i); //10T per loop
- }
- while(--ms);
- }
-
- void UART_Send(unsigned int x)
- {
- while(Uart_T_Len);
- TP=0;
- Uart_T_Len=x;
- TI=1;
- }
-
- void Uart_Printf(unsigned char *v,...)
- {
- va_list ap;
- va_start(ap,v);
- while(Uart_T_Len);
- UART_Send(vsprintf(T_Buf,v,ap));
- va_end(ap);
- }
-
- //void UART_Return(unsigned char temp)
- //{
- // memcpy(T_Buf,R_Buf,temp);
- // UART_Send(temp);
- //}
-
- void Init(void)
- {
- P_SW2|=EAXFR;
-
- P0M1=0x00; P0M0=0x00; //设置IO模式
- P1M1=0xC0; P1M0=0x00; //设置IO模式
- P2M1=0x00; P2M0=0x00; //设置IO模式
- P3M1=0x00; P3M0=0x00; //设置IO模式
- P4M1=0x00; P4M0=0x00; //设置IO模式
- P5M1=0x00; P5M0=0x00; //设置IO模式
- P6M1=0x00; P6M0=0x00; //设置IO模式
- P7M1=0x00; P7M0=0x00; //设置IO模式
-
- X32KCR=0x80; //启动外部32.768KHz晶振
- while(!(X32KCR&0x01)); //等待外部32.768KHz晶振稳定
- RTCCFG=0x00; //RTC选择外部32.768KHz时钟源
-
- AUXR=0x05; //设置定时器0时钟为12T模式,设置定时器2为1T模式,设置定时器2为波特率发生器
- TMOD=0x01; //设置定时器0为16位不自动重装载模式
- TH0=TMR>>8; //设置定时器0初始值
- TL0=TMR; //设置定时器0初始值
- TF0=0; //清除TF0中断标志位
- ET0=1; //启用定时器0中断
-
- SCON=0x50; //设置UART1模式为8位数据可变波特率
- T2H=BRT>>8; //设置UART1波特率
- T2L=BRT; //设置UART1波特率
- AUXR|=T2R; //打开定时器2
- ES=1; //启用UART1中断
-
- INIYEAR =25; //初始化年
- INIMONTH =1; //初始化月
- INIDAY =1; //初始化日
- INIHOUR =0; //初始化时
- INIMIN =0; //初始化分
- INISEC =0; //初始化秒
- INISSEC =0; //初始化1/128秒
- INIWEEK =3; //初始化星期
-
- RTCCFG|=0x01; //初始化RTC
-
- RTCIF=0x00; //清除RTC中断标志
- RTCIEN=0x08; //启用RTC秒中断
- RTCCR=0x01; //打开RTC
-
- EA=1; //启用总中断
- }
-
- void main(void)
- {
- Init();
- while(1)
- {
- if(RTC_1s_Flag)
- {
- RTC_1s_Flag=0;
- Uart_Printf("\r\n\r\n20%02bu/%02bu/%02bu 星期%bu %02bu:%02bu:%02bu\r\n",YEAR,MONTH,DAY,WEEK,HOUR,MIN,SEC);
- }
-
- Delay_ms(250);
- Delay_ms(250);
- }
- }
-
- void Uart_Start(void)
- {
- TH0=TMR>>8;
- TL0=TMR;
- TR0=1;
- }
-
- void Uart_Stop(void)
- {
- TR0=0;
- TH0=TMR>>8;
- TL0=TMR;
- RP=0;
- memset(R_Buf,0x00,sizeof R_Buf);
- }
-
- void TMR0_Isr(void) interrupt TMR0_VECTOR
- {
- // UART_Return(RP);
- Uart_Stop();
- }
-
- void UART1_Isr(void) interrupt UART1_VECTOR
- {
- if(RI)
- {
- RI=0;
- Uart_Start();
- R_Buf[RP]=SBUF;
- if(RP==0)
- {
- if(R_Buf[0]==Slave_Addr||R_Buf[0]==Broad_Addr)
- {
-
- }
- else
- {
- Uart_Stop();
- }
- }
- else if(RP==1)
- {
- if(R_Buf[1]==0x0B)
- {
- Uart_R_Len=R_Buf[1]+2;
- }
- else
- {
- Uart_Stop();
- }
- }
- else if(RP==Uart_R_Len-1)
- {
- INIYEAR= R_Buf[3]; //初始化年
- INIMONTH= R_Buf[4]; //初始化月
- INIDAY= R_Buf[5]; //初始化日
- INIHOUR= R_Buf[7]; //初始化时
- INIMIN= R_Buf[8]; //初始化分
- INISEC= R_Buf[9]; //初始化秒
- INISSEC= 0; //初始化1/128秒
- INIWEEK= R_Buf[6]; //初始化星期
- RTCCFG|=0x01; //初始化RTC
- Uart_Stop();
- }
- else if(RP==R_Buf_Len-1)
- {
- Uart_Stop();
- }
- if(TR0)
- {
- RP++;
- }
- }
- if(TI)
- {
- TI=0;
- if(TP==Uart_T_Len)
- {
- // TR=R;
- TP=0;
- Uart_T_Len=0;
- }
- if(Uart_T_Len!=0)
- {
- // TR=T;
- SBUF=(T_Buf[TP]);
- TP++;
- }
- }
- }
-
- void RTC_Isr(void) interrupt RTC_VECTOR
- {
- // if(RTCIF&0x80) //闹钟中断
- // {
- // RTCIF&=~0x80;
- // }
- // if(RTCIF&0x40) //日中断
- // {
- // RTCIF&=~0x40;
- // }
- // if(RTCIF&0x20) //时中断
- // {
- // RTCIF&=~0x20;
- // }
- // if(RTCIF&0x10) //分中断
- // {
- // RTCIF&=~0x10;
- // }
- if(RTCIF&0x08) //秒中断
- {
- RTCIF&=~0x08;
- RTC_1s_Flag=1;
- }
- // if(RTCIF&0x04) //1/2秒中断
- // {
- // RTCIF&=~0x04;
- // }
- // if(RTCIF&0x02) //1/8秒中断
- // {
- // RTCIF&=~0x02;
- // }
- // if(RTCIF&0x01) //1/32秒中断
- // {
- // RTCIF&=~0x01;
- // }
- }
复制代码
|