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

📄 rtcconf.c

📁 菜鸟,详细NRF24E1运用,程序,电路
💻 C
字号:
#include "reg24le1.h"
#include "rtcconf.h"

//函数

#define ONESTEP  33333

static char hour=0,minute=0,second=0;

void rtcconfig(void)  //rtc config
{
 RTC2CON&=0xfe;
 RTC2CMP1=0x7f;
 RTC2CMP0=0xff;
 RTC2CON=0x07;//mode 11外部捕捉关闭,使能RTC,触发捕捉
 //IRCON|=0x20;//int flag
 IE1|=0x20;
}

void delay(unsigned int dx)
{
int dj;
 for(;dx>0;dx--)
   for(dj=120;dj>0;dj--)
     {
	 ;
	 }
}

/*用来读取时间*/
void readtime(unsigned char *h,unsigned char *m,unsigned char *s)
{
*h=hour;
*m=minute;
*s=second;
}
/*用来设定时间,type 0,1,2 代表时分秒设置*/
void settime(unsigned char dat,char type)
{
if(type==0)
{hour=dat; }
else if(type==1)
{minute=dat;}
else if(type==2)
{second=dat;}
else puts("type error!");
send('\n');
if((hour>=24||hour<0)||(minute>=60||minute<0)||(second>=60||second<0))
puts("time set wrong,please set again use instructions!");
send('\n');
}
//IO口的初始化
void ioconfig()
{
 P1DIR&=0XFE; //初始化为输出
 P10=0;//初始化输出为0
 //led
}

//定时器演示
void timer0()
{
TMOD=0x01;
TH0=(65536-ONESTEP)/256;
TL0=(65536-ONESTEP)%256;
ET0=1;
TR0=1;
}


/*串口初始化*/
void uart_init()
{
    CLKCTRL = 0x28;			    // Clock sourced by XCOSC16M  	
	CLKLFCTRL = 0x01; 

	P0DIR &= 0xF7;				// P03 (TxD) is output
  	P0DIR |= 0x10;     			// P04 (RxD) is input 
	P0|=0x18;	 
		
	S0CON = 0x50;  
   	PCON |= 0x80; 				// SMOD = 1
  	WDCON |= 0x80;   			// Select internal baud rate generator 
	
	S0RELL = 0xFB; 	
  	S0RELL = 0xF3;              // BAUD_38K4 
	ES0=1;	 
}
//发送一个字节
void send(char ch)
{
S0BUF=ch;
while(!TI0);
TI0=0;
}
//打印一个字符串
void puts(char *str)
{
while(*str!='\0')
{
send(*str++);
}
  }

//rtc enable
void RTC_En()
{
TR0=1;//使能定时0
}
//rtc disable
void RTC_Dis()
{
TR0=0;//关闭定时器0
}

/*
指令的格式为$seth**#,$setm**#,$sets**#,用于设置时分秒,设置$stop用于暂停时间,$runc用于走时
*/

/*指令解码*/
void decode()
{
char buf;
static char insf=0;
unsigned char buffer[7];
static char num=0;
static char insh=0;
static char dat=0,count=0;
static char rtcstop=0,rtcgo=0;
static char mf=0,hf=0,sf=0;
static char disf=0;//显示指令的标志
if(RI0)
{
//LED=!LED;	//DEBUG
buf=S0BUF;
RI0=0;
if(buf=='$')
{insf=1;
 num=0;
}
if(insf)
{
if(buf!='$')
buffer[num++]=buf;
}
if(num==7)
{
insf=0;
 num=0;
//识别设置指令
if((buffer[0]=='s'||buffer[0]=='S')&&(buffer[1]=='e'||buffer[1]=='E')&&(buffer[2]=='t'||buffer[2]=='T'))
{insh=1;   }
//解析暂停指令
else if((buffer[0]=='s'||buffer[0]=='S')&&(buffer[1]=='t'||buffer[1]=='T')&&(buffer[2]=='o'||buffer[2]=='O')&&(buffer[3]=='p'||buffer[3]=='P'))
{rtcstop=1;
 rtcgo=0;
 LED=!LED;
}
//解析启动指令
else if((buffer[0]=='r'||buffer[0]=='R')&&(buffer[1]=='u'||buffer[1]=='U')&&(buffer[2]=='n'||buffer[2]=='N')&&(buffer[3]=='c'||buffer[3]=='C'))
{rtcgo=1;
 rtcstop=0;
 LED=!LED;
}
else if((buffer[0]=='s'||buffer[0]=='S')&&(buffer[1]=='h'||buffer[1]=='H')&&(buffer[2]=='o'||buffer[2]=='O')&&(buffer[3]=='w'||buffer[3]=='W'))
{
disf=1;//显示指令启用
}

//解析时间设置的指令
if(insh)
   {
   insh=0;
  switch(buffer[3])
      {
	  case 'h':
	  case 'H': hf=1;count=0;puts("hour set!");break;
	  case 'm':
	  case 'M': mf=1;count=0;puts("minute set!");break;	  
	  case 's':
	  case 'S': sf=1;count=0;puts("second set!");break;
	  default:{hf=mf=sf=0;}puts("this instruction is undefined!");break;	  	  
	  }

   }

if(rtcstop)
{ RTC_Dis();//暂停RTC模块
  puts("rtc stop working...");
  send('\n');
  rtcgo=0;
}

if(rtcgo)
{RTC_En(); //开启RTC模块
 puts("rtc start working...");
 send('\n');
 rtcstop=0;
}
if(disf)
{
disf=0;    //消除显示指令的标志
showtime();//执行显示函数
}

if(hf)
{
dat=(buffer[4]-'0')*10+(buffer[5]-'0');
if(buffer[6]=='#')
{
//写入时间
if(rtcstop)
{
 settime(dat,0);
 //debug
}
else puts("you don't stop time,please stop it use $stop!\n");
dat=0;
hf=0;
}
}

else if(mf)
{
dat=(buffer[4]-'0')*10+(buffer[5]-'0');
if(buffer[6]=='#')
{
//写入时间
if(rtcstop)
settime(dat,1);
else puts("you don't stop time,please stop it use $stop!\n");
dat=0;
mf=0;
}

}
else if(sf)
  {
dat=(buffer[4]-'0')*10+(buffer[5]-'0');
if(buffer[6]=='#')
    {
//写入时间
if(rtcstop==1)
settime(dat,2);
else puts("you don't stop time,please stop it use $stop!\n");
dat=0;
sf=0;
  }

 }
}



}


}

void timecount()
{
second++;
if(second>59)
{second=0;
 minute++;
 if(minute>59)
 {
 minute=0;
 hour++;
 if(hour>23)
 hour=0;
 }
}

}

void showtime()
{
puts("time==");
send(' ');
send((hour/10)+'0');
send((hour%10)+'0');
send(' ');
send(':');
send(' ');
send((minute/10)+'0');
send((minute%10)+'0');
send(' ');
send(':');
send(' ');
send((second/10)+'0');
send((second%10)+'0');
send('\n');
}



void uart_service() interrupt 4	//串口中断程序
{
if(TI0)
{
   TI0=0;
}
else{
//如果接受到数据

 decode();
 //timecount();
    }
 LED=!LED;//debug
}	

void tick() interrupt  INTERRUPT_TF0
{
static char num=0;
TR0=0;
TH0=(65536-ONESTEP)/256;
TL0=(65536-ONESTEP)%256;
if(num==40)
{
num=0;
timecount();
showtime();
LED=!LED;
}
num++;
TR0=1;
}










⌨️ 快捷键说明

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