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

📄 index.c

📁 万年历数字钟是一种用万年历时钟芯片实现年、月、日、时、分、秒计时
💻 C
字号:
/************************************************
时钟程序
版本:1.0.0
版权2007,沈佳华所有
************************************************/
#include<reg52.h>
#include<intrins.h>
#include<UserDefine.h>
#include<iic.h>

#define  uchar   unsigned char
#define	 uint 	 unsigned int

uchar	N=100,en=0,c=0;		//N用来定时计数次数,十次为0.5s,en用来是否开启选中为闪烁,c用来控制对那位进行闪烁
uchar	Y2=0,Y1=7,M2=1,M1=1,D2=1,D1=0,H2=2,H1=1,MU2=2,MU1=0,S2=0,S1=0,Tem2=1,Tem1=9,W;//年、月、日、时、分、秒、温度,星期的几个外部变量
uchar	temp;	//临时变量
uchar	code	TAB[]={0x3f,0x06,0x5b,0x27,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x00};//分别在数码管上显示0-9和"-"负号
uchar	code 	set[]={0x00,0x1f,0x00,0x50,0x20,0x15,0x04,0x11,0x07};	//初始化设定时间为2007年11月15日20点50分00秒
uchar   in[7];		//用来接收芯片数据
uchar	out[7];		//用来设置闹铃数据缓冲

void Init_Device(void);		//初始化单片机和时钟芯片函数
void	show(void);			//显示
void	Start_ADC0809(void);		//启动0809对温度传感器测量
uchar  transform(uchar);		//工程量转换程序
void  	KEY(void);			//按键,调时间和设定闹钟
void Tcs(void);		//将时间信号进行BCD译码
void	shanshuo(uchar i);		//选中为闪烁

main()
{
	Init_Device();		//初始化单片机和时钟芯片函数

	while(1)
	{
	  KEY();
	}
}

void	XINT0()	interrupt	0	//时钟芯片中断,最高
{
	read_N_byte(0x01,0x02,7,in);      //9--接收N个字节 CS_I2C为读寻址字节
	Tcs();		//将时间信号进行BCD译码
}


void  TT0()	 interrupt	1  using 1	//定时器0中断
{
	TR0=0;
    show();					//显示
	if(--N==0)
	{
	Start_ADC0809();		//启动0809,对温度传感器测量
	shanshuo(en);				//对选中为进行闪烁
	N=100;
	}
	TH0=0xEC;				//定时5ms
	TL0=0x77;
	TR0=1;
}

void  TADC()  interrupt 2	   //温度传感器ADC转换完成中断,最低
{
	ADC_EN=1;			//打开输出使能
	_nop_();
	temp=P1;			//将转换数码取到零时变量中
	_nop_();
	ADC_EN=0;			//关闭输出使能
	temp=transform(temp);		//工程量转换程序
	Tem2=temp;
	Tem2=Tem2>>4;		//将temp的高4位给了Tem2
	//Tem2=Tem2&0x0f;
	Tem1=temp&0x0f;		//将temp的低4位给了Tem1
}




void	shanshuo(uchar i)		//选中为闪烁
{
	uchar   a1,a2,a3=1;
	if(i!=0)
	{
		switch(c)
		{
			case	0:
				{
					a1=Y1;
					a2=Y2;
					if(a3==1)
					{
					Y1=11;
					Y2=11;
					}
					else
					{
					Y1=a1;
					Y2=a2;
					}
				}
			case	1:
				{
					a1=M1;
					a2=M2;
					if(a3==1)
					{
					M1=11;
					M2=11;
					}
					else
					{
					M1=a1;
					M2=a2;
					}
				}
			case	2:
				{
					a1=D1;
					a2=D2;
					if(a3==1)
					{
					D1=11;
					D2=11;
					}
					else
					{
					D1=a1;
					D2=a2;
					}
				}	
			case	3:
				{
					a1=H1;
					a2=H2;
					if(a3==1)
					{
					H1=11;
					H2=11;
					}
					else
					{
					H1=a1;
					H2=a2;
					}
				}
			case	4:
				{
					a1=MU1;
					a2=MU2;
					if(a3==1)
					{
					MU1=11;
					MU2=11;
					}
					else
					{
					MU1=a1;
					MU2=a2;
					}
				}
			case	5:
				{
					a1=S1;
					a2=S2;
					if(a3==1)
					{
					S1=11;
					S2=11;
					}
					else
					{
					S1=a1;
					S2=a2;
					}
				}
			case	6:
				{
					a1=W;
					if(a3==1)
					{
					W=11;
					}
					else
					{
					W=a1;
					}
				}
		}
	 a3=!a3;
	}
}
	
void Tcs(void)		//将时间信号进行BCD译码
{
	uchar	j,k,H,L;		
   if(k=0,k<7,k++)
	{
       switch(k)
	   {
	   	case	0:
	   		{
	  			 in[0]=in[0]&0x7f;	//秒的最高位需要屏蔽
				 j=in[0];
				 L=j&0x0f;
				 S1=TAB[L];
				 H=j>>4;
				 S2=TAB[H];
			}
	  	case	1:
			{
				in[1]=in[1]&0x7f;	//分的最高为屏蔽
				j=in[1];
				L=j&0x0f;
				MU1=TAB[L];
				H=j>>4;
				MU2=TAB[H];
			}

		 case	2:
		 	{
				in[2]=in[2]&0x3f;	//时的最高为屏蔽
				j=in[1];
				L=j&0x0f;
				H1=TAB[L];
				H=j>>4;
				H2=TAB[H];
			}
		 case	3:
		 	{
				in[3]=in[3]&0x3f;	//日的最高为屏蔽
				j=in[1];
				L=j&0x0f;
				D1=TAB[L];
				H=j>>4;
				D2=TAB[H];
			}
		 case	4:
		 	{
				in[4]=in[4]&0x07;	//星期的最高为屏蔽
				L=in[4];
				D1=TAB[L];
			}
		 case	5:
		 	{
				in[5]=in[5]&0x1f;	//月的最高为屏蔽
				j=in[1];
				L=j&0x0f;
				M1=TAB[L];
				H=j>>4;
				M2=TAB[H];
			}
		 case	6:			//年
		 	{
				j=in[1];
				L=j&0x0f;
				Y1=TAB[L];
				H=j>>4;
				Y2=TAB[H];
			}
	   	   
		}
	}

}

void Init_Device(void)		//初始化单片机和时钟芯片函数
{
	IE=0x87;				//开启定时器0和外中断0和外中断1
	IP=0x03;				//设置外中断0和定时器0为高优先级
	TMOD=0x01;				//设置定时器0为16位定时器模式
	TH0=0xEC;				//定时5ms
	TL0=0x77;
	LED=0;					//LED灯灭
	write_N_byte(0,0,9,set);   //发送N个字节 CS_I2C为24C02 IC地址
	TR0=1;					//启动定时器0
}

void	Start_ADC0809(void)		//启动0809对温度传感器测量
{
   ADC_EN=0;			//输出使能关闭
   ADC_S=1;
   _nop_();
   _nop_();
   ADC_S=0;
}

void	delay10ms(void)		//延时10ms
{
	uchar i=100,j=100;
	while(i--)
	{
		while(j--);
	}
}

void  	KEY(void)			//按键,调时间和设定闹钟
{
   if(key1==1)			//设定时间,未完成
 	  {
		delay10ms();	//延时10ms
		if(key1==1)
			{
				while(key1==0);
			}
  	  }
	if(key3==1)			//设定闹钟,未完成
		{
			delay10ms();
			if(key3==1)
			{
				while(key3==0);
			}

		}
}

uchar transform(uchar i)		//对温度的工程量转换程序
{
	//比如说当数码为0FFH时的温度是50摄氏度,00H时为负5摄氏度.请按实际情况修改
	uchar j;
//添加实际代码
	j=i;
	return j;
}

void	show(void)			//显示
{
	P2=Year4;		//最高位显示2
	P0=TAB[0];
	_nop_();
	P2=Year3;		//第二位显示0
	P0=TAB[0];		
	_nop_();
	P2=Year2;		//一下是根据变量显示
	P0=TAB[Y2];
	_nop_();
	P2=Year1;		
	P0=TAB[Y1];
	_nop_();
	P2=Month2;		//显示月份
	P0=TAB[M2];
	_nop_();
	P2=Month1;		
	P0=TAB[M1];
	_nop_();
	P2=Day2;		//显示日
	P0=TAB[D2];
	_nop_();
	P2=Day1;
	P0=TAB[D1];
	_nop_();
	P2=Hour2;		//显示时间
	P0=TAB[H2];
	_nop_();
	P2=Hour1;
	P0=TAB[H1];
	_nop_();
	P2=Minute2;		//显示分钟
	P0=TAB[MU2];
	_nop_();
	P2=Minute1;
	P0=TAB[MU1];
	_nop_();
	P2=Second2;		//显示秒
	P0=TAB[S2];
	_nop_();
	P2=Second1;
	P0=TAB[S1];
	_nop_();
	P2=Temperature2;	//显示温度
	P0=TAB[T2];
	_nop_();
	P2=Temperature1;
	P0=TAB[T1];
	_nop_();
}

⌨️ 快捷键说明

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