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

📄 c51_数字钟.txt

📁 本原码是采用c51编写的一个数字时钟
💻 TXT
字号:
#include<reg51.h>
#include<absacc.h>
#define second XBYTE [0x6000]
#define second_n XBYTE [0x6001]
#define minute XBYTE [0x6002]
#define minute_n XBYTE [0x6003]
#define hour XBYTE [0x6004]
#define hour_n XBYTE [0x6005]
#define day XBYTE [0x6007]
#define month XBYTE [0x6008]
#define	year XBYTE [0x6009]  
#define reg_a XBYTE [0x600a]
#define reg_b XBYTE [0x600b]
#define reg_c XBYTE [0x600c]
#define reg_d XBYTE [0x600d]
#define Order XBYTE [0x2021]
#define Date XBYTE [0x2020]
#define uchar unsigned char
     
uchar code table[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};/*8279对应字符表*/
unsigned int se,mi,ho,da,mo,ye,se1,mi1,ho1,sta = 0,times=10;
sbit clflag = ACC^7;
sbit p1_0 = P1^0;
sbit p1_1 = P1^1;
sbit p1_2 = P1^2;

uchar deky(void)
{
	uchar i;
	i=Order;
	return(i&0x0f);
}

uchar keyin(void)
{
	uchar i;
	while(deky()==0);
	Order=0x40;
	i=Date;
	i=i&0x3f;//取低六位
	return(i);
}

void delay()/*延时*/
{
	int i,j;
	for(i = 0;i < 100;i++)
	{
		for(j = 0;j < 100;j++)
		{
		}
	}
}

void init()/*8279初始化*/
{
	Order = 0xd1;//总清除
	do
	{
		ACC = Order;
	}while(clflag == 1);

	Order = 0x00;
	Order = 0x34;
	Order = 0x90;
	reg_a = 0x2f;//启动晶振
	delay();
}

void writetime()/*初始显示*/
{
	reg_b = 0xc0;	

	second = second;
	minute = minute;
	hour = hour;
	day = day;
	month = month;
	year = year;
	second_n = second_n;
	minute_n = minute_n;
	hour_n = hour_n;
	
	reg_b = 0x42;//set=0;BCD模式24进制
	ACC = 0x00;
	ACC = reg_b;		
}

readtime()
{
	do
	{
		ACC = reg_a;
	}while(clflag == 1);
	
	se = second;
	mi = minute;
	ho = hour;
	da = day;
	mo = month;
	ye = year;
	se1 = second_n;
	mi1 = minute_n;
	ho1 = hour_n;		

}

void ds12887() interrupt 0
{
	EX1 =0;
	ACC = reg_c;
	readtime();
	P1 = 0xff;		
	if(se == second_n && mi == minute_n && ho == hour_n)/*闹铃*/
	{
		do
		{	
			Order = 0x80;
	    	Date = table[ho/16];
		    Order = 0x81;
	    	Date = table[ho%16];
	    	Order = 0x83;
	    	Date = table[mi/16];
	    	Order = 0x84;
    		Date = table[mi%16];
	    	Order = 0x86;
	    	Date = table[se/16];
	    	Order = 0x87;
	    	Date = table[se%16];
	    	delay();
	    	Order = 0xc3;
	    	delay();
	    		
			p1_2 = p1_2 ^ 1;
		    delay();		
			times--;	
		}while(times>0);
	}	
	
	if(p1_0==1) {sta = sta+1;if (sta==4) sta=0;}

	if(sta==0 && p1_1==1)/*显示十分秒*/
	{
		Order = 0x80;
		Date = table[ho/16];
		Order = 0x81;
		Date = table[ho%16];
		Order = 0x83;
		Date = table[mi/16];
		Order = 0x84;
		Date = table[mi%16];
		Order = 0x86;
		Date = table[se/16];
		Order = 0x87;
		Date = table[se%16];
	}
		
	if(sta==1 && p1_1==1)/*显示年月日*/
	{
		Order = 0x80;
		Date = table[ye/16];
		Order = 0x81;
		Date = table[ye%16];
		Order = 0x83;
		Date = table[mo/16];
		Order = 0x84;
		Date = table[mo%16];
		Order = 0x86;
		Date = table[da/16];
		Order = 0x87;
		Date = table[da%16];
	}

	if(sta ==2 && p1_1==1)/*显示闹铃*/
	{
		Order = 0x80;
		Date = table[ho1/16];
		Order = 0x81;
		Date = table[ho1%16];
		Order = 0x83;
		Date = table[mi1/16];
		Order = 0x84;
		Date = table[mi1%16];
		Order = 0x86;
		Date = table[se1/16];
		Order = 0x87;
		Date = table[se1%16];
	}

   	if(sta==3 && p1_1==1)/*省电*/
   	{
   	  	Order = 0xc3;
   	  	
   		}	
	EX1 =1;
}

void xp8279() interrupt 2
{
	int temp1,temp2,temp3;
	P1 = 0xff;
	EX1=0;
	reg_b|=0x80;//12887停止计时

    if(p1_0 == 1) {sta = sta+1;if (sta==3) sta=0;} 

	if(p1_1 == 1 )
	{
		temp3=keyin();
	}
	
	if(p1_1 == 0 && sta==0)/*修改时分秒*/
	{            
		temp1 = keyin();
		Order = 0x80;
		Date = table[temp1];
		temp2 = keyin();
		Order = 0x81;
		Date = table[temp2];
		hour = temp1 * 16 + temp2;
		
		temp1 = keyin();
		Order = 0x83;
		Date = table[temp1];
		temp2 = keyin();
		Order = 0x84;
		Date = table[temp2];
		minute = temp1 * 16 + temp2;
		
		temp1 = keyin();
		Order = 0x86;
		Date = table[temp1];
		temp2 = keyin();
		Order = 0x87;
		Date = table[temp2];
		second = temp1 * 16 + temp2;
				
	}

	if(p1_1 == 0 && sta==1)/*修改年月日*/
	{
		temp1 = keyin();
		Order = 0x80;
		Date = table[temp1];
		temp2 = keyin();
		Order = 0x81;
		Date = table[temp2];
		year = temp1 * 16 + temp2;
		
		temp1 = keyin();
		Order = 0x83;
		Date = table[temp1];
		temp2 = keyin();
		Order = 0x84;
		Date = table[temp2];
		month = temp1 * 16 + temp2;
		
		temp1 = keyin();
		Order = 0x86;
		Date = table[temp1];
		temp2 = keyin();
		Order = 0x87;
		Date = table[temp2];
		day = temp1 * 16 + temp2;
	}

	if(p1_1 == 0 && sta==2)/*修改闹铃*/
	{
		temp1 = keyin();
		Order = 0x80;
		Date = table[temp1];
		temp2 = keyin();
		Order = 0x81;
		Date = table[temp2];
		hour_n = temp1 * 16 + temp2;
		
		temp1 = keyin();
		Order = 0x83;
		Date = table[temp1];
		temp2 = keyin();
		Order = 0x84;
		Date = table[temp2];
		minute_n = temp1 * 16 + temp2;
		
		temp1 = keyin();
		Order = 0x86;
		Date = table[temp1];
		temp2 = keyin();
		Order = 0x87;
		Date = table[temp2];
		second_n = temp1 * 16 + temp2;
		
	}
	reg_b&=0x7f;//允许计时
	EX1 = 1;
}

void main()
{
	init();
	writetime();
	/*中断设置*/
	EA = 1;
	PX1 = 1;
	EX1 = 1;
	EX0 = 1; 	                                                 
	readtime();
	while(1);
}

⌨️ 快捷键说明

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