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

📄 contorl.c

📁 基于51单片机、MAX7219和DS12887的电源开关节能控制器程序。通过按键控制
💻 C
字号:
// RTC modle DS12887 driver and controller
// 7 segments LED 88888888 displayer
// Year, month, day, hour, minute and second display
// Functions display and keyboard
#include <aduc812.h>
#include <intrins.h>

#define	uchar	unsigned char 

#define DSAD	P2
#define LOCKRTC		writeDS(0x0B,0x82)
#define FREERTC		writeDS(0x0B,0x02)

//const address, second
#define ca_sec		0x00
//const address, alarm second
#define ca_seca		0x01
//const address, minute
#define ca_min		0x02
//const address, alarm minute
#define ca_mina		0x03
//const address, hour
#define ca_hor		0x04
//const address, alarm hour
#define ca_hora		0x05
//const address, day
#define ca_day		0x07
//const address, month
#define ca_mon		0x08
//const address, year
#define ca_yer		0x09
//const address, alarm switch, 0-off, 1-on
#define ca_alrsw	0x10
//const address, alarm end of minute
#define ca_minae	0x11
//const address, alarm end of hour
#define ca_horae	0x12
//const address, alarm start of minute
#define ca_minas	0x13
//const address, alarm start of hour
#define ca_horas	0x14



//const char, display code of '-'
#define cc_cancel	0x0a
//const char, display nothing
#define cc_null		0x0f


//temp def

sbit	DSALE=P3^5;
sbit	DSnWR=P3^6;
sbit	DSnRD=P3^7;

sbit	SDA	=	P3^4;
sbit	SCK	=	P3^2;
sbit	SCS	=	P3^3;

sbit	KUP	=	P0^7;
sbit	KDN	=	P0^6;
sbit	KMO	=	P0^5;

sbit	BEE	=	P0^4;
sbit	SWT	=	P0^3;

//bit RTCSET;
//uchar	ldat; 			// to set the RTC date and time by comm
uchar	func; 			// functions
uchar	dispday;		// display date or time
//bit		alarm;

void writeDS(uchar addr,uchar val)
{
	DSAD=addr;
	DSALE=1;
	_nop_();_nop_();	
	DSALE=0;

	DSAD=val;	
	DSnWR=0;
	_nop_();_nop_();
	DSnWR=1;
}

void DSRAMWrite(uchar addr,uchar val)
{
LOCKRTC;
writeDS(addr,val);
FREERTC;
}

uchar DSRAMRead(uchar addr)
{	uchar i;
LOCKRTC;
	DSAD=addr;
	DSALE=1;
	_nop_();	
	DSALE=0;

	DSAD=0xff;
	DSnRD=0;
	_nop_();_nop_();	
	i=DSAD;
	DSnRD=1;
FREERTC;
return i;
}

void send(uchar sc)
{
	SBUF=sc;
	while(TI==0);
	TI=0;
}

void serial () interrupt 4 
{	uchar rcvd;
if(RI){
    RI = 0;
   	rcvd=SBUF;
/*
   	if (ldat==0xe5) DSRAMWrite(0x10,rcvd);//		set the second
	if (ldat==0xe4)	DSRAMWrite(0x11,rcvd);//		set the minute
	if (ldat==0xe3)	DSRAMWrite(0x12,rcvd);//		set the hour
	if (ldat==0xe2)	DSRAMWrite(0x13,rcvd);//		set the day
	if (ldat==0xe1)	DSRAMWrite(0x14,rcvd);//		set the month (nEOSC nE32K month5-0)
	if (ldat==0xe0)	DSRAMWrite(0x15,rcvd);//		set xx year
	if (rcvd==0xef){
 		uchar sc,mi,hr,da,mo,yr;
		sc=DSRAMRead(0x10);mi=DSRAMRead(0x11);hr=DSRAMRead(0x12);
		da=DSRAMRead(0x13);mo=DSRAMRead(0x14);yr=DSRAMRead(0x15);

		send(0xef);send(hr);send(mi);send(sc);

		DSRAMWrite(0x0A,0x20);	//rtc initialtive
		DSRAMWrite(0,sc);DSRAMWrite(2,mi);DSRAMWrite(4,hr);
		DSRAMWrite(7,da);DSRAMWrite(8,mo);DSRAMWrite(9,yr);	
		}
  	ldat=rcvd;
*/
   	}
}



void sendled(uchar sch,uchar scl)		//自定义字模
{uchar i;   
	SCS=0;
for (i=128;i!=0;i/=2){
	SDA=(sch & i);
	SCK=1;
	_nop_();
	SCK=0;
	}
for (i=128;i!=0;i/=2){
	SDA=(scl & i);
	SCK=1;
	_nop_();
	SCK=0;
	}
	SCS=1;
}

bit proc0(uchar addr,uchar minv,uchar maxv)
{uchar mi;bit chg=0;
			mi=DSRAMRead(addr);
			if (KUP==0) {chg=1;mi++;if (mi>maxv) mi=minv;if ((mi%16)>9) mi+=6;}
			if (KDN==0) {chg=1;mi--;if (mi<minv || mi>maxv) mi=maxv;if ((mi%16)>9) mi-=6;}
			DSRAMWrite(0x0A,0x20); 
			DSRAMWrite(addr,mi);
			return chg;
}

void rtcmcpy(uchar fromadd,uchar toadd)
{uchar mi;
			mi=DSRAMRead(fromadd);
			DSRAMWrite(0x0A,0x20); 
			DSRAMWrite(toadd,mi);
}

bit delay()
{uchar a,b;
 uchar kb,kc;
 bit update=0;

 P0|=0xe0; kb=P0;kb|= 0x1f;				// Keyboard port

 for (b=180;b!=0;b--)		//delay
	for (a=180;a!=0;a--);

 P0|=0xe0; kc=P0;kc|= 0x1f;

 if (kc==kb && kb!=0xff){
 		update=1;
		if (func==6 && (KUP==0 || KDN==0)) {
			DSRAMWrite(0x0A,0x20); 
			DSRAMWrite(ca_sec,0);
			} 	
		if (func==11) {proc0(ca_minae,0,0x59);}		//alarm end minute
		if (func==10) {proc0(ca_horae,0,0x23);}		//alarm end hour
		if (func==9) {proc0(ca_minas,0,0x59);}		//alarm start minute
		if (func==8) {proc0(ca_horas,0,0x23);}		//alarm start hour
		if (func==7) 
			{bit chg;
			chg=proc0(ca_alrsw,0,0x01);
			if (chg==1){
				rtcmcpy(ca_horas,ca_hora);
				rtcmcpy(ca_minas,ca_mina);
				}
			}								//alarm on/off
		if (func==5) proc0(ca_min,0,0x59);	// 	minute set
		if (func==4) proc0(ca_hor,0,0x23);	//	hour set
		if (func==3) proc0(ca_day,1,0x31);	// 	day set
		if (func==2) proc0(ca_mon,1,0x12);	//	month set
		if (func==1) proc0(ca_yer,0,0x99); //	year set
 	}
 if (kc!=kb && kc==0xff)
		{   update=1;
			if ((kb | 0xdf)==0xdf){uchar alr;
				func++;
				if (func>11) func=0;
				alr=DSRAMRead(ca_alrsw);
				if (alr==0 && func>7) func=0;
				dispday=3;
				if (func<10) dispday=2;
				if (func<7) dispday=0;
			 	if (func<4) dispday=1;
				if (func==0) dispday=0;
			  } else{
			  	if (func==0) dispday++;
			  }
			if (dispday>3) dispday=0;  // normal display functions
		}
 if (update==1) {BEE=1;return 1;} else {BEE=0;return 0;}
}

void ledinit()
{
	sendled(0x09,0xff);		//ff全译码  00 不译码 0f 前四位
	sendled(0x0a,4);		//亮度(0-15)
	sendled(0x0b,7);		//显示位数(0-7)
	sendled(0x0c,1);		//显示开关 1开  0关
}

void dispnull(uchar pos)
{
sendled(pos,cc_null);
sendled(pos+1,cc_null);
}

void dispnum(uchar pos,uchar num,bit dot)
{
	sendled(pos,(num/16));
	sendled(pos+1,128*(uchar)(dot)+(num & 0x0f));
}


void main()
{
uchar t;bit b;
uchar alr;
//		com init
	SCON  = 0x50;       //SCON: serail mode 1, 8-bit UART, enable ucvr 
    TMOD |= 0x20;       //TMOD: timer 1, mode 2, 8-bit reload 
    PCON |= 0x80;       //SMOD=1; 
    TH1   = 0xF3;       //F-Baudrate:4806  fosc=12MHz 
    IE    = 0x90;       //Enable Serial 
    TR1   = 1;          // timer 1 run 
	BEE	=0;
	SWT	=0;

	ledinit();//		led init

	DSRAMWrite(0x0A,0x20);	//rtc initialtive
	sendled(0x0f,1);			//	led test
	delay();delay();
	sendled(0x0f,0);			//	led test
while(1){
	ledinit();

	alr=DSRAMRead(ca_alrsw);					//Read the alarm enable byte

	if (dispday<2)
		{sendled(1,func);
		sendled(2,0x0f);
		if (dispday==0)					//-------------hour minute and second display
  			{
 			t=DSRAMRead(0x00);//send(t);//		Read the second
			if (func==6 && b==0){dispnull(7);} else {dispnum(7,t,0);}
			t=DSRAMRead(0x02);//send(t);//		Read the minute
			if (func==5 && b==0){dispnull(5);} else {dispnum(5,t,b);}
			t=DSRAMRead(0x04);//send(t);//		Read the hour
			if (func==4 && b==0){dispnull(3);} else {dispnum(3,t,b);} 
  			}
		if (dispday==1){				// --------------year month day display
			t=DSRAMRead(ca_day);//send(t);//		Read the day
			if (func==3 && b==0){dispnull(7);} else {dispnum(7,t,0);}
			t=DSRAMRead(ca_mon);//send(t);//		Read the month (nEOSC nE32K month5-0)
			if (func==2 && b==0){dispnull(5);} else {dispnum(5,t,1);}
			t=DSRAMRead(ca_yer);//send(t);//
			if (func==1 && b==0){dispnull(3);} else {dispnum(3,t,1);}
		  	}
		}
	  else {					//--------alarm display display>=2
		if (alr==1)	sendled(1,0x0d); else sendled(1,0x0a);// alarm signal
			dispnull(3);
		if (dispday==2){// display the alarm start clock
			if (func!=7) sendled(2,0x00);
 			t=DSRAMRead(ca_horas);//		Read the alarm start hour
	  		if (func==8 && b==0){dispnull(5);} else {dispnum(5,t,1);}
 			t=DSRAMRead(ca_minas);//		Read the alarm start minute
			if (func==9 && b==0){dispnull(7);} else {dispnum(7,t,0);}
			}//	-- endif display=2

		if (dispday==3){// display the alarm end clock
			sendled(2,0x01);
 			t=DSRAMRead(ca_horae);//		Read the alarm start hour
	  		if (func==10 && b==0){dispnull(5);} else {dispnum(5,t,1);}
 			t=DSRAMRead(ca_minae);//		Read the alarm start minute
			if (func==11 && b==0){dispnull(7);} else {dispnum(7,t,0);}
			}//	-- endif display=3

		if (func==7){			//	func7 Set or Cancel the alarm
 				sendled(2,cc_cancel);
			if (alr==0){		//	Cancel, display ----
 				sendled(5,cc_cancel);	sendled(6,cc_cancel);
  				sendled(7,cc_cancel);	sendled(8,cc_cancel);} 
				else{			//	Set, display the alarm time
		 		t=DSRAMRead(ca_horas);//		Read the alarm start hour
				dispnum(5,t,1);
			 	t=DSRAMRead(ca_minas);//		Read the alarm start minute
				dispnum(7,t,0);
				}//----		end if alarm=0
  	 		}//------	end if func=7

		}// endif	display<2 

  	t=DSRAMRead(0x0c);//		alarm judgement
	if (((t | 0xdf)==0xff) && (alr!=0)) 
		{	if (alr==1) 
				{BEE=1;SWT=1;alr++;
				DSRAMWrite(0x0A,0x20);	DSRAMWrite(ca_alrsw,alr);// update Alarm sign in DS12887
				rtcmcpy(ca_horae,ca_hora);rtcmcpy(ca_minae,ca_mina);				
				} else {BEE=1;SWT=0;alr=1;
				DSRAMWrite(0x0A,0x20);	DSRAMWrite(ca_alrsw,alr);// update Alarm sign in DS12887
				}
		}
	if (delay()==1) 
		{b=1; 
		 if (alr==1){rtcmcpy(ca_horas,ca_hora);	rtcmcpy(ca_minas,ca_mina);}
		 if (alr==2){rtcmcpy(ca_horae,ca_hora);	rtcmcpy(ca_minae,ca_mina);}
		} else b=!b;
	}
}

⌨️ 快捷键说明

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