C语言课设课程设计万年历系统流程图
c语言编的万年历

万年历数字钟及可调时钟系统一、引言万年历数字钟是一种用万年历时钟芯片实现年、月、日、时、分、秒计时,并通过单片机处理后送给显示芯片显示的装置,与机械式时钟相比具有更高的准确性和直观性,且具有更长的使用寿命;本系统还可以扩展为可调的自动开关,对家电对用电设备进行控制,笔者在随后改制成为可调时的自动断电的供电系统.二、原理图设计1.单片机及其外围电路设计复位采用X25045芯片,复位电路如图1所示;图1 复位电路设计单片机采用贴片封装的AT89S51,晶振为;其中~为下载程序使用,电路如图2所示;图2 单片机89S51外围电路设计2.时钟芯片电路设计时钟芯片采用PCF8563,晶振采用,电容使用15pf;PCF8563 是PHILIPS 公司推出的一款工业级内含I2C 总线接口功能的具有极低功耗的多功能时钟/日历芯片;内部时钟电路、内部振荡电路、内部低电压检测电路以及两线制I2C 总线通讯方式,不但使外围电路及其简洁,而且也增加了芯片的可靠性;同时每次读写数据后,内嵌的字地址寄存器会自动产生增量;电路如图3所示;图3 时钟芯片电路设计3.显示芯片电路设计显示芯片采用ZLG7289,晶振为12MHz;ZLG7289A 是广州周立功单片机发展有限公司自行设计的,具有SPI 串行接口功能的可同时驱动8 位共阴式数码管或64 只独立LED 的智能显示驱动芯片,该芯片同时还可连接多达64 键的键盘矩阵,单片即可完成LED 显示﹑键盘接口的全部功能;电路如图4所示;图4 显示芯片电路设计4.双电源电路设计系统采用双电源,平时使用V1=10V的外接电源,停电时使用电池,由V2输入;电池有6节,其电压为9V;当电池电压低于6V时,LED亮,说明电池电量不足;电路如图5所示;图5 双电源电路设计三、程序设计程序开始时先对系统初始化,并设置好各种中断;下步操作主要是对时钟芯片进行操作,首先要给时钟芯片设置初值,时钟芯片便自行计数;此时检测是否有按键按下,按键是为了调整时钟;有按键按下则执行按键中断程序,没有按键按下则执行下一步的操作,即取时钟芯片中的时钟值,然后送显示;程序流程图如下;图6 总体流程图四、源程序include <>include <>include <>define uchar unsigned char /宏定义/define uint unsigned intuchar close_date,open_date;void RESWDIvoid;void WRENvoid;void WRDIvoid;void WRSRvoid;unsigned char RSDRvoid;void WIPCHKvoid;void OUTByteunsigned char Byte;unsigned char INPUTBytevoid;unsigned char ReadByteunsigned char ADD;void WriteByteunsigned char Byte,ADD;define _Nop _nop_ /定义空指令/sbit zlg7289_cs =P1^1;sbit zlg7289_clk =P2^6;sbit zlg7289_dio =P2^7;sbit zlg7289_key =P3^2;sbit p07=P0^7;sbit p06=P0^6;sbit CS=P2^4;sbit SCK=P2^2;sbit SO=P2^5;sbit SI=P2^3;sbit p10=P1^0;sbit SDA=P1^2; /模拟I2C数据传送位/sbit SCL=P1^3; /模拟I2C时钟控制位/uchar buf9={0x00,0x00,0x30,0x23,0x15,0x1,0x05,0x04,0x05}; uchar bufdata,bb,date;uchar SLA=0xA2,SUBA=0x00;uchar p; /接收指针/uchar keychange=0;uchar key=0; /键盘值/bit keyint=0; /按键中断标志/bit keyok=1; /数据是否修改好/uchar num=0; /移位键移到哪个LED//延时函数/void delayuchar i{whilei--;}// TIMER1 interrupt process //timer0 void interrupt 1 using 1{TH0=0x3c;TL0=0xb0;RESWDI;}void RESWDIvoid ////复位看门狗喂狗{zlg7289_cs=1;CS = 1;CS = 0;CS = 1;zlg7289_cs=1;}void WRENvoid //写使能复位使用{zlg7289_cs=1;SCK=0;CS=0;OUTByte0x06; //发送06H写使能命令字SCK=0;CS=1;zlg7289_cs=1;}void WRDIvoid //写使能复位禁止写{{zlg7289_cs=1;SCK=0;CS=0;OUTByte0x04; //发送04H写禁止命令字SCK=0; CS=1;zlg7289_cs=1;}void WRSRvoid //写状态寄存器{WREN;zlg7289_cs=1;SCK=0;CS=0;OUTByte0x01; //发送01H写寄存器命令字OUTByte0x00; //发送寄存器值BL0,BL1为0没写保护,WD0=0 W01=1 //WD1=0WD1=0看门狗复位时间SCK=0;CS=1;zlg7289_cs=1;WIPCHK; //判断是否写入}unsigned char RSDRvoid //读状态寄存器{unsigned char Temp;zlg7289_cs=1;SCK=0;CS=0;OUTByte0x05; //发送05H读状态寄存器命令字Temp = INPUTByte; //读状态寄存器值SCK=0;CS=1;return Temp;;//这一个调试时没有执行,Temp的值总是0xFF;zlg7289_cs=1;}void WIPCHKvoid //检查WIP位,判断是否写入完成{unsigned char Temp,TempCyc;forTempCyc=0;TempCyc<50;TempCyc++{Temp = RSDR; //读状态寄存器if Temp&0x01==0TempCyc = 50;}}//单字节指令或数据写入X25045//在SI线上输入的数据在SCK的上升沿被锁存;void OUTByteunsigned char Byte //输出一个定节{unsigned char TempCyc;zlg7289_cs=1;forTempCyc=0;TempCyc<8;TempCyc++{SCK = 0;ifByte&0x80SI = 1;elseSI = 0;SCK = 1;Byte = Byte<<1; //右移}SI=0; //使SI处于确定的状态zlg7289_cs=1;}//单字节数据从X25045读到单片机//数据由SCK的下降沿输出到SO线上;unsigned char INPUTBytevoid //输入一个字节{unsigned char Temp=0, TempCyc;zlg7289_cs=1;forTempCyc=0;TempCyc<8;TempCyc++{Temp = Temp<<1; //右移SCK = 1;SCK=0;if SOTemp = Temp|0x01; //SO为1,则最低位为1elseTemp&=0xFE;}return Temp;;//这一个调试时没有执行,Temp的值总是0zlg7289_cs=1;}unsigned char ReadByteunsigned char ADD //读地址中的数据这里不做先导字处理,只能读00-FFH{unsigned char Temp;zlg7289_cs=1;SCK=0;CS=0;SO=1;SI=1;OUTByte0x3; //发送读指令03H 如要支持000-FFF则要把高位地址左移3位再为03H相或OUTByteADD; //发送低位地址Temp = INPUTByte;SCK=0;CS=1;return Temp;//这一个调试时没有执行,Temp的zlg7289_cs=1;}void WriteByteunsigned char Byte,ADD //向地址写入数据这里同样不做先导字处理,只能写00-FFH{WREN;zlg7289_cs=1;SCK=0;CS=0;SO=1;SI=1;OUTByte0x2; //发送写指令02H 如要支持000-FFF则要把高位地址左移2位再为02H相或OUTByteADD; //发送低位地址OUTByteByte; //发送数据SCK=0;CS=1;zlg7289_cs=1;}/模拟I2C总线传输程序/bit ack; /应答标志位//起动总线函数/void Start_I2c{SDA=1; /发送起始条件的数据信号/_Nop;SCL=1;_Nop; /起始条件建立时间大于,延时/_Nop;_Nop;_Nop;_Nop;SDA=0; /发送起始信号/_Nop; / 起始条件锁定时间大于4μs/_Nop;_Nop;_Nop;_Nop;SCL=0; /钳住I2C总线,准备发送或接收数据 / _Nop;_Nop;}/结束总线函数/void Stop_I2c{SDA=0; /发送结束条件的数据信号/_Nop; /发送结束条件的时钟信号/SCL=1; /结束条件建立时间大于4μs/_Nop;_Nop;_Nop;_Nop;SDA=1; /发送I2C总线结束信号/_Nop;_Nop;_Nop;_Nop;}/字节数据传送函数/void SendByteuchar c{uchar BitCnt;forBitCnt=0;BitCnt<8;BitCnt++ /要传送的数据长度为8位/{ifc<<BitCnt&0x80SDA=1; /判断发送位/else SDA=0;_Nop;SCL=1; /置时钟线为高,通知被控器开始接收数据位/ _Nop;_Nop; /保证时钟高电平周期大于4μs/_Nop;_Nop;_Nop;SCL=0;}_Nop;_Nop;SDA=1; /8位发送完后释放数据线,准备接收应答位/_Nop;_Nop;SCL=1;_Nop;_Nop;_Nop;ifSDA==1ack=0;else ack=1; /判断是否接收到应答信号/_Nop;_Nop;}/字节数据接收函数/uchar RcvByte{uchar retc;uchar BitCnt;retc=0;SDA=1; /置数据线为输入方式/forBitCnt=0;BitCnt<8;BitCnt++{_Nop;SCL=0; /置时钟线为低,准备接收数据位/_Nop;_Nop; /时钟低电平周期大于/_Nop;_Nop;_Nop;SCL=1; /置时钟线为高使数据线上数据有效/_Nop;_Nop;retc=retc<<1;ifSDA==1retc=retc+1; /读数据位,接收的数据位放入retc中 / _Nop;_Nop;}SCL=0;_Nop;_Nop;returnretc;}/应答子函数/void Ack_I2cbit a{ifa==0SDA=0; /在此发出应答或非应答信号 /else SDA=1;_Nop;_Nop;_Nop;SCL=1;_Nop;_Nop; /时钟低电平周期大于4μs/_Nop;_Nop;_Nop;SCL=0; /清时钟线,钳住I2C总线以便继续接收/ _Nop;_Nop;}/向有子地址器件发送多字节数据函数/bit ISendStruchar sla,uchar suba,uchar s{uchar i;Start_I2c; /启动总线/SendBytesla; /发送器件地址/ifack==0return0;SendBytesuba; /发送器件子地址/ifack==0return0;fori=0;i<9;i++{SendBytes; /发送数据/ifack==0return0;s++;}Stop_I2c; /结束总线/return1;}/向有子地址器件读取多字节数据函数/bit IRcvStruchar sla,uchar suba,uchar suchar i;Start_I2c; /启动总线/SendBytesla; /发送器件地址/ifack==0return0;SendBytesuba; /发送器件子地址/ ifack==0return0;Start_I2c;SendBytesla+1;ifack==0return0;fori=0;i<8;i++{s=RcvByte; /发送数据/Ack_I2c0; /发送就答位/ s++;}s=RcvByte;Ack_I2c1; /发送非应位/ Stop_I2c; /结束总线/return1;}/模拟I2C程序结束//显示函数/void displayuint dis{uchar j;zlg7289_clk=0;delay20;zlg7289_cs=0;forj=0;j<16;j++{ifdis&0x8000==0x8000 zlg7289_dio=1;else zlg7289_dio=0;delay20;zlg7289_clk=1;delay10;zlg7289_clk=0;delay10;dis=dis<<1;}zlg7289_cs=1;delay20;}void dis_playuchar aa{uchar i;fori=0;i<8;i++{if_crol_aa,i&0x80zlg7289_dio = 1;elsezlg7289_dio = 0;zlg7289_clk = 1;delay10; /延时/zlg7289_clk = 0;}}void displaymonth{bufdata=buf5&0x0f;zlg7289_cs=0;delay10;dis_play0xc8;delay10;dis_playbufdata; /显示日个位/ zlg7289_cs=1;delay70;bufdata=buf5&0x30;bufdata=bufdata>>4;bufdata=bufdata&0x0f;zlg7289_cs=0;delay10;dis_play0xc9;delay10;dis_playbufdata; /显示日十位/ zlg7289_cs=1;delay70;bufdata=buf7&0x0f;zlg7289_cs=0;delay10;dis_play0xca;delay10;dis_playbufdata; /显示月个位/ zlg7289_cs=1;delay70;bufdata=buf7&0x10;bufdata=bufdata>>4;bufdata=bufdata&0x0f;zlg7289_cs=0;delay10;dis_play0xcf;delay10;dis_playbufdata; /显示月十位/ zlg7289_cs=1;delay70;}void displaytime{bufdata=buf3&0x0f;zlg7289_cs=0;delay10;dis_play0xce;delay10;dis_playbufdata; /显示分个位/ zlg7289_cs=1;delay70;bufdata=buf3&0x70;bufdata=bufdata>>4;bufdata=bufdata&0x0f;zlg7289_cs=0;delay10;dis_play0xcd;delay10;dis_playbufdata; /显示分十位/ zlg7289_cs=1;delay70;bufdata=buf4&0x0f;zlg7289_cs=0;delay10;dis_play0xcc;delay10;dis_playbufdata; /显示时个位/ zlg7289_cs=1;delay70;bufdata=buf4&0x30;bufdata=bufdata>>4;bufdata=bufdata&0x0f;zlg7289_cs=0;delay10;dis_play0xcb;delay10;dis_playbufdata; /显示时十位/ zlg7289_cs=1;delay70;}void display_x5045{date=ReadByte0x40;close_date=date;bufdata=date&0x0f;zlg7289_cs=0;delay10;dis_play0xce;delay10;dis_playbufdata; /显示分个位/ zlg7289_cs=1;delay70;bufdata=date&0x70;bufdata=bufdata>>4;bufdata=bufdata&0x0f;zlg7289_cs=0;delay10;dis_play0xcd;delay10;dis_playbufdata; /显示分十位/ zlg7289_cs=1;delay70;date=ReadByte0x42;bufdata=date&0x0f;zlg7289_cs=0;open_date=ReadByte0x42;delay10;dis_play0xcc;delay10;dis_playbufdata; /显示时个位/zlg7289_cs=1;delay70;bufdata=date&0x30;bufdata=bufdata>>4;bufdata=bufdata&0x0f;zlg7289_cs=0;delay10;dis_play0xcb;delay10;dis_playbufdata; /显示时十位/zlg7289_cs=1;delay70;}/按键处理程序///key=47: 闪烁移位键shift//key=39: +//key=39: -//key=31: 确认键okvoid key_int interrupt 0 /键盘中断程序/{keyint=1;}void keyexe{uchar i;uchar temp=0;uchar aa;p06=1;EX0=1;zlg7289_cs = 0;delay10;dis_play0x15; /写入读键盘数据指令/delay10;fori=0;i<8;i++{temp=temp<<1;aa=zlg7289_dio; // 按位或ifaa==1 // 读数据位,接收的数据位放入retc中temp=temp+1;zlg7289_clk=1;delay10; // 延时zlg7289_clk=0;}zlg7289_cs=1;key=temp;ifkey==47 //闪烁移位键{key=0;keyok=0;EX0=0;ifnum==8{num=1;}elsenum++;switchnum{ case 1: {display0x88fe;}break;case 2: {display0x88fd;}break;case 3: {display0x88fb;}break;case 4: {display0x88f7;}break;case 5: {display0x88ef;}break;case 6: {display0x88df;}break;case 7: {display0x88bf;}break;case 8: {display0x887f;}break;default: ;}EX0=1;}else ifkey==39 //+{EX0=0;key=0;RESWDI;ifnum=0{keyok=0;keychange=1;RESWDI;}ifnum==7 //在分个位上{ifbuf3&0x0f==0x09 buf3&=0xf0;else ++buf3;EX0=1;bufdata=buf3&0x0f;zlg7289_cs=0;delay10;dis_play0xce;delay10;dis_playbufdata; /显示分个位/zlg7289_cs=1;delay70;RESWDI;}else ifnum==6 //在分十位上{ifbuf3&0xf0==0x50 buf3&=0x0f;else buf3+=0x10;EX0=1;bufdata=buf3&0x70;bufdata=bufdata>>4;bufdata=bufdata&0x0f;zlg7289_cs=0;delay10;dis_play0xcd;delay10;dis_playbufdata; /显示分十位/zlg7289_cs=1;delay70;RESWDI;}else ifnum==5 //在小时个位上{ifbuf4&0xf0==0x20{ifbuf4&0x0f>0x02 buf4&=0xf0;else ++buf4;}else ifbuf4&0x0f==0x09 buf4&=0xf0;else ++buf4;EX0=1;bufdata=buf4&0x0f;zlg7289_cs=0;delay10;delay10;dis_playbufdata; /显示时个位/zlg7289_cs=1;delay70;RESWDI;}else ifnum==4 //在小时十位上{ifbuf4&0x0f>0x03{ifbuf4&0xf0>0x00 buf4&=0x0f;else buf4+=0x10;}else ifbuf4&0xf0==0x20 buf4&=0x0f;else buf4+=0x10;EX0=1;bufdata=buf4&0x30;bufdata=bufdata>>4;bufdata&=0x0f;zlg7289_cs=0;RESWDI;delay10;dis_play0xcb;delay10;dis_playbufdata; /显示时十位/zlg7289_cs=1;delay70;RESWDI;}else ifnum==1 //在日的个位上{ifbuf5&0xf0==0x30{ifbuf5&0x0f>0x00 buf5&=0xf0;else ++buf5;}else ifbuf5&0x0f==0x09 buf5&=0xf0;else ++buf5;EX0=1;bufdata=buf5&0x0f;RESWDI;zlg7289_cs=0;delay10;delay10;dis_playbufdata; /显示日个位/zlg7289_cs=1;delay70;RESWDI;}else ifnum==2 //在日的十位上{ifbuf5&0x0f>0x01{ifbuf5&0xf0>0x10 buf5&=0x0f;else buf5+=0x10;}else ifbuf5&0xf0==0x30 buf5&=0x0f;else buf5+=0x10;EX0=1;bufdata=buf5&0x30;RESWDI;bufdata=bufdata>>4;bufdata&=0x0f;zlg7289_cs=0;delay10;dis_play0xc9;delay10;dis_playbufdata; /显示日十位/zlg7289_cs=1;delay70;RESWDI;}else ifnum==4 //在月个位上{ifbuf7&0xf0==0x10{ifbuf7&0x0f>0x01 buf7&=0x0f;else ++buf7;}else ifbuf7&0x0f==0x09 buf7&=0xf0;else ++buf7;EX0=1;bufdata=buf7&0x0f;RESWDI;zlg7289_cs=0;delay10;dis_play0xca;delay10;dis_playbufdata; /显示月个位/zlg7289_cs=1;delay70;RESWDI;}else ifnum==8 //在月十位上{ifbuf7&0x0f>0x02{buf7&=0x0f;}else ifbuf7&0xf0==0x10 buf7&=0x0f;else buf7+=0x10;EX0=1;bufdata=buf7&0x10;bufdata=bufdata>>4;bufdata&=0x0f;RESWDI;zlg7289_cs=0;delay10;dis_play0xcf;delay10;dis_playbufdata; /显示月十位/zlg7289_cs=1;delay70;RESWDI;}else ;}else ifkey==15 //存放断电时间,数据存放于5045中,每按键数据减少一{display_x5045;EX0=1;key=0;ifnum=0{keyok=0;keychange=1;}ifnum==7 //在分个位上{date=ReadByte0x40;ifdate&0x0f==0x00 date|=0x09;else --date;EX0=1;bufdata=date&0x0f;zlg7289_cs=0;delay10;dis_play0xce;delay10;dis_playbufdata; /显示分个位/zlg7289_cs=1;delay70;WriteBytedate,0x40;}else ifnum==6 //在分十位上{date=ReadByte0x40;ifdate&0xf0==0x00 date|=0x50;else date-=0x10;EX0=1;bufdata=date&0x70;bufdata=bufdata>>4;bufdata&=0x0f;zlg7289_cs=0;delay10;dis_play0xcd;delay10;dis_playbufdata; /显示分十位/zlg7289_cs=1;delay70;WriteBytedate,0x40;}else ifnum==5 //在小时个位上{date=ReadByte0x42;ifdate&0xf0==0x20{ifdate&0x0f==0x00||date&0x0f>0x03 date|=0x03;else --date;}else ifdate&0x0f==0x00 date|=0x09;else --date;EX0=1;bufdata=date&0x0f;zlg7289_cs=0;delay10;dis_play0xcc;delay10;dis_playbufdata; /显示时个位/zlg7289_cs=1;delay70;WriteBytedate,0x42;}else ifnum==4 //在小时十位上{date=ReadByte0x42;ifdate&0x0f>0x03{ifdate&0xf0==0x00 date|=0x10;else date-=0x10;}else ifdate&0xf0==0x00 date|=0x20;else date-=0x10;EX0=1;bufdata=date&0x30;bufdata=bufdata>>4;bufdata&=0x0f;zlg7289_cs=0;delay10;dis_play0xcb;delay10;dis_playbufdata; /显示时十位/zlg7289_cs=1;delay70;WriteBytedate,0x42;}else ifnum==1 //在日的个位上{ifbuf5&0xf0==0x30{ifbuf5&0x0f==0x00||buf5&0x0f>0x01 buf5|=0x01;else --buf5;}else ifbuf5&0x0f==0x00 buf5|=0x09;else --buf5;bufdata=buf5&0x0f;zlg7289_cs=0;delay10;dis_play0xc8;delay10;dis_playbufdata; /显示日个位/zlg7289_cs=1;delay70;}else ifnum==2 //在日的十位上{ifbuf5&0x0f>0x01{ifbuf5&0xf0==0x00 buf5|=0x20;else buf5-=0x10;}else ifbuf5&0xf0==0x00 buf5|=0x30;else buf5-=0x10;bufdata=buf5&0x30;bufdata=bufdata>>4;bufdata&=0x0f;zlg7289_cs=0;delay10;dis_play0xc9;delay10;dis_playbufdata; /显示日十位/zlg7289_cs=1;delay70;}else ifnum==3 //在月个位上{ifbuf7&0xf0==0x10{ifbuf7&0x0f==0x00||buf7&0x0f>0x01 buf7|=0x01;else --buf7;}else ifbuf7&0x0f==0x00 buf7|=0x09;else --buf7;bufdata=buf7&0x0f;zlg7289_cs=0;delay10;dis_play0xca;delay10;dis_playbufdata; /显示月个位/zlg7289_cs=1;delay70;}else ifnum==8 //在月十位上{ifbuf7&0x0f>0x02 buf7&=0x0f;else ifbuf7&0xf0==0x00 buf7|=0x10;else buf7-=0x10;bufdata=buf7&0x10;bufdata=bufdata>>4;bufdata&=0x0f;zlg7289_cs=0;delay10;dis_play0xcf;delay10;dis_playbufdata; /显示月十位/zlg7289_cs=1;delay70;EX0=1;}else ;}else ifkey==31 //ok{EX0=0;key=0;keyok=1;num=0;ifkeychange==1{keychange=0;p=buf;SUBA=0x00;buf0=0x00;buf1=0x00;buf2=0x00;ISendStrSLA,SUBA,p;for i=0;i<250;i++delay250;}else ;zlg7289_cs=0;delay10;dis_play0x88;delay10;dis_play0xff; /清LED闪烁/zlg7289_cs=1;delay70;}EX0=1;}/主函数//void main{unsigned char i,j,word2;/程序的初始化/TMOD=0x09;TH0=0x3c;TL0=0xb0;TR0=1;ET0=1;IP=0x02; //中断优先级敲定IT0=1;EX0=1;IE0=1;EA=1; /打开全部中断/p10=1;p06=1;p07=1;WREN;WRSR;WRDI;WriteByte0x07,0x40;//在0x20中写入0x10, 为了验证WriteByte0x0a,0x42;WRDI;word2=ReadByte0x22;/初始化结束//清LED显示/zlg7289_cs=0;delay10;dis_play0xA4; //复位zlg7289_cs=1;delay70;/给时钟芯片附初值/Stop_I2c;EX0=0;p=buf;SUBA=0x00;buf0=0x00;buf1=0x00;forj=0;j<8;j++{fori=0;i<250;i++delay250;}ISendStrSLA,SUBA,p;delay100;EX0=1;while1{ifkeyint==1{EX0=1;ET0=1;keyexe;ifkeychange==0{keyint=0;ET0=1;}for i=0;i<250;i++delay250;EX0=1;}ifkeyok==1&&keychange==0&&keyint==0 {EX0=0;p=buf;SUBA=0x00;IRcvStrSLA,SUBA,p;for i=0;i<250;i++delay25;buf3&=0x7f;buf4&=0x3f;buf5&=0x3f;buf7&=0x1f;displaymonth;displaytime;EX0=1;}ifbuf4>=close_date||buf4<=open_date p10=0;for i=0;i<250;i++delay25;}}。
C语言课程设计万年历打印(20191225204701)

void thirdFun( int year , int month , int day ); // 第三功能
各程序流程图如下:
4
firstFun() 函数 开始
判断是否打印了 6
是
和 12 月份的日历
否 打印某月日历
结束
图 2.1 程序流程图(一)
secondFun() 函数 开始
判断是否月末的
打印某年某月
提示信息
日历模块
计算距今天数和 判断节日模块
图 1.2 功能模块图
3
2 详细设计
2.1 数据结构
建立日历信息结构体,结构体成员变量包括月末、月初星期几、屏幕信息左半边日历是 否打印完毕。
typedef struct calendar {
int month_end; int first_day;
1.1 需求分析 ............................................................................................................................2.... 1.2 功能流程图 .........................................................................................................................2... 1.3 功能模块图 .........................................................................................................................3... 2 详细设计 .......................................................................................................................................4.... 2.1 数据结构 ............................................................................................................................4.... 2.2 函数功能设计 .....................................................................................................................4... 3 调试分析 .......................................................................................................................................7.... 3.1 程序测试 ............................................................................................................................7.... 3.2 程序缺陷 ............................................................................................................................9... 4 总结与体会 .................................................................................................................................1..0.. 参考文献 ........................................................................................................................................1..1.. 附录 ................................................................................................................................................1..2..
C语言课程设计--万年历

C 语言课程设计报告设计题目:万年历学生姓名:学生学号:专业班级:数学与应用数学一班学院名称:数学与计量经济学院同组人姓名:指导老师:2011年6月15 日1 需求分析1.1问题描述我们需要实现万年历的功能,那么如何实现这个功能呢?我们都很清楚,普通年份和闰年是有区别的,那么该怎么区分这种一天的差别对于万年历日期现实的影响呢?而且已知一个日期,那么我们怎么能够知道它是星期几?是不是需要一个参照物来比较呢?而且还有很多关于万年历的美化问题,占位符的考虑等等。
另外我们还必须判断输入的万年历是否合法,这也需要一个子函数来实现。
好吧,至于基础的判断闰年也是不在话下了。
1.2输入数据要求我们要考虑三种情况,这三种情况下是不能够实现这个万年历的功能的:/*如果给定的日期中年份部分为非正数*/if(date.year<=0)printf("年份不符合要求!\n"printf("请重新输入)/*如果给定的日期中月份部分为负数,为0或者大于12*/if(date.month>12||date.month<1)printf("月份不符合要求!\n");printf("请重新输入");getchar();exit(0);/*如果给定的日期中天数部分为非正数,或者大于31*/a[2]=28+leap(date.year);if(date.day>a[date.month]||date.day<1)printf("日期不符合要求!\n");printf("请重新输入");getchar();exit(0);1.3输出数据要求根据输入数据,输出数据必须严格的按照占位符进行逻辑的策划,然后得知一行万年历的日期的占位符是38个占位符,于是空格占位符和字符显示出来的那些占位符就需要有一个限定使得其不凌乱特别应该注意空格符的占位。
C语言课程设计 万年历

计算机基础课程设计C语言设计报告题目:万年历学院:电气与电子工程学院专业:自动化班级:070304姓名:于洋指导教师:周丽娟设计日期:一、设计题目及来源万年历,来自网上搜索。
二、功能isLeap()判断输入数据是否是闰年;maxDay()判断某年某月最多天数;eachYearTotal ()判断这一天是该年的第几天;week判断某年某月某日的编号;output()输出该天星期几;display()显示月历;check()检查有效性;display1()输出年历;display2()输出月历;display3()输出日历;getMenu()调菜单;三、流程图#include<stdio.h>#include<stdlib.h>int isLeap(int year);int maxDay(int year,int month);int eachYearTotal(int year,int month,int day); int week(int year,int month,int day);char *chineseWeek(int number);void output(int year,int month,int day);void display(int year,int month);int check(int year,int month,int day);void display1(int year);void display2(int year,int month);void display3(int year,int month,int day); void getMenu();void main(){int year,month,day,flag,select;while(1){getMenu();printf("shu ru xuan ze: ");fflush(stdin);scanf("%d",&select);fflush(stdin);switch(select){case 1:do{printf("shu ru nian: ");scanf("%d",&year);flag=check(year,1,1);if(flag==0){printf("shu ru wu xiao\n");}}while(flag==0);display1(year);break;case 2:do{printf("shu ru nian yue: ");scanf("%d%d",&year,&month);flag=check(year,month,1);if(flag==0){printf("shu ru wu xiao\n");}}while(flag==0);display2(year,month);break;case 3:do{printf("shu ru nian yue ri: ");scanf("%d%d%d",&year,&month,&day);flag=check(year,month,day);if(flag==0){printf("shu ru wu xiao\n");}}while(flag==0);display3(year,month,day);break;case 4:exit(0);default:printf("shu ru you wu!\n\n");}}}int isLeap(int year){if(year%4==0&&year%100!=0||year%400==0) return 1;elsereturn 0;}int maxDay(int year,int month){int a[]={31,28,31,30,31,30,31,31,30,31,30,31};if(isLeap(year))a[1]=29;return a[month-1];}int eachYearTotal(int year,int month,int day){int i,sum=0;for(i=1;i<month;i++){sum+=maxDay(year,i);}sum+=day;return sum;}int week(int year,int month,int day){intnumber=(year-1)+(year-1)/4-(year-1)/100+(year-1)/400+eachYearTotal(year,month,d ay);number%=7;return number;}char *chineseWeek(int number){switch(number){case 0:return "Sunday";case 1:return "Monday";case 2:return "Tuesday";case 3:return "Wednesday";case 4:return "Thursday";case 5:return "Friday";case 6:return "Saturday";default:return "error";}}void output(int year,int month,int day){int number=week(year,month,day);printf(" gong yuan%d nian%d ue%d ri%10s\n\n",year,month,day,chineseWeek(number)); }void display(int year,int month){int max,number,i,j=1;max=maxDay(year,month);number=week(year,month,1);printf("%4s%4s%4s%4s%4s%4s%4s\n"," Sunday "," Monday "," Tuesday "," Wednesday "," Thursday "," Friday "," Saturday ");for(i=0;i<number;i++){printf(" ");}while(j<=max){printf("%4d",j);if(i%7==6){printf("\n");}i++;j++;}printf("\n\n");}int check(int year,int month,int day){if(year<0||month<1||month>12||day<1||day>maxDay(year,month))return 0;elsereturn 1;}void display1(int year){int i;printf("\n");for(i=1;i<=12;i++){printf(" gongyuan%d nian%d yue\n\n",year,i); display(year,i);}}void display2(int year,int month){printf("\n gongyuan%d nian%d yue\n\n",year,month); display(year,month);}void display3(int year,int month,int day){printf("\n");output(year,month,day);display(year,month);}void getMenu(){printf("1.nianli\t2.yueli\t3.rili\t4.tuiqu\n");}。
C语言课程设计万年历 完整版

目录一引言 (2)二系统功能和数据说明 (3)一)功能简介 (3)二)程序中的数据说明 (3)三程序总体设计及流程图 (4)一)应用到的c语言 (4)二)程序的总框架 (5)四功能模块设计及调试 (5)一)算法说明 (5)1.总天数的算法 (5)2.计算输入日期是星期几 (6)3.对输入信息的汇总 (8)4..界面的控制 (10)二)调试结果 (11)五程序清单 (12)六结束语 (17)一引言通过大一上学期对C语言的学习,了解到了很多C语言的相关知识。
学习的过程有很多困惑但是当自己能够独立的看懂,能过独立的完成一个简单的程序时,心中就会收获无限的喜悦和成就感。
我可以里哟哦那个它看懂一些简单的程序,编写一些简单的计算程序,更多的是学会了一种思想——编程,它让我在去思考很多日常生活中的事物是怎么样通过一个个小小的函数实现功能的,激发我对探究的兴趣。
C语言是近年在国内外得到迅速推广应用的一种语言。
C语言功能丰富,表达能力强,使用灵活方便,应用面广,目标程序效率高,可移植性好,既具有高级语言的优点,又具有低级语言的许多特点。
因此,C语言特别适合于编写各种软件。
在这次的课程设计中我将把日常生活中最经常接触的——日期的查询利用C语言的程序编成一个简单的日历。
通过这个小小的日历可以实现很多功能。
在程序中你能看到很多熟悉的C语言关键字,同时也加入了很多自己课外了解到的一些关键字。
在不断的调试中最终才获得最为完整的程序。
接下来就是我的C 语言课程设计的具体内容来了二系统功能和数据说明(一)功能简介在我们的日常生活中能接触到很多不同类型的日历,在日历上我们通常希望它能简介明了的给我们最想要的日期信息。
在我的万年历当中,就是将日历,月历做的简单明了,很方便我们的使用。
下面是它要实现的一些基本功能:用C语言编写万年历1、输入年份,判断是否为闰年2、输入年月日,判断改日为星期几3、输入年份,打出12个月历,输入月份,打出该月的日历4、要求用多个函数实现[名称]万年历[修改]1、对输入的日期进行容错处理2、增加和修改为英文的月份和星期显示3、采用指针形式的weeks和month数组(二)程序中的数据说明①int days[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};这是定义的关于每个月天数的数组,根据大小月以及二月分的特殊情况将每个月的天数最为数组中的元素存入数组当中。
c万年历课程设计

c万年历课程设计一、课程目标知识目标:1. 学生能理解万年历的基本概念,掌握年、月、日的关系及其换算方法。
2. 学生能运用所学的数学知识,编写简单的万年历程序,计算任意日期是星期几。
3. 学生了解历法的起源和发展,理解我国农历与公历的区别和联系。
技能目标:1. 学生通过编写万年历程序,提高编程能力和逻辑思维能力。
2. 学生能够运用万年历知识解决实际问题,如计算节日日期、安排活动等。
3. 学生学会查阅相关资料,培养自主学习能力和合作精神。
情感态度价值观目标:1. 学生对万年历产生兴趣,激发学习数学和编程的热情。
2. 学生通过了解历法的发展,增强对传统文化的认识,培养民族自豪感。
3. 学生在合作学习中,学会尊重他人,培养团队协作意识。
本课程旨在结合学生年级特点,以提高学生的数学应用能力和编程技能为核心,通过万年历的学习,使学生在掌握知识的同时,培养良好的学习态度和价值观。
课程目标具体、可衡量,为教学设计和评估提供明确方向。
二、教学内容1. 万年历的基本概念:年、月、日的关系,闰年的判断方法,星期计算。
2. 编写万年历程序:流程图设计,算法实现,调试与优化。
3. 历法的起源与发展:古代历法,农历与公历的转换,二十四节气。
4. 实践应用:计算特定日期的星期,安排节日活动,了解历史上的今天。
教学大纲:第一课时:万年历的基本概念,闰年的判断方法,星期计算。
第二课时:编写万年历程序,学习流程图设计,实现基本算法。
第三课时:历法的起源与发展,了解农历与公历的转换,学习二十四节气。
第四课时:实践应用,解决实际问题,如计算节日日期,了解历史上的今天。
教学内容依据课程目标,结合课本章节,保证科学性和系统性。
通过以上安排,使学生掌握万年历相关知识,提高编程技能,并培养对传统文化的认识。
三、教学方法本课程采用以下多样化的教学方法,旨在激发学生的学习兴趣,提高主动性和参与度:1. 讲授法:教师通过生动的语言和形象的比喻,讲解万年历的基本概念、历法的发展和算法原理,为学生奠定坚实的理论基础。
用c语言编写万年历程序

序言我们经过了一个学期的c语言课程的学习,对计算机变成所需的c语言有了大体的了解,能够看懂和编写一些简单的c语言程序,为了更好的加深同学们对c语言的认识,提升同学们的c语言时间编程能力,所以进行了c语言的课程设计。
本程序是一个万年历程序,可以在程序中任意的输入公元年份,通过程序的将该年份的各种信息形象直观的显示出来,达到c语言程序编写所体现的方便快捷的功效。
同时,通过对该程序c语言的编写,能够在训炼我们在课本中学到各种知识点,并将其应用其中。
设计题目:1设计编写一个C程序—“万年历”。
2输入任一年将显示出该年的所有月份日期,对应的星期。
3 下一行显示星期,从周日到周六,中英文都可以。
4 下一行开始显示日期从1号开始,并按其是周几实际情况与上面的星期数垂直对齐。
5 月份:中文英文都可以,注意闰年情况。
问题定义(或系统分析):1 要输入任一年显示出该年的所有月份日期,应该先设计具体的输出格式,如下:the calendar of the year2008.JanuarySun Mon Tue Wed Thu Fri Sat1 2 3 4 56 7 8 9 10 11 1213 14 15 16 17 18 1920 21 22 23 24 25 2627 28 29 30 31FebruarySun Mon Tue Wed Thu Fri Sat1 23 4 5 6 7 8 910 11 12 13 14 15 1617 18 19 20 21 22 2324 25 26 27 28 29=============================================…………2 判断是不是闰年(year%4!=0||year%100==0&&year%400!=0)满足条件就是平年,把一年中的所有月份分为四类(28,29,30,31)。
3 求出一年中的第一天是周几(year +(year-1)/4-(year-1)/100+(year-1)/400)%7。
课程设计用C语言设计一个年历系统

{
if( year % 4 != 0 || year % 100 == 0 && year % 400 != 0 ) //判断闰
年,真为平年
return( 2 );
else return( 3 );
}
else return( 4 );
}
void calendar()
{
int year, i, j, a, n, m, k, line; //定义变量
{
memset( tempOut, 0, sizeof( tempOut ) );//memset 函数的作用是在
一段内存块中填充某个给定的值,它是对数组进行清零操作
printf( "%-33s%s\n", month[i], month[i + 1] ); //输出月份名,-33
是先左对齐再留 33 个空格
for( m = 1; m < 32; m++ )//每月天数循环 {
sprintf( temp, "%4d", m ); //输出格式占 4 列,右端对齐 strcat( tempOut[ i % 2 ][ line ], temp );//运用 strcat 函数 把 temp 数组拷贝到 tempout 所指的末尾,且 tempout 有足够的空间存放 temp 的内容 if( ( a + m ) % 7 == 0 ) line ++; if( n == 1 && m == 31 ) break; //从此处至以下执行整月停止 else if( n == 2 && m == 28 ) break; else if( n == 3 && m == 29 ) break; else if( n == 4 && m == 30 ) break; } a = ( a + m ) % 7; // a 为每月末行天数