解释一下单片机的程序!!!!!自己实在是不理解
程序代码:
#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; } }