万年历程序流程图复习过程

合集下载

自己制作的单片机万年历程序+原理图

自己制作的单片机万年历程序+原理图

自己制作的单片机万年历程序+原理图单片机万年历仿真原理图如下仿真Altium Designer画的万年历原理图和PCB图如下:PCB原理图基于51单片机,可以完成时钟显示、公历显示、农历显示、温度显示、闹钟报警定时的LCD时钟PPT内容预览:本设计使用AT89C51来做主控芯片,其强大的功能足够实现我们设计的所有功能。

使用LCD1602的液晶显示器来进行显示。

使用Keil uVision5进行编程。

通过Proteus8.6来进行仿真。

点击一次K1进入时钟设置页面,通过点击K2切换时、秒、分、星期、年、月、日,通过K3与K4实现加减来完成时钟的设置点击两次K1进入闹钟设置页面,通过点击K2切换开关、时、秒、分,通过K3与K4实现加减完成闹钟的设置。

单片机源程序如下注释是很全的#include //调用单片机头文件#define uchar unsigned char //无符号字符型宏定义变量范围0~255#define uint unsigned int //无符号整型宏定义变量范围0~65535#include "eeprom52.h"#include "nongli.h"#include "intrins.h"bit flag_200ms ;bit flag_100ms ;sbit beep = P3^7; //蜂鸣器定义bit flag_beep_en;uint clock_value; //用作闹钟用的sbit dq = P3^1; //18b20 IO口的定义uint temperature ; //温度变量uchar flag_nl; //农历阳历显示标志位uchar menu_1,menu_2;uchar key_time,flag_value; //用做连加的中间变量bit key_500ms ;uchar n_nian,n_yue,n_ri; //农历显示的函数#include "ds1302.h"#include "lcd1602.h"/******************把数据保存到单片机内部eeprom中******************/void write_eeprom(){SectorErase(0x2000);byte_write(0x2000, fen1);byte_write(0x2001, shi1);byte_write(0x2002, open1);byte_write(0x2058, a_a);}/******************把数据从单片机内部eeprom中读出来*****************/void read_eeprom(){fen1 = byte_read(0x2000);shi1 = byte_read(0x2001);open1 = byte_read(0x2002);a_a = byte_read(0x2058);}/**************开机自检eeprom初始化*****************/void init_eeprom(){read_eeprom(); //先读if(a_a != 1) //新的单片机初始单片机内问eeprom{fen1 = 3;shi1 = 8;a_a = 1;write_eeprom(); //保存数据}}/***********************18b20初始化函数*****************************/void init_18b20(){bit q;dq = 1; //把总线拿高delay_uint(1); //15usdq = 0; //给复位脉冲delay_uint(80); //750usdq = 1; //把总线拿高等待delay_uint(10); //110usq = dq; //读取18b20初始化信号delay_uint(20); //200usdq = 1; //把总线拿高释放总线}/*************写18b20内的数据***************/void write_18b20(uchar dat){uchar i;for(i=0;i<8;i++){ //写数据是低位开始dq = 0; //把总线拿低写时间隙开始dq = dat & 0x01; //向18b20总线写数据了delay_uint(5); // 60usdq = 1; //释放总线}}/*************读取18b20内的数据***************/uchar read_18b20(){uchar i,value;for(i=0;i<8;i++){dq = 0; //把总线拿低读时间隙开始value >>= 1; //读数据是低位开始dq = 1; //释放总线if(dq == 1) //开始读写数据value |= 0x80;delay_uint(5); //60us 读一个时间隙最少要保持60us 的时间}return value; //返回数据}/*************读取温度的值读出来的是小数***************/uint read_temp(){uint value;uchar low; //在读取温度的时候如果中断的太频繁了,就应该把中断给关了,否则会影响到18b20的时序init_18b20(); //初始化18b20write_18b20(0xcc); //跳过64位ROMwrite_18b20(0x44); //启动一次温度转换命令delay_uint(50); //500usinit_18b20(); //初始化18b20write_18b20(0xcc); //跳过64位ROMwrite_18b20(0xbe); //发出读取暂存器命令EA = 0;low = read_18b20(); //读温度低字节value = read_18b20(); //读温度高字节EA = 1;value <<= 8; //把温度的高位左移8位value |= low; //把读出的温度低位放到value的低八位中value *= 0.625; //转换到温度值小数return value; //返回读出的温度带小数}/******************1ms 延时函数*******************/void delay_1ms(uint q){uint i,j;for(i=0;i<>< p=""><>for(j=0;j<120;j++);}/******************写星期函数*******************/void write_week(uchar hang,uchar add,uchar week)//写星期函数{if(hang==1)write_com(0x80+add);elsewrite_com(0x80+0x40+add);。

万年历程序+电路图

万年历程序+电路图

基于单片机的万年历系统设计(一)顶层文件万年历.C#include<reg51.h>#include "LCD1602.h"#include "DS1302.h"#define uchar unsigned char#define uint unsigned intsbit speaker=P2^4;bit key_flag1=0,key_flag2=0;SYSTEMTIME adjusted;uchar sec_add=0,min_add=0,hou_add=0,day_add=0,mon_add=0,yea_add=0;uchar data_alarm[7]={0};/************键盘控制******************************/int key_scan() //扫描是否有键按下{ int i=0;uint temp;P1=0xf0;temp=P1;if(temp!=0xf0)i=1;elsei=0;return i;}uchar key_value() //确定按键的值{uint m=0,n=0,temp;uchar value;uchar v[4][3]={'2','1','0','5','4','3','8','7','6','b','a','9'} ;P1=0xfe; temp=P1; if(temp!=0xfe)m=0;P1=0xfd;temp=P1 ;if(temp!=0xfd)m=1;P1=0xfb;temp=P1 ;if(temp!=0xfb)m=2;P1=0xf7;temp=P1 ;if(temp!=0xf7)m=3;P1=0xef;temp=P1 ;if(temp!=0xef)n=0;P1=0xdf;temp=P1 ;if(temp!=0xdf)n=1;P1=0xbf;temp=P1 ;if(temp!=0xbf)n=2;value=v[m][n];return value;}/***************************设置闹铃函数*******************************/void naoling(void){uchar i=0,l=0,j;init1602();while(key_flag2&&i<12)if(key_scan()){j=key_value();write_data(j);if(i%2==0)data_alarm[l]=(j-'0')*10;else {data_alarm[l]+=(j-'0');l++;}i++;delay(600);}write_com(0x01);}uchar according(void){ uchar k;if(data_alarm[0]==adjusted.Year&&data_alarm[1]==adjusted.Month&&data_alarm[2]==adj usted.Day&&data_alarm[3]==adjusted.Hour&&data_alarm[4]==adjusted.Minute&&data_al arm[5]==adjusted.Second)k=1;else k=0;return k;}void speak(void){uint i=50;while(i){speaker=0;delay(1);speaker=1;delay(1);i--;}}void alarm(void){uint i=10;while(i){speak();delay(10);i--;}}/**************************修改时间操作********************************/ void reset(void){sec_add=0;min_add=0;hou_add=0;day_add=0;mon_add=0;yea_add=0 ;}void adjust(void){if(key_scan()&&key_flag1)switch(key_value()){case '0':sec_add++;break;case '1':min_add++;break;case '2':hou_add++;break;case '3':day_add++;break;case '4':mon_add++;break;case '5':yea_add++;break;case 'b':reset();break;default: break;}adjusted.Second+=sec_add;adjusted.Minute+=min_add;adjusted.Hour+=hou_add;adjusted.Day+=day_add;adjusted.Month+=mon_add;adjusted.Year+=yea_add;if(adjusted.Second>59) adjusted.Second=adjusted.Second%60;if(adjusted.Minute>59) adjusted.Minute=adjusted.Minute%60;if(adjusted.Hour>23) adjusted.Hour=adjusted.Hour%24;if(adjusted.Day>31) adjusted.Day=adjusted.Day%31;if(adjusted.Month>12) adjusted.Month=adjusted.Month%12;if(adjusted.Year>100) adjusted.Year=adjusted.Year%100;}/**************************中断处理函数*********************************/ void changing(void) interrupt 0 using 0 //需要修改时间和日期,或者停止修改{if(key_flag1)key_flag1=0;else key_flag1=1;}void alarming(void) interrupt 3 using 0 //需要设置闹铃或者停止设置{if(key_flag2)key_flag2=0;else key_flag2=1;}/********************************主函数***********************************/ main(){uint i;uchar *l;uchar p1[]="D:",p2[]="T:";SYSTEMTIME T;EA=1;EX0=1;IT0=1;EA=1;EX1=1;IT1=1;init1602();Initial_DS1302() ;while(1){ write_com(0x80);write_string(p1,2);write_com(0xc0);write_string(p2,2);DS1302_GetTime(&T) ;adjusted.Second=T.Second;adjusted.Minute=T.Minute;adjusted.Hour=T.Hour;adjusted.Week=T.Week;adjusted.Day=T.Day;adjusted.Month=T.Month;adjusted.Year=T.Year;for(i=0;i<9;i++){adjusted.DateString[i]=T.DateString[i];adjusted.TimeString[i]=T.TimeString[i];}adjust();if(key_flag2)naoling();if(according())alarm();DateToStr(&adjusted);TimeToStr(&adjusted);write_com(0x82);write_string(adjusted.DateString,8);write_com(0xc2);write_string(adjusted.TimeString,8);delay(10);}(二)头文件1 显示模块LCD1602.H#ifndef LCD_CHAR_1602_2009_5_9#define LCD_CHAR_1602_2009_5_9#define uchar unsigned char#define uint unsigned intsbit lcdrs = P2^0;sbit lcdrw = P2^1;sbit lcden = P2^2;void delay(uint z) // 延时{uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void write_com(uchar com) // 写入指令数据到lcd {lcdrw=0;lcdrs=0;P0=com;delay(5);lcden=1;delay(5);lcden=0;}void write_data(uchar date) // 写入字符显示数据到lcd {lcdrw=0;lcdrs=1;P0=date;delay(5);lcden=1;delay(5);lcden=0;}void init1602() // 初始化设定{lcdrw=0;lcden=0;write_com(0x3C);write_com(0x0c);write_com(0x06);write_com(0x01);write_com(0x80);}void write_string(uchar *pp,uint n){int i;for(i=0;i<n;i++)write_data(pp[i]);}#endif(三)头文件2 时钟模块DS1302.H#ifndef _REAL_TIMER_DS1302_2009_5_20_#define _REAL_TIMER_DS1302_2003_5_20_sbit DS1302_CLK = P2^6; //实时时钟时钟线引脚sbit DS1302_IO = P2^7; //实时时钟数据线引脚sbit DS1302_RST = P2^5; //实时时钟复位线引脚sbit ACC0 = ACC^0;sbit ACC7 = ACC^7;typedef struct SYSTEM_TIME{unsigned char Second;unsigned char Minute;unsigned char Hour;unsigned char Week;unsigned char Day;unsigned char Month;unsigned char Year;unsigned char DateString[9]; //用这两个字符串来放置读取的时间unsigned char TimeString[9];}SYSTEMTIME; //定义的时间类型#define AM(X) X#define PM(X) (X+12) // 转成24小时制#define DS1302_SECOND 0x80#define DS1302_MINUTE 0x82#define DS1302_HOUR 0x84#define DS1302_WEEK 0x8A#define DS1302_DAY 0x86#define DS1302_MONTH 0x88#define DS1302_YEAR 0x8C#define DS1302_RAM(X) (0xC0+(X)*2) //用于计算DS1302_RAM 地址的宏/******内部指令**********/void DS1302InputByte(unsigned char d) //实时时钟写入一字节(内部函数){unsigned char i;ACC = d;for(i=8; i>0; i--){DS1302_IO = ACC0;DS1302_CLK = 1;DS1302_CLK = 0;ACC = ACC >> 1; //因为在前面已经定义了ACC0 = ACC^0;以便再次利用DS1302_IO = ACC0;}}unsigned char DS1302OutputByte(void) //实时时钟读取一字节(内部函数){unsigned char i;for(i=8; i>0; i--){ACC = ACC >>1;ACC7 = DS1302_IO;DS1302_CLK = 1;DS1302_CLK = 0;}return(ACC);}/********************************/void Write1302(unsigned char ucAddr, unsigned char ucDa) //ucAddr: DS1302地址, ucData: 要写的数据{DS1302_RST = 0;DS1302_CLK = 0;DS1302_RST = 1;DS1302InputByte(ucAddr); // 地址,命令DS1302InputByte(ucDa); // 写1Byte数据DS1302_CLK = 1;DS1302_RST = 0;}unsigned char Read1302(unsigned char ucAddr) //读取DS1302某地址的数据{unsigned char ucData;DS1302_RST = 0;DS1302_CLK = 0;DS1302_RST = 1;DS1302InputByte(ucAddr|0x01); // 地址,命令ucData = DS1302OutputByte(); // 读1Byte数据DS1302_CLK = 1;DS1302_RST = 0;return(ucData);}void DS1302_SetProtect(bit flag) //是否写保护{if(flag)Write1302(0x8E,0x10);elseWrite1302(0x8E,0x00);}void DS1302_SetTime(unsigned char Address, unsigned char Value) // 设置时间函数{DS1302_SetProtect(0);Write1302(Address, ((Value/10)<<4 | (Value%10))); //将十进制数转换为BCD码} //在DS1302中的与日历、时钟相关的寄存器存放的数据必须为BCD码形式void DS1302_GetTime(SYSTEMTIME *Time){unsigned char ReadValue;ReadValue = Read1302(DS1302_SECOND);Time->Second = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); //将BCD码转换为十进制数ReadValue = Read1302(DS1302_MINUTE);Time->Minute = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_HOUR);Time->Hour = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_DAY);Time->Day = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_WEEK);Time->Week = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_MONTH);Time->Month = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_YEAR);Time->Year = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); }unsigned char *DataToBCD(SYSTEMTIME *Time){unsigned char D[8];D[0]=Time->Second/10<<4+Time->Second%10;D[1]=Time->Minute/10<<4+Time->Minute%10;D[2]=Time->Hour/10<<4+Time->Hour%10;D[3]=Time->Day/10<<4+Time->Day%10;D[4]=Time->Month/10<<4+Time->Month%10;D[5]=Time->Week/10<<4+Time->Week%10;D[6]=Time->Year/10<<4+Time->Year%10;return D;}void DateToStr(SYSTEMTIME *Time){//将十进制数转换为液晶显示的ASCII值Time->DateString[0] = Time->Year/10 + '0';Time->DateString[1] = Time->Year%10 + '0';Time->DateString[2] = '-';Time->DateString[3] = Time->Month/10 + '0';Time->DateString[4] = Time->Month%10 + '0';Time->DateString[5] = '-';Time->DateString[6] = Time->Day/10 + '0';Time->DateString[7] = Time->Day%10 + '0';Time->DateString[8] = '\0';}void TimeToStr(SYSTEMTIME *Time){//将十进制数转换为液晶显示的ASCII值Time->TimeString[0] = Time->Hour/10 + '0';Time->TimeString[1] = Time->Hour%10 + '0';Time->TimeString[2] = ':';Time->TimeString[3] = Time->Minute/10 + '0';Time->TimeString[4] = Time->Minute%10 + '0';Time->TimeString[5] = ':';Time->TimeString[6] = Time->Second/10 + '0';Time->TimeString[7] = Time->Second%10 + '0';Time->DateString[8] = '\0';}void Initial_DS1302(void){unsigned char Second;Second=Read1302(DS1302_SECOND);if(Second&0x80) //初始化时间DS1302_SetTime(DS1302_SECOND,0);}void DS1302_TimeStop(bit flag) // 是否将时钟停止{unsigned char Data;Data=Read1302(DS1302_SECOND);DS1302_SetProtect(0);if(flag)Write1302(DS1302_SECOND, Data|0x80);elseWrite1302(DS1302_SECOND, Data&0x7F);}#endif附录2 系统电路图10。

C语言课程设计万年历 完整版

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};这是定义的关于每个月天数的数组,根据大小月以及二月分的特殊情况将每个月的天数最为数组中的元素存入数组当中。

万年历的课程设计报告及程序

万年历的课程设计报告及程序

第一部分:正文一,课程设计名称:1.万年历2.(a) (b)* **** *** ***** ***** ************** ***** ***** *** **** * ********* **** **** *** *** ** ** * * ** ** *** *** **** **** *********二,使用工具软件:Microsoft Visual Basic 6.0 中文版。

三,课程设计内容简介:(1)万年历的课程设计的基本结构流程:从main函数开始,比如输入2001年,调用函数yearshow,它是控制总循环次数12个月的,在yearshow里有调用了以个函数是monthshow,是控制每个月如何输出显示的,在这个函数里有调用了getmonthweekday函数,它是获得每个月一号是星期几的函数,此函数分为两部分,以2000年1月1号是星期六为准;做十一次运算便可得知2月到12月各个月的1号为星期几。

而在这个函数又调用了getyearday这个函数,是返回天数的函数,它有调用了isleap函数,计算时平年还是闰年是,时闰年返回366,平年返回355。

到这步开始就返回值了,首先isleap告诉getyeardays2000是闰年和平年,于是getyeardays得到366getyearweekday,getyearweekday 就计算sum=366且返回(366+6)%7=2给getmonthweekday,w=2,getmonthweekday中若计算1月1号则为星期二,2月-12月中如3月则要加上以月和二月的天数载加上2对7取余数,这个数返回给monthshow,若这个数是w=0;不输出空格,不等于0就输出w-1个空格,以便日期和星期对应,如此循环十二个月就计算完了,一边计算一遍显示。

(2)(a)图形的课程设计的基本结构流程(3)(b)图形的课程设计的基本结构流程(4)运行环境:Win32 Console Application四,得意之处.1把程序分解成多个小函数,那么问题就分解成几个小问题。

java程序设计报告2万年历

java程序设计报告2万年历

程序设计报告JA V A设计报告2:万年历姓名:王颖学号:001学习中心:延安富县学习中心专业:计算机科学与技术层次:专升本身份证号:联系电话:万年历程序设计一、设计分析万年历有很多作用,顾名思义它是一种很方便得计时计年工具,随着科技得发展,我们已经可以通过计算机制作出精美的万年历,通过计算机制作得万年历不但外观美观,而且功能强大。

通过万年历,我们可以实现很多功能,随意看某年得年份,某年得月份,随意调整某年得某天,并将其显示出来,而且有判断闰年闰月得功能,十分方便。

二、程序流程框图主程序流程图三、具体设计1、变量设计2、程序源代码import java.awt.*;import java.awt.event.*;import javax.swing.*;import javax.swing.event.*;import javax.swing.border.*;import java.util.Calendar;import java.util.*;import java.io.*;import java.io.IOException;public class calendar extends JFrame implements ActionListener,MouseListener {int year,month,day;int yearafterquery,monthafterquery;int startday;String SwitchMonth;String key;int changeyearmessage;int changemonthmessage;int priormonth;int prioryear;boolean ischange=false;boolean ischange_priornext=false; private JPanel LeftPane,RightPane;//Left subprivate JLabel YearLabel;private JComboBox MonthCombobox;private JTextField ShowDays[]= new JTextField[42];private JTextField YearText;private JLabel Ask;private JLabel ShowDate;private JLabel Blank;private JLabel TopBarTitle[]=new JLabel[7];private JButton ToToday;private JButton Query;privateString week[]={"SUN","MON","TUE","WED","THU","FRI","SAT"};//right subprivate JLabel NorthMonthDayYear;private JTextArea CenterText;private JButton SouthSave,SouthDelete;private JButton PriorMonth;private JButton NextMonth;public calendar(int year,int month,int day){setTitle("My Calendar&Textbook");//the layout about left of jpaneLeftPane = new JPanel();JPanel LeftCenter = new JPanel();JPanel LeftNorth = new JPanel();//JPanel LeftSouth = new JPanel();LeftPane.setLayout(new BorderLayout());LeftPane.add(LeftNorth,BorderLayout.NORTH);LeftPane.add(LeftCenter,BorderLayout.CENTER);LeftPane.add(ToToday = new JButton("Go to today",new ImageIcon("../images/Handle.gif")),BorderLayout.SOUTH);ToToday.setBackground(Color.cyan);ToToday.addActionListener(this);LeftPane.validate();//the layout of LeftPane//LeftPane_NorthLeftNorth.setLayout(new GridLayout(3,1,0,-2));LeftNorth.add(Ask = new JLabel(" Plese input the informations which you want query:"));JPanel North = new JPanel(new FlowLayout(0,8,0));LeftNorth.add(North);North.add(YearLabel=new JLabel("Year:"));North.add(YearText = new JTextField(4));YearText.setBackground(Color.getHSBColor(30,20,50));YearText.setForeground(Color.blue);YearText.setFont(new Font("TimesRoman",Font.BOLD,17));YearText.setFocusable(true);North.add(Blank=new JLabel(" "));North.add(MonthLabel = new JLabel("Month:"));North.add(MonthCombobox = new JComboBox());//add month to monthcomboboxfor(int i=1;i<=12;i++){MonthCombobox.addItem(new Integer(i));}//Switch the monthMonthCombobox.setForeground(Color.blue);MonthCombobox.setFont(new Font("TimesRoman",Font.BOLD,12));North.add(Blank=new JLabel(" "));North.add(Query=new JButton("Query"));Query.setForeground(Color.blue);Query.addActionListener(this);JPanel North2=new JPanel(new FlowLayout());LeftNorth.add(North2);North2.add(PriorMonth=new JButton(new ImageIcon("../images/prior.gif")));PriorMonth.addActionListener(this);PriorMonth.setActionCommand("prior");priormonth=month;prioryear=year;SwitchMonth(month);North2.add(ShowDate = new JLabel(SwitchMonth+" "+","+" "+String.valueOf(year),SwingConstants.CENTER));ShowDate.setForeground(Color.blue);ShowDate.setFont(new Font("TimesRoman",Font.BOLD,14));North2.add(NextMonth=new JButton(new ImageIcon("../images/next.gif")));NextMonth.addActionListener(this);NextMonth.setActionCommand("next");//LeftPane_CenterLeftCenter.setLayout(new GridLayout(7,7));//print titlefor(int i=0;i<7;i++){TopBarTitle[i]=new JLabel();TopBarTitle[i].setText(week[i]);TopBarTitle[i].setForeground(Color.darkGray);TopBarTitle[i].setHorizontalAlignment(0);TopBarTitle[i].setBackground(Color.MAGENTA );TopBarTitle[i].setBorder(BorderFactory.createRaisedBevelBorder());LeftCenter.add(TopBarTitle[i]);}for(int i=0;i<42;i++){ShowDays[i]=new JTextField();ShowDays[i].addMouseListener(this);ShowDays[i].setEditable(false);LeftCenter.add(ShowDays[i]);}//print the body of monthPrintMonth(year,month,day);//the layout about right of jpaneRightPane = new JPanel(new BorderLayout());JPanel RightCenter = new JPanel();JPanel RightNorth = new JPanel();JPanel RightSouth = new JPanel(new FlowLayout());RightPane.add(RightNorth,BorderLayout.NORTH);RightPane.add(RightCenter,BorderLayout.CENTER);RightPane.add(RightSouth,BorderLayout.SOUTH);RightNorth.add(NorthMonthDayYear=new JLabel(">>"+year+","+SwitchMonth+","+day+"<<")); key=year+"_"+SwitchMonth+"_"+day;NorthMonthDayYear.setForeground(Color.blue);NorthMonthDayYear.setFont(new Font("TimesRoman",Font.BOLD,17));RightCenter.add(CenterText=new JTextArea("please write today's things."));CenterText.setLineWrap(true);CenterText.setSelectedTextColor(Color.blue);//CenterText.addActionListener(this);RightSouth.add(SouthSave=new JButton(" Save "));SouthSave.setBackground(Color.cyan);SouthSave.addActionListener(this);SouthSave.setActionCommand("Save");RightSouth.add(SouthDelete=new JButton(" Delete "));SouthDelete.setBackground(Color.cyan);SouthDelete.addActionListener(this);SouthDelete.setActionCommand("Delete");this.year = year;this.month = month;this.day = day;///add container to put LeftPane and RightPaneContainer con=getContentPane();JSplitPane split=new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,RightPane,LeftPane);//gai bian con.add(split,BorderLayout.CENTER);con.validate();//add CenterPane to notepad//CenterPane initializesetFont(new Font("Times New Roman",Font.PLAIN,12));JScrollPane scrollpane = new JScrollPane(CenterText); scrollpane.setPreferredSize(new Dimension(220,250)); RightCenter.add(scrollpane);//init randomaccessfile}//switch the month in englishpublic void SwitchMonth(int month){switch(month){case 1:SwitchMonth="Jan";break;case 2:SwitchMonth="Feb";break;case 3:SwitchMonth="Mar";break;case 4:SwitchMonth="Apr";break;case 5:SwitchMonth="May";break;case 6:SwitchMonth="Jun";break;case 7:SwitchMonth="Jul";break;case 8:SwitchMonth="Aug";break;case 9:SwitchMonth="Sep";break;case 10:SwitchMonth="Qct";break;case 11:SwitchMonth="Nov";break;case 12:SwitchMonth="Dec";break;}}//print the body of the monthpublic void PrintMonth(int year,int month,int day){//Get start day of the week for the first date in the month int startday = GetStartDay(year,month);//Get number of days in the monthint dayinmonth = GetNumOfDaysInMonth(year,month); //Print header//Print bodyPrintMonthBody(startday,dayinmonth,day);}//PrintMonth(int year,int month,int day)'s burdenpublic void PrintMonth(int year,int month){//Get start day of the week for the first date in the monthint startday = GetStartDay(year,month);//Get number of days in the monthint dayinmonth = GetNumOfDaysInMonth(year,month);//Print header//Print bodyPrintMonthBody(startday,dayinmonth);}//PrintMonthBody(int startday,int dayinmonth,int day)'s burden public void PrintMonthBody(int startday,int dayinmonth){for(int i=startday,n=1;i<startday+dayinmonth;i++){ShowDays[i].setText(""+n);ShowDays[i].setHorizontalAlignment(0);//let centerif(n==day){ShowDays[i].setForeground(Color.green);ShowDays[i].setFont(new Font("TimesRoman",Font.BOLD,20)); ShowDays[i].setBackground(Color.DARK_GRAY);}else{ShowDays[i].setFont(new Font("TimesRoman",Font.BOLD,12)); ShowDays[i].setForeground(Color.white);ShowDays[i].setBackground(Color.DARK_GRAY);}n++;}for(int i=0;i<startday;i++){ShowDays[i].setText("");ShowDays[i].setBackground(Color.DARK_GRAY);}for(int i=startday+dayinmonth;i<42;i++){ShowDays[i].setText("");ShowDays[i].setBackground(Color.DARK_GRAY);}//judge leapyear is or notpublic boolean IsLeapYear(int year){if((year%400==0)||(year%4==0&&year%100!=0))return true;elsereturn false;}//judge the start day of a monthpublic int GetStartDay(int year,int month){//get total number of day since1/1/0000int startday0001=-32768;long totalnumofdays=GetTotalNumOfDays(year,month);//return the start dayreturn (int)((totalnumofdays+startday0001)%7);}//judge the days of a yearpublic long GetTotalNumOfDays(int year,int month){long total=0;//get the total days from -32767 to yearfor(int i=-32767;i<year;i++){if(IsLeapYear(i))total=total+366;elsetotal=total+365;}//Add days from jan to the month prior to the calendar monthfor(int i=1;i<month;i++)total=total+GetNumOfDaysInMonth(year,i);return total;}//judge the days of a monthpublic int GetNumOfDaysInMonth(int year,int month){if(month==1 || month==3 || month==5 || month==7 || month==8 || month==10 ||month==12) return 31;if(month==4 || month==6 || month==9 || month==11)return 30;if(month==2)if(IsLeapYear(year))return 29;elsereturn 28;}return 0;}public void WriteRecord(){String content;content=CenterText.getText();int n=content.length();char[] contentarr=new char[n];try{int i=0;for(i=0;i<n;i++){contentarr[i]=content.charAt(i);}File Diary = new File("Diary");Diary.mkdir();File myfile=new File("Diary\\"+key+".txt"); FileWriter Record=new FileWriter(myfile);for(i=0;i<contentarr.length;i++){Record.write(contentarr[i]);}Record.close();JOptionPane.showMessageDialog(this,"Save success!");}catch(IOException ex){}}public void ReadRecord(){try{String content="";File myfile=new File("Diary\\"+key+".txt"); FileReader Record=new FileReader(myfile);if(myfile.exists())long b=myfile.length();//char[] contentarr=new char[b];int n=JOptionPane.showConfirmDialog(this,"Today has logs,are you read?","Confirm",JOptionPane.YES_NO_CANCEL_OPTION);if(n==JOptionPane.YES_OPTION){while((b=Record.read())!=-1){content=content+(char)b;}CenterText.setText(content);}}Record.close();}catch(IOException ex){CenterText.setText("Today has not logs.");}}public void DeleteFile(){String filepath="Diary\\"+key+".txt";File myfile=new File(filepath);int n=JOptionPane.showConfirmDialog(this,"Are you sure delete the file?","Confirm",JOptionPane.YES_NO_CANCEL_OPTION);if(n==JOptionPane.YES_OPTION){if(myfile.exists()){Runtime rt = Runtime.getRuntime();try{rt.exec("cmd /c del "+filepath);}catch (IOException e){e.printStackTrace();}JOptionPane.showMessageDialog(this,"Delete successed!");CenterText.setText("Today has not logs.");}elseJOptionPane.showMessageDialog(this,"The file doesn't exist,delete failured!");}}}public void AboutActionListenerWay(){try{prioryear=Integer.parseInt(YearText.getText());priormonth=MonthCombobox.getSelectedIndex()+1;String StrYearText=YearText.getText();changeyearmessage=Integer.parseInt(StrYearText);changemonthmessage=MonthCombobox.getSelectedIndex()+1;monthafterquery=changemonthmessage;yearafterquery=changeyearmessage;SwitchMonth(changemonthmessage);ShowDate.setText(SwitchMonth+" "+","+" "+String.valueOf(changeyearmessage));PrintMonth(changeyearmessage,changemonthmessage);ischange=true;}catch(Exception ee){JOptionPane.showMessageDialog(this,"The input format doesn't match","Error",JOptionPane.ERROR_MESSAGE);}}//do actonlistener thingspublic void actionPerformed(ActionEvent eAction){String ActionCommand=eAction.getActionCommand();//Handle button eventsif(eAction.getSource() instanceof JButton){//Handle the queryif("Query".equals(ActionCommand)){try{AboutActionListenerWay();}catch(Exception ee){JOptionPane.showMessageDialog(this,"The input format doesn't}}//Handle prior monthif("prior".equals(ActionCommand)){if(priormonth>1){priormonth=priormonth-1;}else{priormonth=12;prioryear=prioryear-1;}PrintMonth(prioryear,priormonth,day);SwitchMonth(priormonth);ShowDate.setText(SwitchMonth+" , "+prioryear);NorthMonthDayYear.setText(">>"+SwitchMonth+","+day+","+prioryear+"<<"); key=prioryear+"_"+SwitchMonth+"_"+day;ischange_priornext=true;}//Handle next monthif("next".equals(ActionCommand)){if(priormonth<12){priormonth=priormonth+1;}else{priormonth=1;prioryear=prioryear+1;}PrintMonth(prioryear,priormonth,day);SwitchMonth(priormonth);ShowDate.setText(SwitchMonth+" , "+prioryear);NorthMonthDayYear.setText(">>"+SwitchMonth+","+day+","+prioryear+"<<"); key=prioryear+"_"+SwitchMonth+"_"+day;ischange_priornext=true;}//Handle the "Go to today"if("Go to today".equals(ActionCommand)){YearText.setText("");MonthCombobox.setSelectedIndex(0);SwitchMonth(month);ShowDate.setText(SwitchMonth+" "+","+" "+String.valueOf(year)); NorthMonthDayYear.setText(">>"+year+SwitchMonth+","+day+","+"<<"); key=year+"_"+SwitchMonth+"_"+day;priormonth=month;prioryear=year;ischange=false;}//Handle the "Save"if("Save".equals(ActionCommand)){WriteRecord();}if("Delete".equals(ActionCommand)){DeleteFile();}}//Handle JTextField eventsif(eAction.getSource() instanceof JTextField){//Handle the queryAboutActionListenerWay();}}public void mousePressed(MouseEvent eMouse){int day;try{//Handle ShowDays[] eventsif(ischange==false){JTextField source=(JTextField)eMouse.getSource();day=Integer.parseInt(source.getText());if(ischange_priornext==false){NorthMonthDayYear.setText(">>"+SwitchMonth+","+day+","+year+"<<"); key=year+"_"+SwitchMonth+"_"+day;}elseNorthMonthDayYear.setText(">>"+SwitchMonth+","+day+","+prioryear+"<<");key=prioryear+"_"+SwitchMonth+"_"+day;}}elseJTextField source=(JTextField)eMouse.getSource();day=Integer.parseInt(source.getText());if(ischange_priornext==false){SwitchMonth(changemonthmessage);NorthMonthDayYear.setText(">>"+SwitchMonth+","+day+","+changeyearmessage+"<<"); key=changeyearmessage+"_"+SwitchMonth+"_"+day;}else{SwitchMonth(priormonth);NorthMonthDayYear.setText(">>"+SwitchMonth+","+day+","+prioryear+"<<");key=prioryear+"_"+SwitchMonth+"_"+day;}}ReadRecord();}catch(Exception ee){}}public void mouseClicked(MouseEvent e){}public void mouseReleased(MouseEvent e){}public void mouseEntered(MouseEvent e){}public void mouseExited(MouseEvent e){}public void SaveLog(int year,int month,int day){}public static void main(String[] args) throws Exception{int y=calendar.get(Calendar.YEAR);int m=calendar.get(Calendar.MONTH)+1;int d=calendar.get(Calendar.DAY_OF_MONTH);calendar frame = new calendar(y,m,d);frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.setSize(560,300);frame.setLocation(100,100);frame.setVisible(true);frame.setResizable(false);frame.ReadRecord();}}四、设计结果与分析4.1程序效果图程序打开时的效果,左边是记事本框,右边是万年历框。

C语言程序设计万年历

C语言程序设计万年历

C语言课程设计报告题目:万年历系统设计者:李文杰专业班级:软件工程(.net)一班学号:************指导教师:***2011年6月30日河南理工大学计算机科学与技术学院目录一、C语言课程设计任务书 (3)1、C语言课程设计目的和要求 (3)1.1目的: (3)1.2要求: (3)二、本组课题及本人任务 (3)三、程序功能简介 (4)四、主题内容 (4)1、题目与要求 (4)1.1 问题提出 (4)1.2 本系统涉及的知识点 (5)1.3 功能要求 (5)2、功能设计 (6)2.1 算法设计 (6)3、程序流程图.. (8)4、程序代码设计 (9)4.1输入及年份平润确定模块 (9)4.2求星期天数模块 (9)4.3求月份天数模块 (11)4.4查询模块 (11)4.5输出及验证模块 (12)4.6说明: (12)5、C程序设计总结 (12)6、结束语 (13)参考文献 (13)一、C语言课程设计任务书1、C语言课程设计目的和要求1.1目的:1)复习、巩固C语言的基础知识,进一步加深对C语言的理解和掌握;2)课程设计为学生提供了一个既动手又动脑,独立实践的机会,将课本上的理论知识和实际有机的结合起来,锻炼学生的分析解决实际问题的能力。

提高学生适应实际,实践编程的能力;3)培养学生在项目开发中团队合作精神、创新意识及能力。

1.2要求:1)、对系统进行功能模块分析、控制模块分析正确,符合课题要求,实现相应功能;可以加以其他功能或修饰,使程序更加完善、合理;2)、系统设计要实用,编程简练,可用,功能全面3)、说明书、流程图要清楚4)、记录设计情况(备查,也为编写设计说明书作好准备);5)、要求采用模块化程序设计方法,及锯齿型书写格式,要求上机调试通过和按设计报告格式。

6)、设计上交内容:设计报告一份(按格式书写);源程序盘一张(能编译成可执行文件并能正常运行,可一个班交一张光盘)。

二、本组课题及本人任务经考虑及尝试,本人决定选择题目2.2编写一个万年历系统,完成对日期的查询输出。

Java版万年历设计报告及流程图

Java版万年历设计报告及流程图

Java课程设计题目万年历班级计本0901班姓名秘密学号200908111053指导教师韩瑞峰要求:功能要求:可两人对下(用鼠标操作),判断胜负。

界面要求:美观简洁,有简单操作说明。

设计方案界面设计界面主要由两部分组成——查询输入部分和结果显示部分。

查询输入部分包括一个文本域,用于输入年份:一个选择下拉框,用于选择月份:一个选择按扭,用来出发查询事件。

具体使用的方法见注释流程图源代码import java.applet.Applet;import java.awt.*;import java.util.*;public class CalendarApplet extends Applet{static final int TOP = 80; //顶端距离static final int CELLWIDTH=50,CELLHEIGHT = 50; //单元格尺寸static final int MARGIN = 3; //边界距离static final int FEBRUARY = 1;TextField tfYear = new TextField("2011", 6); //显示年份的文本域Choice monthChoice = new Choice(); //月份选择下拉框Button btUpdate = new Button("选择"); //选择按钮GregorianCalendar calendar=new GregorianCalendar(); //日历对象Font smallFont = new Font("TimesRoman", Font.PLAIN, 15); //显示小字体Font bigFont = new Font("TimesRoman", Font.BOLD, 50); //显示大字体String days[] = {"星期日", "星期一", "星期二", "星期三","星期四", "星期五", "星期六"};String months[] = {"一月", "二月", "三月", "四月","五月", "六月", "七月", "八月", "九月","十月", "十一月", "十二月"};int daysInMonth[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; //每个月的天数int searchMonth,searchYear; //查询的年份及月份public void init(){setBackground(Color.white); //设置背景颜色searchMonth = calendar.get(Calendar.MONTH); //得到系统年份searchYear = calendar.get(Calendar.YEAR); //得到系统月份add(new Label(" 年:")); //增加组件到ApplettfYear.setText(String.valueOf(searchYear)); //设置文本域文字add(tfYear);add(new Label(" 月:"));monthChoice.setFont(smallFont); //设置月份选择下拉框的显示字体for (int i = 0; i < 12; i++) {monthChoice.addItem(months[i]); //增加下拉框选项}monthChoice.select(searchMonth); //设置下拉框当前选择项add(monthChoice);add(btUpdate);int componentCount=this.getComponentCount(); //得到Applet中的组件数量for (int i=0;i<componentCount;i++){getComponent(i).setFont(smallFont); //设置所有组件的显示字体}}public void paint(Graphics g){FontMetrics fontMetric; //显示字体的FontMetrics对象int fontAscent;int dayPos;int totalWidth, totalHeight; //总的宽度,高度int numRows; //行数int xNum, yNum; //水平和垂直方向单元格数量int numDays;String dayStr; //显示天数字符串int margin;g.setColor(Color.red); //设置当前颜色g.setFont(bigFont); //设置当前使用字体g.drawString(searchYear+"年",60,TOP+70); //绘制字符串g.drawString((searchMonth+1)+"月",200,TOP+130);g.setColor(Color.black);g.setFont(smallFont);fontMetric = g.getFontMetrics(); //获取变量初值fontAscent = fontMetric.getAscent();dayPos = TOP + fontAscent / 2;totalWidth = 7 * CELLWIDTH; //得到总的表格宽度for (int i = 0; i < 7; i++) {g.drawString(days[i], (CELLWIDTH-fontMetric.stringWidth(days[i]))/2 +i*CELLWIDTH,dayPos-20); //绘制表格标题栏}numRows = getNumberRows(searchYear, searchMonth); //计算需要的行的数量totalHeight = numRows * CELLHEIGHT; //得到总的表格高度for (int i = 0; i <= totalWidth; i += CELLWIDTH) {g.drawLine(i, TOP , i, TOP+ totalHeight); //绘制表格线}for (int i = 0, j = TOP ; i <= numRows; i++, j += CELLHEIGHT) {g.drawLine(0, j, totalWidth, j); //绘制表格线}xNum = (getFirstDayOfMonth(searchYear, searchMonth) + 1) * CELLWIDTH - MARGIN;yNum = TOP + MARGIN + fontAscent;numDays = daysInMonth[searchMonth] + ((calendar.isLeapYear(searchYear) &&(searchMonth == FEBRUARY)) ? 1 : 0);for (int day = 1; day <= numDays; day++) {dayStr = Integer.toString(day);g.drawString(dayStr, xNum - fontMetric.stringWidth(dayStr), yNum); //绘制字符串xNum += CELLWIDTH;if (xNum > totalWidth) {xNum = CELLWIDTH - MARGIN;yNum += CELLHEIGHT;}}}public boolean action(Event e, Object o){int searchYearInt;if (e.target==btUpdate){searchMonth = monthChoice.getSelectedIndex(); //得到查询月份searchYearInt = Integer.parseInt(tfYear.getText(), 10); //得到查询年份if (searchYearInt > 1581) {searchYear = searchYearInt;}repaint(); //重绘屏幕return true;}return false;}private int getNumberRows(int year, int month) { //得到行数量int firstDay;int numCells;if (year < 1582) { //年份小于1582年,则返回-1return (-1);}if ((month < 0) || (month > 11)) {return (-1);}firstDay = getFirstDayOfMonth(year, month); //计算月份的第一天if ((month == FEBRUARY) && (firstDay == 0) && !calendar.isLeapYear(year)) { return 4;}numCells = firstDay + daysInMonth[month];if ((month == FEBRUARY) && (calendar.isLeapYear(year))) {numCells++;}return ((numCells <= 35) ? 5 : 6); //返回行数}private int getFirstDayOfMonth(int year, int month) { //得到每月的第一天int firstDay;int i;if (year < 1582) { //年份小于1582年,返回-1return (-1);}if ((month < 0) || (month > 11)) { //月份数错误,返回-1return (-1);}firstDay = getFirstDayOfYear(year); //得到每年的第一天for (i = 0; i < month; i++) {firstDay += daysInMonth[i]; //计算每月的第一天}if ((month > FEBRUARY) && calendar.isLeapYear(year)) {firstDay++;}return (firstDay % 7);}private int getFirstDayOfYear(int year){ //计算每年的第一天int leapYears;int hundreds;int fourHundreds;int first;if (year < 1582) { //如果年份小于1582年return (-1); //返回-1}leapYears = (year - 1581) / 4;hundreds = (year - 1501) / 100;leapYears -= hundreds;fourHundreds = (year - 1201) / 400;leapYears += fourHundreds;first=5 + (year - 1582) + leapYears % 7; //得到每年第一天return first;}}程序运行效果初始界面选择日期后收获感悟经过这次课程设计使我们对JA V A图形用户界面的有关知识有了更深入了解,理,完成了简单的日历功能,输入查询的年份与月份,单击“选择”按扭,则可得到相应的日历,简单实用。

用c语言编写万年历程序

用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。

微机与接口技术课程设计--万年历

微机与接口技术课程设计--万年历

信息科学与技术学院《微机原理与接口技术》课程设计题目名称:电子万年历学生姓名:湛开洪学号:2009082191专业:计算机科学与技术班级:09级(1)班指导教师:裘祖旗完成日期:2012年 1 月 11日目录目录一、课程设计要求 -------------------------------------------------------------- 3二、程序流程图 ----------------------------------------------------------------- 4三、程序主要功能模块 -------------------------------------------------------- 41.画出该程序的界面 (5)2.写出所有非汉字字符 (5)3.写出汉字字符 (6)4.填充公历及农历的信息 (6)5.用户输入一个需要显示的新日期 (7)四、主要技术路线 -------------------------------------------------------------- 81.开发工具 (8)2.主要算法 (8)3.重要指令 (10)五、系统的难点及解决方案 ------------------------------------------------- 111.算法 (11)2.由思想到程序的转换 (11)六、总结与体会 --------------------------------------------------------------- 13七、参考文献 ------------------------------------------------------------------ 14附录(源程序) --------------------------------------------------------------- 15万年历一、课程设计要求DOS 下万年历(8086 汇编)DOS 运行的日历,支持农历:1. a. 能实现计时功能2.显示年、月、日、进、分、秒、星期扩展功能:实现公历与阴历转换二、程序流程图三、程序主要功能模块本万年历程序正确实现从1901年1月1日至2050年12月31日的公历与农历查询,包括公历年,月,日,星期,农历干支年,月,日。

单片机电子万年历(含程序)

单片机电子万年历(含程序)

CHANGZHOU INSTITUTE OF TECHNOLOGY科研实践项目名称:电子万年历设计二级学院:电子信息与电气工程学院专业:电气工程及其自动化班级: 10 电二学生姓名:祝学东学号: 10020442 指导教师:庄志红职称:副教授起止时间: 2013年12月9日—2013年12月20日摘要本设计是电子万年历。

具备三个功能:能显示:年、月、日、时、分、秒、星期,并具有可调整日期和时间功能。

该电子万年历使用12MHZ晶振与单片机AT89C52相连接,通过软件编程的方法实现了以24小时为一个周期,同时显示小时、分钟和秒的要求。

利用单片机定时器及计数器产生定时效果通过编程形成数字钟效果,再利用数码管动态扫描显示单片机内部处理的数据。

同时通过端口读入当前外部控制状态来改变程序的不同状态,实现不同功能。

电子万年历设计与制作可采用数字电路实现,也可以采用单片机来完成。

若用数字电路完成,所设计的电路相当复杂,大概需要十几片数字集成块,其功能也主要依赖于数字电路的各功能模块的组合来实现,焊接的过程比较复杂,成本也非常高。

若用单片机来设计制作完成,由于其功能的实现主要通过软件编程来完成,这样一来就降低了硬件电路的复杂性,从而使得其成本降低,更适合我们大学生自主研发。

AT89C52是一个低电压,高性能CMOS 8位单片机,片内含8k bytes的可反复擦写的Flash只读程序存储器和256 bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器和Flash存储单元,AT89C52单片机在电子行业中有着广泛的应用。

关键词:单片机数字显示动态扫描时间日期可调目录第一章设计论证及要求 (1)1.1设计应用意义 (1)1.2设计方案论证 (1)1.2.1 单片机芯片选择 (1)1.2.2显示模块选择 (1)1.2.3时钟芯片选择 (2)1.3设计流程 (2)第二章系统硬件电路设计 (3)2.1 CPU时钟 (3)2.2 主控芯片AT89C52模块 (3)2.3 显示控制电路的设计及原理 (4)2.4 按键电路设计 (6)第三章系统软件设计 (7)3.1 软件主流程 (7)3.2初始化程序及宏定义 (9)3.3主程序 (10)3.4显示子程序 (12)3.5 按键子程序 (15)3.6 延时子程序 (16)第四章系统调试与分析 (17)第五章设计总结 (20)第六章参考文献 (21)附一元件清单 (22)附二仿真原理图 (23)附三程序清单 (24)附四实物图 (35)第一章设计论证及要求1.1设计应用意义二十一世纪是数字化技术高速发展的时代,而单片机在数字化高速发展的时代扮演着极为重要的角色。

C语言编写方案 万年历

C语言编写方案 万年历

结束 图 6-2 系统流程图
第 3 页 共 22 页
《C 语言程序设计》课程综合案例
}Lunar_ipedef struct {
int era_year; //阳历年份 int era_month; //阳历月份 int era_day; //阳历日期 }Chinese_era;
int get_lunar_info(int solar_year, int solar_month, Lunar_info *l_info,Chinese_era *china_era):返回农历信
息;
第 2 页 共 22 页
《C 语言程序设计》课程综合案例
int out_chinese(Lunar_info *l_info,char *chinese_str):输出农历日期信息; void sub_menue():界面输出。
"小寒","大寒","立春","雨水","惊蛰","春分", "清明","谷雨","立夏","小满","芒种","夏至", "小暑","大暑","立秋","处暑","白露","秋分", "寒露","霜降","立冬","小雪","大雪","冬至" }; /*农历日*/ char chinese_day[30][5]= { "初一","初二","初三","初四","初五","初六","初七",

C语言程序设计,万年历

C语言程序设计,万年历

C语言程序设计*万年历HPU chang目录:1.设计任务书1.1题目与要求1.2本系统涉及的知识点2.功能设计:2.1算法设计2.2 部分模块流程图3.程序代码设计3.1输入模块3.2输出模块4.程序设计总结:5.致谢;6.参考文献:7.附:程序1设计任务书:1.1题目与要求本人计划编写一个万年历系统,用来查询任意一天的星期、任意年月的月历、任意年年历。

具体要求如下:(1)当输入数字“1”时,显示“请输入年月日(XXXX,XX,XX)”运行后输出:XXXX 年XX月XX日是星期X,是否继续查询(Y/N)?如果输入Y,则重新显示“请输入年月日(XXXX,XX,XX)”,否则回到主菜单.(2)在主菜单中输入2后,显示:“请输入要打印的月份(XXXX)”运行后输出X月的日历,格式为:XXXX年XX月S M T W T F SX X X X X X XX X X X X X XX X X X X X XX X X X X X XX X运行完成后显示:“是否继续打印(Y/N)?” 如果输入Y,则重新显示“请输入要打印的月份(XXXX年XX月)”,否则回到主菜单。

(3)在主菜单中输入3后,显示:“请输入要打印的年份(XXXX)”运行后输出XXXX年的日历,XXXXX(月数)S M T W T F SX X X X X X XX X X X X X XX X X X X X XX X X X X X Xx x……S M T W T F SX X X X XX X X X X X XX X X X X X XX X X X X X XX X X X X运行完成后显示:“是否继续打印(Y/N)?” 如果输入Y,则重新显示“请输入要打印的年份(XXXX)”,否则回到主菜单。

(4)在主菜单中输入4后,显示:“是否要真的退出(Y/N)?” 如果输入Y,结束程序运行,否则重新显示主菜单。

1.2本系统涉及的知识点本系统涉及的知识点有: for语句、do-while语句、switch语句、break语句、if-else 语句、还有sizeof、return 、default、char、printf 、scanf 等,包含了课本上的很多知识。

手指万年历教程

手指万年历教程

手指万年历教程
说到万年历大家都知道到,可是手指万年历呢,就不懂了吧,所谓手指万年历就是通过自己的手指,不借助其他的工具,可以准确的说出任意一个日期所对应的那一天是星期几。

下面我们就来学习一下!第一步、手指定月份。

伸出自己的右手,参照下图用自己的右手大拇指熟练的定位12个月份吧,按照顺序就行练习,越熟练越好。

第二步、手指定星期。

伸出自己的右手,参照下图用自己的右手大拇指熟练的定位星期,越熟练越好。

第三步、小试牛刀,来计算一个日期。

计算:2015年1月4日是星期几?
步骤如下:
1. 找出月份。

用大拇指找出1月的手指位置即可
2. 找出星期。

刚刚找到的月份的位置就是每月的第1天,日子是4,所以,星期测算依次从1月位置数4天,得到答案星期四
3. 加上关键数字(后面会详细讲),2015年的管家数字是3,所以星期四+3天就是星期天
4. 最终得出答案,2015年1月4日是星期天,怎么样很简单吧,你会了吗?
下面自己尝试计算一下:2015年2月14日是星期几?关键数字是3
第四步、根据年份计算关键数字
当然了如果大家不想计算的话,小编已经为大家准备好了,大家只要把这些数字记下来即可,不要想记硬背哦,仔细观察是有规律的。

切记平年只有一个关键数字,而闰年是有两个的,在计算的过程中1—2月加爱前面的关键数字,3—12月加后面的关键数字。

下面自己练起来吧,加油。

C++课程设计--万年历

C++课程设计--万年历

C++课程设计--万年历安徽省巢湖学院计算机与信息工程学院课程设计报告课程名称《C++语言》课题名称万年历设计专业计算机科学与技术班级#**************学号000000000姓名非凡方法指导教师vdnggb目录1、设计题目•••••••••••••••••••••• 12、设计要求•••••••••••••••••••••• 13、总体设计•••••••••••••••••••••• 13.1 系统功能框架••••••••••••••••• 13.2 系统功能说明••••••••••••••••• 24、详细设计•••••••••••••••••••••• 24.1 数据结构设计••••••••••••••••• 24.2 程序详细源代码••••••••••••••• 35、运行结果•••••••••••••••••••••• 81、设计题目:万年历设计2、设计要求:(1)程序运行时,首先给出3个菜单选项的内容和输入提示:1 显示一年的日历2 显示某一天是星期几0 退出(2)用户可以通过主菜单选择不同的选项。

若选择1,则通过输入年份,显示输出该年每个月的日历。

若选择2,则通过输入日期,查询这一天是星期几。

3、总体设计:3.1系统功能框架(流程图)依据课程设计的要求,需要设计一个菜单功能,进入程序后,有菜单可以提供选择,选择1,进入日期显示阶段,日期显示完毕,再次进入菜单选择。

选择2,进入日期查询阶段,日期查询完毕,再次进入菜单。

选择0,退出程序。

3.2系统功能说明(功能板块)在菜单要求当中,要求能够按年查询,能够查询某天是星期几。

然而,在程序当中为了实现这两个功能,包括了闰年的判断,日期判断,日期打印和日期的查询。

功能是由它们共同实现的。

4、详细设计4.1 数据结构设计本程序采用类定义代码如下:class Date{private:int year;public:int weekday();void disp(int x);int isleapyear();int monthday(int i);void getyear();};类名:Date数据成员:year成员函数:void getyear();//输入年份的函数int isleapyear();//判断是否是闰年的函数int weekday();//判断本月第一天是星期几的函数int monthday(int i);// 计算每月有几天的函数void disp(int x); //输出月份及查询年份的月历的函数及字符串数组定义代码如下:char*weekd[7]={"MON","TUE","WEN","THU","FRI","STA","SUN"};4.2 程序详细源代码#include<iostream.h>#include<iomanip.h>void f1();void f2();int judgeyear(int);int monthdays(int ,int); //函数原型声明int judgeyear(int year){if((year%400==0)||(year%4==0&&year%100!=0)) //判断输入的年份是否为闰年模块return 1;elsereturn 0;}int monthdays(int year,int month) //计算各个月份的天数{if(month==2){if(judgeyear(year)==1) return 29;else return 28;}else if(month==4||month==6||month==9||month==11)return 30;elsereturn 31;}void f1(){int year,t,i,month;cout<<"请输入年份:";cin>>year;t=((year-1)*365+(year-1)/4-(year-1)/100+(year-1)/400+1)%7; //判断这一年的元旦是星期几for(int k=1;k<=12;k++){cout<<k<<"月份的日历如下"<<endl;cout<<setw(6)<<"日"<<setw(6)<<"一"<<setw(6)<<"二"<<setw(6)<<"三"<<setw(6)<<"四"<<setw(6)<<"五"<<setw(6)<<"六"<<endl;for(int z=1;z<=t;z++)cout<<setw(6)<<' ';for(i=1;i<=monthdays(year,k);i++){cout<<setw(6)<<i<<setw(6);if((i+t)%7==0)cout<<endl;}t=(t+monthdays(year,k)%7)%7;cout<<endl;//日历显示模块}}void f2(){int year,month,day;cout<<"请输入年份:";cin>>year;cout<<"请输入月份:";cin>>month;cout<<"请输入此年此月相应的日期"<<"<1~31>:";cin>>day;int l,n,t,w,date(0);char *week[]={"星期天","星期一","星期二","星期三","星期四","星期五","星期六"};n=(year-1900);l=(n-1)/4;n=l+n;n=n%7;n=n;for(int i=1;i<month;i++)date+=monthdays(year,i);date+=day;n=n+date;n=n%7;cout<<"\n该天是:"<<week[n];}//日子查询模块void main(){int i=1;cout<<" --------------------------------"<<endl;cout<<" * *"<<endl;cout<<" 欢迎进入万年历查询系统"<<endl;cout<<" * *"<<endl;cout<<"--------------------------------"<<endl<<endl<<endl;cout<<"请选择您的查询内容:"<<endl;cout<<" "<<"1.显示一年的日历"<<";"<<endl;cout<<" "<<"2.显示某一天是星期几"<<";"<<endl;cout<<" "<<"0.退出"<<";"<<endl;cout<<"请选择按键"<<"<0-2>:"; //输出主菜单while(i){cin>>i;if(i>=0&&i<=2){switch(i){case 1: f1(); break;case 2: f2(); break;case 0: cout<<"谢谢使用,再见!";break;}}}}5、运行结果1程序运行测试:在电脑中打开C++应用程序, 首先进入VC++6.0,将程序代码输入,编译,组建,调试。

万年历程序和电路图

万年历程序和电路图

目录第一章设计方案 (1)1.1.硬件设计 (1)1.1.1设计要求 (1)1.1.2硬件框图 (1)1.1.3硬件选择 (1)1.2软件设计 (3)1.2.1编程环境及语言 (3)1.2.2程序框图 (3)第二章系统设计 (4)2.1硬件设计 (4)2.1.1振荡电路 (4)2.1.2复位电路 (4)2.1.3按键 (4)2.1.4 lcd显示电路 (5)2.1.5音乐播放电路 (5)2.1.6 P0上拉电阻计算 (6)2.2软件设计 (7)2.2.1程序流程图 (7)2.2.2流程的各个模块设计 (9)心得体会 (21)附录 1. 元器件表 (22)附录 2.程序源代码 (23)1602.c文件 (23)Clock.H文件 (27)Music.h文件 (45)LCD1602.H文件 (47)参考文献 (54)引言单片机就是微控制器,是面向应用对象设计、突出控制功能的芯片。

单片机接上晶振、复位电路和相应的接口电路,装载软件后就可以构成单片机应用系统。

将它嵌入到形形色色的应用系统中,就构成了众多产品、设备的智能化核心。

本设计就是应用单片机强大的控制功能制作而成的电子万年历,该电子万年历包括三大功能:实时显示年、月、日、时、分、秒;实现位调;附加播放音乐功能。

本设计是基于A T89C51和LCD1602液晶显示器设计的可调式电子钟。

该单片机采用的MCU51内核,因此具有很好的兼容性,内部带有4KB的ROM,能够存储大量的程序,最突出特点是具有ISP在系统烧写功能,使得烧写程序更加方便。

显示器件采用通用型1602液晶,可显示32个字符,如果使用数码管来做显示器件需消耗大量的系统资源,因此采用低功耗的1602液晶,该液晶显示方便,功能强大,完全能满足数字万年历的显示要求。

通过此次设计能够更加牢固的掌握单片机的应用技术,增强动手能力、硬件设计能力以及软件设计能力。

第一章设计方案1.1.硬件设计1.1.1设计要求实现年月日、时分秒、星期的显示功能,用两个按键来实现日期和时间的调整功能,调整要求星期能自动更新,且能实现位调。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档