解释一下单片机的程序!!!!!自己实在是不理解
程序代码:#include "AT89X51.H"
#include "delay.h"
#include "max7219.c"
#include "music.c"
#define uchar unsigned char
#define uint unsigned int idata
sbit ADD=P1^1;
sbit SUB=P1^0;
sbit ACC0 = ACC^0;
sbit ACC7 = ACC^7;
void showDay(void);//显示时间
void showData(void);//显示日期
void showDishi(void);//显示定时
void int_0(void);//中断0
void int_1(void);//中断1
void flash_max7219(unsigned char n);//闪一个位max7219
/*********************************************************************/
/* 实时时钟模块 时钟芯片型号:DS1302 */
/*/
/*********************************************************************/
sbit T_CLK = P2^3; /*实时时钟时钟线引脚 */
sbit T_IO = P2^4; /*实时时钟数据线引脚 */
sbit T_RST = P2^5; /*实时时钟复位线引脚 */
/********************************************************************/
void v_RTInputByte(uchar ucDa); //往DS1302写入1Byte数据
uchar uc_RTOutputByte(void);// 从DS1302读取1Byte数据
void v_W1302(uchar ucAddr, uchar ucDa);//往DS1302写入数据
uchar uc_R1302(uchar ucAddr);//读取DS1302某地址的数据
void v_Set1302(uchar *pSecDa) ;//设置初始时间,,输入: pSecDa: 初始时间地址。初始时间格式为: 秒 分 时 日 月 星期 年
void v_Get1302(uchar ucCurtime[]) ;//读取DS1302当前时间
uchar showTime[8]={0,0,10,0,0,10,0,0};//显示的时间**********************************************全局变量
uchar setTime[2]={0,0};//定时的设定
uchar time[7]={0,0x59,0x19,0x24,0x7,0x01,0x08};//秒 分 时 日 月 星期 年
uchar Tmod=7;//此时的调节模式
void main()
{
delay_ms(200);
initMAX7219();//初始化max7219
cls();//清屏max7219
EX0=1;
EX1=1;
IT1=1;//下降沿触发
IT0=1;
EA=1;//开中断
v_Get1302(& time);
showDay();
while(1)
{
v_Get1302(& time);
showDay();
if ((setTime[0]==time[2])&&(setTime[1]==time[1]))sound();
}
}
//************************************************显示时间
void showDay(void)
{
//将数据转化为显示格式
showTime[7]=time[0] & 0x0f;//个位
showTime[6]=time[0]>>4;//十位
showTime[4]=time[1] & 0x0f;
showTime[3]=time[1]>>4;
showTime[1]=time[2] & 0x0f;
showTime[0]=time[2]>>4;
showTime[2]=showTime[5]=10;
disp_88(& showTime);
}
//*************************************************显示日期
void showData(void)
{
showTime[7]=time[3] & 0x0f;
showTime[6]=time[3]>>4;
showTime[4]=time[4] & 0x0f;
showTime[3]=time[4]>>4;
showTime[1]=time[6] & 0x0f;
showTime[0]=time[6]>>4;
showTime[2]=showTime[5]=10;
disp_88(& showTime);
}
//*************************************************显示定时
void showDishi(void)
{
showTime[1]=setTime[0] & 0x0f;
showTime[0]=setTime[0]>>4;
showTime[4]=setTime[1] & 0x0f;
showTime[3]=setTime[1]>>4;
showTime[6]=12;
showTime[7]=13;
showTime[2]=showTime[5]=10;
disp_88(& showTime);
}
//***********************************************中断0子程序
void int_0(void) interrupt 0
{
uint i;
EA=0;
delay_ms(10);
while(!INT0){;}
Tmod+=1;
if(Tmod==7)goto inout;
if (Tmod==8)Tmod=0;
while(1)
{
flash_max7219(Tmod);
for (i=0;i<20000;i++)
{
if (!INT0)
{
delay_ms(40);
while(!INT0){;}
if(Tmod==6)goto inout;
Tmod+=1;
if(Tmod==8)Tmod=0;
}
else if ((!ADD) || (!SUB))//调节时间
{
switch(Tmod)
{
case 0: //年
if (!ADD)
{
time[6]+=0x01;
if ((time[6] & 0x0f)==10)time[6]+=0x06;
if ((time[6]>>4)==10)time[6]=0;
}
else
{
time[6]-=0x01;
if ((time[6] & 0x0f)==15)time[6]-=0x06;
if ((time[6]>>4)==15)time[6]=0x99;
}
break;
case 1: //月
if (!ADD)
{
time[4]+=0x01;
if((time[4] & 0x0f)==10)time[4]+=0x06;
if(time[4]==0x13)time[4]=0x01;
}
else
{
time[4]-=0x01;
if((time[4] & 0x0f)==15)time[4]-=0x06;
if(time[4]==0)time[4]=0x12;
}
break;
case 2: //日
if (!ADD)
{
time[3]+=0x01;
if ((time[3] & 0x0f)==10)time[3]+=0x06;
if (time[3]==0x32)time[3]=1;
}
else
{
time[3]-=0x01;
if ((time[3] & 0x0f)==15)time[3]-=0x06;
if (time[3]==0)time[3]=0x31;
}
break;
case 3: //时
if (!ADD)
{
time[2]+=0x01;
if ((time[2] & 0x0f)==10)time[2]+=0x06;
if (time[2]==0x24)time[2]=0;
}
else
{
time[2]-=0x01;
if ((time[2] & 0x0f)==15)time[2]-=0x06;
if ((time[2]>>4)==15)time[2]=0x23;
}
break;
case 4: //分
if (!ADD)
{
time[1]+=0x01;
if ((time[1] & 0x0f)==10)time[1]+=0x06;
if (time[1]==0x60)time[1]=0;
}
else
{
time[1]-=0x01;
if ((time[1] & 0x0f)==15)time[1]-=0x06;
if ((time[1]>>4)==15)time[1]=0x59;
}
break;
case 5: //定时
if (!ADD)
{
if (setTime[0]==0xAA)setTime[0]=0x24;
setTime[0]+=0x01;
if ((setTime[0] & 0x0f)==10)setTime[0]+=0x06;
if (setTime[0]==0x25)setTime[0]=0;
if (setTime[0]==0x24)setTime[0]=0xAA;
}
else
{
if (setTime[0]==0xAA)setTime[0]=0x24;
setTime[0]-=0x01;
if ((setTime[0] & 0x0f)==15)setTime[0]-=0x06;
if ((setTime[0]>>4)==15)setTime[0]=0x24;
if (setTime[0]==24)setTime[0]=0xAA;
}
break;
case 6: //定分
if (!ADD)
{
setTime[1]+=0x01;
if ((setTime[1] & 0x0f)==10)setTime[1]+=0x06;
if (setTime[1]==0x60)setTime[1]=0;
}
else
{
setTime[1]-=0x01;
if ((setTime[1] & 0x0f)==15)setTime[1]-=0x06;
if ((setTime[1]>>4)==15)setTime[1]=0x59;
}
break;
case 7:
break;
}
while((!ADD) || (!SUB)){;}
}
}
}
inout:
v_Set1302(& time);
EA=1;
}
//**********************************************中断序1子程序
void int_1(void) interrupt 2
{
showData();
delay_ms(200);
}
//*****************************************闪一个位
void flash_max7219(unsigned char n)
{
switch(n)
{
case 0:
showData();
delay_ms(40);
//cls();
showTime[0]=11;
showTime[1]=11;
disp_88(& showTime);
break;
case 1:
showData();
delay_ms(40);
//cls();
showTime[3]=11;
showTime[4]=11;
disp_88(& showTime);
break;
case 2:
showData();
delay_ms(40);
//cls();
showTime[6]=11;
showTime[7]=11;
disp_88(& showTime);
break;
case 3:
showDay();
delay_ms(40);
//cls();
showTime[0]=11;
showTime[1]=11;
disp_88(& showTime);
break;
case 4:
showDay();
delay_ms(40);
//cls();
showTime[3]=11;
showTime[4]=11;
disp_88(& showTime);
break;
case 5:
showDishi();
delay_ms(40);
//cls();
showTime[0]=11;
showTime[1]=11;
disp_88(& showTime);
break;
case 6:
showDishi();
delay_ms(40);
//cls();
showTime[3]=11;
showTime[4]=11;
disp_88(& showTime);
break;
}
}
//**************************************************加减处理
/*void changeTime(uchar nmod,uchar sty)
{
nmod=sty=0;
}*/
/**********************************************************************
*
* 名称: v_RTInputByte
* 说明:
* 功能: 往DS1302写入1Byte数据
* 调用:
* 输入: ucDa 写入的数据
* 返回值: 无
***********************************************************************/
void v_RTInputByte(uchar ucDa)
{
uchar i;
ACC = ucDa;
for(i=8; i>0; i--)
{
T_IO = ACC0; /*相当于汇编中的 RRC */
T_CLK = 1;
T_CLK = 0;
ACC = ACC >> 1;
}
}
/********************************************************************
*
* 名称: uchar uc_RTOutputByte
* 说明:
* 功能: 从DS1302读取1Byte数据
* 调用:
* 输入:
* 返回值: ACC
***********************************************************************/
uchar uc_RTOutputByte(void)
{
uchar i;
for(i=8; i>0; i--)
{
ACC = ACC >>1; /*相当于汇编中的 RRC */
ACC7=T_IO;
T_CLK = 1;
T_CLK = 0;
}
return(ACC);
}
/********************************************************************
*
* 名称: v_W1302
* 说明: 先写地址,后写命令/数据
* 功能: 往DS1302写入数据
* 调用: v_RTInputByte()
* 输入: ucAddr: DS1302地址, ucDa: 要写的数据
* 返回值: 无
***********************************************************************/
void v_W1302(uchar ucAddr, uchar ucDa)
{
T_RST = 0;
T_CLK = 0;
T_RST = 1;
v_RTInputByte(ucAddr); /* 地址,命令 */
v_RTInputByte(ucDa); /* 写1Byte数据*/
T_CLK = 1;
T_RST =0;
}
/********************************************************************
*
* 名称: uc_R1302
* 说明: 先写地址,后读命令/数据
* 功能: 读取DS1302某地址的数据
* 调用: v_RTInputByte() , uc_RTOutputByte()
* 输入: ucAddr: DS1302地址
* 返回值: ucDa :读取的数据
***********************************************************************/
uchar uc_R1302(uchar ucAddr)
{
uchar ucDa;
T_RST = 0;
T_CLK = 0;
T_RST = 1;
v_RTInputByte(ucAddr); /* 地址,命令 */
ucDa = uc_RTOutputByte(); /* 读1Byte数据 */
T_CLK = 1;
T_RST =0;
return(ucDa);
}
/********************************************************************
*
* 名称: v_Set1302
* 说明:
* 功能: 设置初始时间
* 调用: v_W1302()
* 输入: pSecDa: 初始时间地址。初始时间格式为: 秒 分 时 日 月 星期 年
* 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B
* 返回值: 无
***********************************************************************/
void v_Set1302(uchar *pSecDa)
{
uchar i;
uchar ucAddr = 0x80;
v_W1302(0x8e,0x00); /* 控制命令,WP=0,写操作?*/
for(i =7;i>0;i--)
{
v_W1302(ucAddr,*pSecDa); /* 秒 分 时 日 月 星期 年 */
pSecDa++;
ucAddr +=2;
}
v_W1302(0x8e,0x80); /* 控制命令,WP=1,写保护?*/
}
/********************************************************************
*
* 名称: v_Get1302
* 说明:
* 功能: 读取DS1302当前时间
* 调用: uc_R1302()
* 输入: ucCurtime: 保存当前时间地址。当前时间格式为: 秒 分 时 日 月 星期 年
* 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B
* 返回值: 无
***********************************************************************/
void v_Get1302(uchar ucCurtime[])
{
uchar i;
uchar ucAddr = 0x81;
for (i=0;i<7;i++)
{
ucCurtime[i] = uc_R1302(ucAddr);/*格式为: 秒 分 时 日 月
星期 年 */
ucAddr += 2;
}
}






