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

📄 starled.c

📁 ds12887时钟芯片应用源代码
💻 C
字号:
#include<reg52.h>

#define uchar unsigned char 
#define uint unsigned int
sbit rs=P3^5;
sbit lcden=P3^4;
sbit s1=P3^0;
sbit s2=P3^1;
sbit s3=P3^2;

sbit beep=P2^3;
sbit dscs=P1^4;
sbit dsas=P1^5;
sbit dsrw=P1^6;
sbit dsds=P1^7;
sbit dsirq=P3^3;
uchar count,s1num,flag,flag1;
char miao,shi,fen;
uchar code table[]="  2007-7-30 MON";
uchar code table1[]="      :  :  ";
void write_ds(uchar,uchar);			//声明函数
void set_alarm(uchar,uchar,uchar);
uchar read_ds(uchar);
//void set_time();

void delay(uint z)
{
	uint x,y;
	for(x=z;x>0;x--)
		for(y=110;y>0;y--);
}

void didi() 	//蜂鸣器报警声
{
	beep=0;
	delay(50);
	beep=1;
	delay(100);
	beep=0;
	delay(50);
	beep=1;
}
void write_com(uchar com)
{
	rs=0;
	lcden=0;
	P0=com;
	delay(5);
	lcden=1;
	delay(5);
	lcden=0;	
}

void write_date(uchar date)
{
	rs=1;
	lcden=0;
	P0=date;
	delay(5);
	lcden=1;
	delay(5);
	lcden=0;	
}

void init()
{
	uchar num;
	EA=1;
	EX0=1;
	IT0=1;

	lcden=0;
//	set_time();
	set_alarm(14,13,10);	//闹钟定时时间(14:13:10)
	write_ds(0x0B,0x26);//B寄存器写入0X26(0010 0110)开启闹钟,二进制格式,12小时模式	
	read_ds(0x0c);	//读取一次C寄存器才能消除中断标志响应下一次中断
	write_com(0x38);
	write_com(0x0c);
	write_com(0x06);
	write_com(0x01);
	write_com(0x80);
	for(num=0;num<15;num++)
		{
			write_date(table[num]);
			delay(5);
		}
	write_com(0x80+0x40);
	for(num=0;num<12;num++)
		{
			write_date(table1[num]);
			delay(5);
		}

}

void write_sfm(uchar add,uchar date)
{
	uchar shi,ge;
	shi=date/10;
	ge=date%10;
	write_com(0x80+0x40+add);
	write_date(0x30+shi);
	write_date(0x30+ge);
}

void keyscan()
{
	
	if(flag1==1)	 //响应中断后flag1=1说明正在报警
	{
		if(s2==0)	 //报警时按任意键消除报警
		{	
			delay(5);
			if(s2==0)
			{
				while(!s2);
				flag1=0;	  //消除报警后flag1=0,以备下次消除
			}
			 	
		}
		if(s3==0)
		{	
			delay(5);
			if(s3==0)
			{
				while(!s3);
				flag1=0;		 //消除报警后flag1=0,以备下次消除
			}
			 	
		}
	}
		
	if(s1==0)	
	{
		delay(5);
		if(s1==0)
		{	s1num++;
			flag=1;	//flag=1时调表调好后写入887,然后flag置0重新读取887内数据
			flag1=0;//调表时不让蜂鸣器响
			while(!s1);
			if(s1num==1)
			{
				TR0=0;            //调表时停止走表
				write_com(0x80+0x40+10); //1602miao地址
				write_com(0x0f);	//闪烁
			}
	}
			if(s1num==2)
			{
				write_com(0x80+0x40+7);
			}
			if(s1num==3)
			{
				write_com(0x80+0x40+4);
			}
			if(s1num==4)
			{			 //调好表后把时分秒数据写入12887
				s1num=0;
				write_com(0x0c); //停止闪烁
		//		flag=0;			 
				write_ds(0,miao); //把调好的数据写入miao寄存器
				write_ds(2,fen);
				write_ds(4,shi);
				flag=0;			 //flag清0使调好的数据重新写入887

			}

				
		}
		if(s1num!=0)
		{
			if(s2==0)
			{
				delay(1);
				if(s2==0)
				{
					while(!s2);
					if(s1num==1)
					{
						miao++;
						if(miao==60)
							miao=0;
						write_sfm(10,miao);
						write_com(0x80+0x40+10);
						
						
					}
					if(s1num==2)
					{
						fen++;
						if(fen==60)
							fen=0;
						write_sfm(7,fen);
						write_com(0x80+0x40+7);
					}
					if(s1num==3)
					{
						shi++;
						if(shi==24)
							shi=0;
						write_sfm(4,shi);
						write_com(0x80+0x40+4);
					}
				}
			}
			if(s3==0)
			{
				delay(1);
				if(s3==0)
				{
					while(!s3);
					if(s1num==1)
					{
						miao--;
						if(miao==-1)
							miao=59;
						write_sfm(10,miao);
						write_com(0x80+0x40+10);
					}
					if(s1num==2)
					{
						fen--;
						if(fen==-1)
							fen=59;
						write_sfm(7,fen);
						write_com(0x80+0x40+7);
					}
					if(s1num==3)
					{
						shi--;
						if(shi==-1)
							shi=23;
						write_sfm(4,shi);
						write_com(0x80+0x40+4);
					}
				}
			}
		}
}
/*******************************************************************/
/*                                                                 */
/* ds128c87程序                                                      */
/*                                                                 */
/*******************************************************************/

void write_ds(uchar add,uchar date)//在指定地址写入数据
{
	dscs=0;
	dsas=1;
	dsds=1;
	dsrw=1;
	P0=add;
	dsas=0;
	dsrw=0;
	P0=date;
	dsrw=1;
	dsas=1;
	dscs=1;				
}

uchar read_ds(uchar add)	//读取指定地址的数据
{
 	uchar ds_date;
	dsas=1;
	dsds=1;
	dsrw=1;
	dscs=0;
	P0=add;
	dsas=0;
	dsds=0;
	P0=0xff;		//单片机读取数据之前赋高
	ds_date=P0;
	dsds=1;
	dsas=1;
	dscs=1;
	return ds_date;	
}

/*void set_time()	   //初始化定时
{
	write_ds(4,10);
	write_ds(2,32);
	
}		 */

void set_alarm(uchar ashi,uchar afen,uchar amiao)	 //闹钟定时 时\分\秒
{
	write_ds(1,amiao);
	write_ds(3,afen);
	write_ds(5,ashi);
}
void main()
{
	init();
	while(1)
	{
		keyscan();
		if(flag1==1)
			didi();
		if(flag==0)
//flag=1时调表调好后写入887,然后flag置0重新读取887内数据
		{
			miao=read_ds(0);	
			fen=read_ds(2);
			shi=read_ds(4);
			write_sfm(10,miao);
			write_sfm(7,fen);
			write_sfm(4,shi);
		}
	}
}

void exter() interrupt 0	  //19脚接P3.2
{	uchar c;
	flag1=1;
	c=read_ds(0x0c); //重读C寄存器,消除中断标志以备响应下一次中断
}



⌨️ 快捷键说明

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