模拟时钟转动程序
51单片机作的电子钟程序及电路图

51单片机作的电子钟程序在很多地方已经有了介绍,对于单片机学习者而言这个程序基本上是一道门槛,掌握了电子钟程序,基本上可以说51单片机就掌握了80%。
常见的电子钟程序由显示部分,计算部分,时钟调整部分构成。
时钟的基本显示原理:时钟开始显示为0时0分0秒,也就是数码管显示000000,然后每秒秒位加1 ,到9后,10秒位加1,秒位回0。
10秒位到5后,即59秒,分钟加1,10秒位回0。
依次类推,时钟最大的显示值为23小时59分59秒。
这里只要确定了1秒的定时时间,其他位均以此为基准往上累加。
开始程序定义了秒,十秒,分,十分,小时,十小时,共6位的寄存器,分别存在30h,31h,32h,33h,34h,35h单元,便于程序以后调用和理解。
6个数码管分别显示时、分、秒,一个功能键,可以切换调整时分秒、增加数值、熄灭节电等功能全部集一键。
以下是部分汇编源程序,购买我们产品后我们用光盘将完整的单片机汇编源程序和烧写文件送给客户。
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 中断入口程序 ;; (仅供参考) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ORG 0000H ;程序执行开始地址LJMP START ;跳到标号START执行ORG 0003H ;外中断0中断程序入口RETI ;外中断0中断返回ORG 000BH ;定时器T0中断程序入口LJMP INTT0 ;跳至INTTO执行ORG 0013H ;外中断1中断程序入口RETI ;外中断1中断返回ORG 001BH ;定时器T1中断程序入口LJMP INTT1 ;跳至INTT1执行ORG 0023H ;串行中断程序入口地址RETI ;串行中断程序返回;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; 主程序 ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;START: MOV R0,#70H ;清70H-7AH共11个内存单元MOV R7,#0BH;clr P3.7 ;CLEARDISP: MOV @R0,#00H ;INC R0 ;DJNZ R7,CLEARDISP ;MOV 20H,#00H ;清20H(标志用)MOV 7AH,#0AH ;放入"熄灭符"数据MOV TMOD,#11H ;设T0、T1为16位定时器MOV TL0,#0B0H ;50MS定时初值(T0计时用)MOV TH0,#3CH ;50MS定时初值MOV TL1,#0B0H ;50MS定时初值(T1闪烁定时用)MOV TH1,#3CH ;50MS定时初值SETB EA ;总中断开放SETB ET0 ;允许T0中断SETB TR0 ;开启T0定时器MOV R4,#14H ;1秒定时用初值(50M S×20)START1: LCALL DISPLAY ;调用显示子程序JNB P3.7,SETMM1 ;P3.7口为0时转时间调整程序SJMP START1 ;P3.7口为1时跳回START1 SETMM1: LJMP SETMM ;转到时间调整程序SETMM; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; 1秒计时程序 ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;T0中断服务程序INTT0: PUSH ACC ;累加器入栈保护PUSH PSW ;状态字入栈保护CLR TR0 ;关闭定时器T0MOV A,#0B7H ;中断响应时间同步修正ADD A,TL0 ;低8位初值修正MOV TL0,A ;重装初值(低8位修正值)MOV A,#3CH ;高8位初值修正ADDC A,TH0 ;MOV TH0,A ;重装初值(高8位修正值)SETB TR0 ;开启定时器T0DJNZ R4, OUTT0 ;20次中断未到中断退出ADDSS: MOV R4,#14H ;20次中断到(1秒)重赋初值MOV R0,#71H ;指向秒计时单元(71H-72H)ACALL ADD1 ;调用加1程序(加1秒操作)MOV A,R3 ;秒数据放入A(R3为2位十进制数组合)CLR C ;清进位标志CJNE A,#60H,ADDMM ;ADDMM: JC OUTT0 ;小于60秒时中断退出ACALL CLR0 ;大于或等于60秒时对秒计时单元清0MOV R0,#77H ;指向分计时单元(76H-77H)ACALL ADD1 ;分计时单元加1分钟MOV A,R3 ;分数据放入ACLR C ;清进位标志CJNE A,#60H,ADDHH ;ADDHH: JC OUTT0 ;小于60分时中断退出ACALL CLR0 ;大于或等于60分时分计时单元清0MOV R0,#79H ;指向小时计时单(78H-79H)ACALL ADD1 ;小时计时单元加1小时MOV A,R3 ;时数据放入ACLR C ;清进位标志CJNE A,#24H,HOUR ;HOUR: JC OUTT0 ;小于24小时中断退出ACALL CLR0 ;大于或等于24小时小时计时单元清0OUTT0: MOV 72H,76H ;中断退出时将分、时计时单元数据移MOV 73H,77H ;入对应显示单元MOV 74H,78H ;MOV 75H,79H ;POP PSW ;恢复状态字(出栈)POP ACC ;恢复累加器RETI ;中断返回; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 闪动调时程序 ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;T1中断服务程序,用作时间调整时调整单元闪烁指示INTT1: PUSH ACC ;中断现场保护PUSH PSW ;MOV TL1, #0B0H ;装定时器T1定时初值MOV TH1, #3CH ;DJNZ R2,INTT1OUT ;0.3秒未到退出中断(50MS中断6次)MOV R2,#06H ;重装0.3秒定时用初值CPL 02H ;0.3秒定时到对闪烁标志取反JB 02H,FLASH1 ;02H位为1时显示单元"熄灭"MOV 72H,76H ;02H位为0时正常显示MOV 73H,77H ;MOV 74H,78H ;MOV 75H,79H ;INTT1OUT: POP PSW ;恢复现场POP ACC ;RETI ;中断退出FLASH1: JB 01H,FLASH2 ;01H位为1时,转小时熄灭控制MOV 72H,7AH ;01H位为0时,"熄灭符"数据放入分MOV 73H,7AH ;显示单元(72H-73H),将不显示分数据MOV 74H,78H ;MOV 75H,79H ;AJMP INTT1OUT ;转中断退出FLASH2: MOV 72H,76H ;01H位为1时,"熄灭符"数据放入小时MOV 73H,77H ;显示单元(74H-75H),小时数据将不显示MOV 74H,7AH ;MOV 75H,7AH ;AJMP INTT1OUT ;转中断退出; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 加1子程序 ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ADD1: MOV A,@R0 ;取当前计时单元数据到ADEC R0 ;指向前一地址SWAP A ;A中数据高四位与低四位交换ORL A,@R0 ;前一地址中数据放入A中低四位ADD A,#01H ;A加1操作DA A ;十进制调整MOV R3,A ;移入R3寄存器ANL A,#0FH ;高四位变0MOV @R0,A ;放回前一地址单元MOV A,R3 ;取回R3中暂存数据INC R0 ;指向当前地址单元SWAP A ;A中数据高四位与低四位交换ANL A,#0FH ;高四位变0MOV @R0,A ;数据放入当削地址单元中RET ;子程序返回; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 清零程序 ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;............. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 时钟调整程序 ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;当调时按键按下时进入此程序SETMM: cLR ET0 ;关定时器T0中断CLR TR0 ;关闭定时器T0LCALL DL1S ;调用1秒延时程序JB P3.7,CLOSEDIS ;键按下时间小于1秒,关闭显示(省电)MOV R2,#06H ;进入调时状态,赋闪烁定时初值SETB ET1 ;允许T1中断SETB TR1 ;开启定时器T1SET2: JNB P3.7,SET1 ;P3.7口为0(键未释放),等待SETB 00H ;键释放,分调整闪烁标志置1SET4: JB P3.7,SET3 ;等待键按下LCALL DL05S ;有键按下,延时0.5秒JNB P3.7,SETHH ;按下时间大于0.5秒转调小时状态MOV R0,#77H ;按下时间小于0.5秒加1分钟操作LCALL ADD1 ;调用加1子程序MOV A,R3 ;取调整单元数据CLR C ;清进位标志CJNE A,#60H,HHH ;调整单元数据与60比较HHH: JC SET4 ;调整单元数据小于60转SET4循环LCALL CLR0 ;调整单元数据大于或等于60时清0CLR C ;清进位标志AJMP SET4 ;跳转到SET4循环CLOSEDIS: SETB ET0 ;省电(LED不显示)状态。
在CRT上模拟数字钟(参考)

4数字钟汇编语言程序------------------------------------------------------------------6
(2)电路设计及元器件选择
1)振荡电路与分频电路:根据要求,振荡电路应选择晶体振荡电路。晶体XTAL的频率选为32768HZ。该元件专为数字钟电路而设计,其频率较低,有利于减少分频器级数。由于CMOS电路的输入阻抗极高,因此反馈电阻R1可选为10MΩ。较高的反馈电阻有利于提高振荡频率的稳定性。由于晶体振荡器输出频率为32768HZ,为了得到1HZ的秒信号输入,需要对振荡器的输出信号进行15级2进制分频。
MOV P1,A
LCALL DELAY1
(五)
设计小结
(六)
设计感想
(七)
参考文献
FLASH:INC R0
INC R1
DJNZ R2, FLASH1
MOV TH0,#0ECH
MOV TL0,#78H
POP PSW
POP ACC
SETB ET0
SETB TR0
SETB EA
RETI
DELAY1:MOV R3,#02H
(二)
数字钟的设计与制作
4)译码驱动及显示单元
计数器实现了对时间的累计以8421BCD码形式输出,为了将计数器输出的8421BCD码显示出来,需用显示译码电路将计数器的输出数码转换为数码显示器件所需要的输出逻辑和一定的电流,一般这种译码器通常称为7段译码显示驱动器。
常用的7段译码显示驱动器有CD4511。
使用C#模拟时钟表的一种简单制作方法

21 钟 表 的 各 控 件 属 性 的 设 置 .时
GDI 是 Mirsf的新 . ETF a w r 类 库 用 于 图形 编 程 , + coo t N rme ok 因 为 它是 . TFa wok ~部 分 , 以 也 是 面对 对 象 的 NE rme r 的 所
12 备 环 境 和 对 象 .设
一
对 于《 程 序设 计 》 程 的 教 学 , 师 应 采 用 “ 传 统 的 教 C 课 教 将 学方 式 与 多 媒 体 教 学 相 结 合 ” 的授 课 方 式 。在 教 学 过 程 中 , 教 师 应 有 选 择 地 使 用 多 媒 体 教 学 : 于 课 程 中 的语 句 、 法 、 对 语 语 规等基础知识 , 用多媒体教学 , 少板 书时间 , 运 减 以增 加 信 息 量 的传 授 : 样 , 于课 程 中 抽 象 性 较 强 和 难 以理 解 的 内容 , 同 对 如 指针 、 函数 的参 数 传 递 和 程 序 的流 程 等 , 使 用 多 媒 体 教 学 也 并 针 对 教 学 内容 进行 形 象 生 动 的 演 示 ,这 样 既 有 利 于 学 生 的 理 解 , 能 节 省 讲 授 时 间 , 到 事 半 功 倍 的 作 用 : 对 于 多 媒 又 起 而 体 教 学 不 易 实 施 的 程 序设 计 方 法 的 讲 解 ,则 采 用 传 统 的 教 学 方 式 , 行 课 堂 讨 论 、 书讲 解 结 合 提 问 . 问 题 层 层 剖 析 、 进 板 将 层 层 深 人 , 学 生 充 分 地 参 与 , 步 一 步 地 写 出 算 法 的 表 示 及 其 让 一 演 变 过 程 。 教 师 应 教会 学 生 如 何思 考 、 理 , 何 用 语 句 实 现 推 如
python 时钟 指针的转动逻辑

Python 时钟指针的转动逻辑在编程中,时钟是一个常见的应用场景。
我们可以使用Python编写程序来模拟时钟指针的运动逻辑。
本文将介绍如何使用Python实现时钟指针的转动逻辑,并提供一个完整的代码示例。
1. 确定时钟指针的基本概念在开始编写代码之前,首先需要明确时钟指针的基本概念。
一个传统的时钟通常有三个指针:小时指针、分钟指针和秒钟指针。
它们分别用于表示当前时间的小时、分钟和秒数。
•小时指针:每小时走过360°,即每分钟走过0.5°。
•分钟指针:每小时走过360°,即每分钟走过6°。
•秒钟指针:每分钟走过360°,即每秒钟走过6°。
2. 导入必要的模块在编写代码之前,我们需要导入Python中与时间相关的模块。
这些模块将帮助我们获取当前时间并计算各个指针应该转动的角度。
import datetimeimport time3. 获取当前时间接下来,我们可以使用datetime模块获取当前时间,并将其存储在一个变量中。
然后,我们可以使用该变量来计算各个指针应该转动的角度。
now = datetime.datetime.now()4. 计算指针的角度根据上面的基本概念,我们可以计算小时、分钟和秒钟指针应该转动的角度。
下面是一个示例函数,用于计算指定时间的小时、分钟和秒钟指针的角度。
def calculate_angles(time):hour_angle = (time.hour % 12 + time.minute / 60) * 30minute_angle = (time.minute + time.second / 60) * 6second_angle = time.second * 6return hour_angle, minute_angle, second_angle5. 指针转动逻辑现在我们可以编写一个主函数来模拟时钟指针的转动逻辑。
STM32实现万年历..

STM32学习笔记一竹天笑实现的功能:1、日历功能。
2、数字和模拟时钟功能。
图1(为LCD截屏保存在SD卡中的图像)最终界面如下,但还存在不少漏洞。
1、没有更改时间的设置;2、只有节气显示没有节假日显示3、背景不是用uCGUI画的,是在PS中画好然后存在SD卡中,然后显示的BMP 格式图像。
要点分析:1、STM32自带了RTC时钟计数器,从0开始计数到232。
每一个计数代表秒计数,每六十个计数代表分计数,以此类推。
24(小时)*60(分钟)*60(秒钟)=86400代表一天的计数时间。
假设当前计数为count,count/86400得到计数的天数,根据这个得到年月日。
Count%86400得到时分秒。
2、一些根据1中得到的年月日时分秒,进行计算的程序有:阳历转阴历,闰年判断,节气判断,星期几计算,当前月有多少天等等。
3、模拟时钟的绘制:时钟指针运动算法、屏幕重绘方法、RTC消息、画笔/画刷等。
指针运动算法和屏幕重绘方法是本程序主要难点所在。
(以下参照百度文库之模拟时钟)不论何种指针,每次转动均以π/30弧度(一秒的角度)为基本单位,且都以表盘中心为转动圆心。
计算指针端点(x, y)的公式如下:x =圆心x坐标+ 指针长度* cos (指针方向角)y =圆心y坐标+ 指针长度* sin (指针方向角)注意,指针长度是指自圆心至指针一个端点的长度(是整个指针的一部分),由于指针可能跨越圆心,因此一个指针需要计算两个端点。
由于屏幕的重绘1秒钟一次,如果采用全屏删除式重绘则闪烁十分明显,显示效果不佳。
本程序采用非删除式重绘,假定指针将要移动一格,则先采用背景色(这里是白色)重绘原来指针以删除原来位置的指针,再采用指针的颜色在当前位置绘制指针(如果指针没有动,则直接绘制指针,此句在程序中被我删除,具体原因,为数据截断导致一些误差)。
另外,秒表为RTC一秒钟定时计数。
程序分析:uCGUI+uCOS,一共三个任务:主处理任务、触摸屏任务、秒更新任务。
vc编写一个模拟时钟的程序(VC write an analog clock program)

vc编写一个模拟时钟的程序(VC write an analog clock program)I'm sorry, my program is too big, 4M, because there are other functionsNo way. Towel section proceduresVoid CFill_areaView:: myShowColok (CDC, *pDC){M_time=CTime:: GetCurrentTime ();PDC->FillRect (&CRect (0,0, rect.Width (), rect.Height ()), &CBrush (RGB (100100100));CBrush brush (RGB (150150150));CBrush *oldbrush=pDC->SelectObject (&brush);CPen pen (PS_SOLID, 3, RGB (0,0,0));CPen *oldpen=pDC->SelectObject (&pen);PDC->Ellipse (rect.Width (), /2- (rect.Height ()), /2, rect.Height () (/2-10 ()), /2- (rect.Height ()), /2, rect.Width (), /2+ (rect.Height ()), /2, rect.Height () (&CRect (), /2+ (rect.Height ()), /2-10 (/2-10) /2) /2-10 ());PDC->Ellipse (&CRect (rect.Width ()), /2-3, rect.Height (), /2-3, rect.Width (), /2+3, rect.Height () /2+3);CPen PEN2 (PS_SOLID, 7, RGB (0,0,0));PDC->SelectObject (&pen2);PDC->MoveTo (rect.Width (), /2, rect.Height (), /2-16* (rect.Height (), /2-10) /20);PDC->LineTo (rect.Width (), /2-15* (rect.Height ()), /20, rect.Height (), /2-6* (rect.Height ()) /2-10) /20 (/2-10);PDC->LineTo (rect.Width (), /2-15* (rect.Height ()), /20, rect.Height (), /2+12* (rect.Height ()) /2-10) /20 (/2-10);PDC->LineTo (rect.Width (), /2+15* (rect.Height ()), /20, rect.Height (), /2+12* (rect.Height ()) /2-10) /20 (/2-10);PDC->LineTo (rect.Width (), /2+15* (rect.Height ()), /20, rect.Height (), /2-6* (rect.Height ()) /2-10) /20 (/2-10);PDC->LineTo (rect.Width (), /2, rect.Height (), /2-16* (rect.Height (), /2-10) /20);PDC->MoveTo (rect.Width (), /2-15* (rect.Height ()), /20+25, rect.Height (), /2+12* (rect.Height ()) /2-10) /20 (/2-10);PDC->LineTo (rect.Width (), /2-15* (rect.Height ()), /20+25, rect.Height (), /2+12* (rect.Height ()) /2-10) /20+30 (/2-10);PDC->LineTo (rect.Width (), /2-15* (rect.Height ()), /20+25+40, rect.Height (), /2+12* (rect.Height ()) /2-10) /20+30 (/2-10);PDC->LineTo (rect.Width (), /2-15* (rect.Height ()), /20+25+40, rect.Height (), /2+12* (rect.Height ()) /2-10) /20 (/2-10);PDC->MoveTo (rect.Width (), /2+15* (rect.Height ()), /20-25, rect.Height (), /2+12* (rect.Height ()) /2-10) /20 (/2-10);PDC->LineTo (rect.Width (), /2+15* (rect.Height ()), /20-25, rect.Height (), /2+12* (rect.Height ()) /2-10) /20+30 (/2-10);PDC->LineTo (rect.Width (), /2+15* (rect.Height ()), /20-25-40, rect.Height (), /2+12* (rect.Height ()) /2-10) /20+30 (/2-10);PDC->LineTo (rect.Width (), /2+15* (rect.Height ()), /20-25-40, rect.Height (), /2+12* (rect.Height ()) /2-10) /20 (/2-10);CPen pen1 (PS_SOLID, 1, RGB (0,0,0));PDC->SelectObject (&pen1);Double alpha=0;MyPoint, P1, P2, p3;P1=m_pointColok[0], p2=m_pointColok[4], p3=m_pointColok[5];For (int i=0; i<=60; i++){Alpha=i*6*pi/180;P1.x=m_pointColok[0].x*cos (alpha) -m_pointColok[0].y*sin (alpha);P1.y=m_pointColok[0].x*sin (alpha) +m_pointColok[0].y*cos (alpha);PDC->MoveTo (ChangePoint (P1).X, ChangePoint (P1).Y);P2.x=m_pointColok[4].x*cos (alpha) -m_pointColok[4].y*sin (alpha);P2.y=m_pointColok[4].x*sin (alpha) +m_pointColok[4].y*cos (alpha);P3.x=m_pointColok[5].x*cos (alpha) -m_pointColok[5].y*sin (alpha);P3.y=m_pointColok[5].x*sin (alpha) +m_pointColok[5].y*cos (alpha);If (i%5==0)PDC->LineTo (ChangePoint (P2).X, ChangePoint (P2).Y);ElsePDC->LineTo (ChangePoint (P3).X, ChangePoint (P3).Y);PDC->SetBkMode (TRANSPARENT);CFont font;Font.CreateFont (16,12,0,0, FW_NORMAL),假,假,假,ansi_charset,out_default_precis,clip_default_precis,default_quality,default_pitch | ff_swiss,“Arial”);CFont * oldfont = PDC -> SelectObject(与字体);/ /改变字体PDC -> SetTextColor(RGB(255205100));PDC -> TextOut(矩形。
模拟时钟程序

//1.程序与处理;#include<iostream.h>#include<bios.h>#include<dos.h>#include<conio.h>#define LEFT 0x4b00#define RIGHT 0x4d00#define DOWN 0x5000#define UP 0x4800#define PAGEUP 0x4900#define PAGEDOWN 0x5100#define QLOWER 0x1071#define QUPPER 0x1051#define SPACE 0x3920#define ESC 0x011bstruct Date sysTime;int currentY ear;int currentMonth;int currentDay;int n_currentMon;int n_lastMon;void checkDate();int isleapyear(int year);int getWeek(int year,int month,int day);void printSpace(int n);void printseparator();void printUsage();void printWeek();void printWeek2(int week);void showCalendar(int year,int month,int day);void getKeyV alue();//2.功能控制模快void checkDate(){if(currentY ear<=0){gotoxy(1,27);printf("The year should be a positive number!\n");gotoxy(1,28);printf("press any key to continue......");getchar();getchar();currentY ear=sysTime.da_year;currentMonth=sysTime.da_mon;currentDay=sysTime.da_day;}if(currentMonth>12||currentMonth<1){gotoxy(1,27);printf("The month should be a number between 1 and 12!\n");gotoxy(1,28);printf("please press any key to continue.......");getchar();getchar();currentY ear=sysTime.da_Y ear;currentMonth=sysTime.da_mon;currentDay=sysTime.da_day;}if(currentDay>31||currentDay<1){printf("The day should be a number between 1 and 31!\n");printf("please press any key to continue.......");getchar();getchar();currentY ear=sysTime.da_Y ear;currentMonth=sysTime.da_mon;currentDay=sysTime.da_day;}}int isLeapYear(int year){if(year%4==0&&year%100||year%400==0)return 1;else return 0;}int getweek(int year,int month,int day){int leapFlag;int week;int i;int a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};int count=0;if(leapFlag==1)a[2]++;for(i=1;i<month;i++){count+=a[i];}count+=day;week=(year+1+(year-1)/4+(year-1)/100+(year-1)/40 0+count)%7;return week;}//3.打印输出模块void printSpace(int n){int i;for(i=0;i<n;i++)printf(" ");}void printfSeparator(){int i;for(i=0;i<38;i++)printf("=");printf("\n");}void printUsage(){printf("------------Usage------------");printf("YEAR");printf("UP key()to increase;\n");printf("DOWN key()to increase;\n");printf("Month");printf("Right key()to increase;\n");printf("UP key()to decrease.\n");printf("Query");printf("Q/q key\n");printf("Reset");printf(". Space key.\n");printf("Exit");printf("Esc key\n");}void printWeek(){int day;day=getWeek(currentY ear,currentMonth,currentDay );if(day==0)printf("%d-%d-%d,Sunday!",currentY ear,currentMo nth,currentDay);if(day==1)printf("%d-%d-%d,Monday!",currentY ear,currentM onth,currentDay);if(day==2)printf("%d-%d-%d,Tuesday!",currentY ear,currentM onth,currentDay);if(day==3)printf("%d-%d-%d,Wednesday!",currentY ear,curren tMonth,currentDay);if(day==4)printf("%d-%d-%d,Thursday!",currentY ear,current Month,currentDay);if(day==5)printf("%d-%d-%d,Friday!",currentY ear,currentMo nth,currentDay);if(day==6)printf("%d-%d-%d,Saturday!",currentY ear,current Month,currentDay);}void printWeek2(int week){if(week==0)printf(",Sunday");if(week==1)printf(",Monday");if(week==2)printf(",Tuesday");if(week==3)printf(",Wendesday");f(week==4)printf(",Thursday");if(week==5)printf(",Friday");if(week==6)printf(",Staturday");}//4.日历显示模块void showCalendar(int year,int month,int day){int i,int j;int outDay;int leapFlag;int dayLastMon;int week;int a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};outDay=0;dayLastMon=0;week=0;leapFlag=isleapyear(year);if(leapFlag==1){a[2]++;}if(day<a[month]){printf("The number of this month's day is %d at most!\n",a[month]);getchar();getchar();year=sysTime.da_year;month=sysTime.da_mon;day=sysTime.da_day;currentY ear=sysTime.da_year;currentMonth=sysTime.da_mon;currentDay=sysTime.da_day;}n_lastmon=a[month-1];n_currentmon=a[month];clarscr();printf("\nThe calendar of %d",year);textcolor(10);if(leapFlag==1)printf("[leap year]",year);textcolor(10);if(leapFlag==0)printf("[not leap year]",year);printf("\n");textcolor(7);printfSeparator();textcolor(YELLOW);switch(month){case 1:printf("January 1");break;case 2:printf("February 2");break;case 3:printf("Marth 3");break;case 4:printf("April 4");break;case 5:printf("May 5");break;case 6:printf("June 6");break;case 7:printf("July 7");break;case 8:printf("August 8");break;case 9:printf("September 9");break;case 10:printf("October 10");break;case 11:printf("November 11");break;case 12:printf("December 12");break;}textcolor(7);printf("\n\n");textcolor(13);printf("Sun Mon Tue Wed Thu Fri Sat"); textcolor(7);printf("\n\n");for(i=0;i<6;i++){if(i==0){printSpace(dayLastMon*4);for(j=0;j<7-dayLastMon;j++)if(outday==day-1){textcolor(YELLOW);printf("[%d]",++outDay);textcolor(7);}else if(outDay==day&&week!=0){printf("%3d",++outDay);}else{Printf("%4d",++outDay);}week=(week<6)?week+1:0;}printf("\n\n");}else{for(j=0;j<7;j++){if(outday<a[month]){if(outday==day-1){if(outday<9){printf("[%d]",++outday);}else{printf("[%2d]",++outday);}}else if(outday==day&&week!=0){printf("[%3d]",++outday);}}week=(week<6)?week+1:0;}printf("\n\n");if(outday==a[month])break;}printfSeparator();printf("The day you choose is:\n\n");printWeek();printf("-------------\n");printf("\nTodayis:%d-%d-%d",sysTime.da_year,sysTime.da_mon,sysTi me.da_day);printWeek2(getWeek(sysTime.da_year,sysTime.da_ mon,sysTime.da_day));printf("\n\n");printUsage();}//5.键值获取模块;void getkeyvalue(){int key;char ch;currentY ear=sysTime.da_year;currentMonth=sysTime.da_mon;currentDay=sysTime.da_day;showCalendar(currentY ear,currentMonth,currentDa y);while(1)key=bioskey(0);if(key==RIGHT){if(currentMonth==12){currentY ear++;currentMonth=1;}elsecurrentMonth++;}if(key==LEFT){if(currentMonth==1){currentY ear--;currentMonth=12;}elsecurrentMonth--;}if(key==UP){currentY ear--;}if(key==DOWN){currentY ear++;}if(key==PAGEDOWN){if(currentDay!=n_currentDay){currentDay++;}if(currentDay==n_currentDay&¤tMonth!=1 2){currentMonth++;currentDay=1;}else{currentY ear++;currentMonth=1;currentDay=1;}}if(key==PAGEDOUP){if(currentDay!=1){currentDay--;}else if(currentDay==1&¤tMonth==1){currentY ear--;currentMonth=12;currentDay=31;}else{currentMonth--;currentDay=n_lastMonth;}}if(key==QLOWER||QUPPER){printf("Inputdate(eg,%d-%d-%d):",sysTime.da_year,sysTime.da_mon ,sysTime.da_day);scanf("%d-%d-%d",¤tY ear,¤tMonth, ¤tDay);checkDate();}if(key==SPACE){currentY ear=sysTime.da_year;currentMonth=sysTime.da_mon;currentDay=sysTime.da_day;}if(key==ESC){printf("Do you really want to quit?(Y/N)");ch=getchar();if(ch=='y'||ch=='Y')break;}showCalendar(currentY ear,currentMonth,currentDa y);}//6.主函数void main(){getdate(&sysTime);getKeyV alue();}基本要求:1.自行设计界面,要求用户输入要查询的日期,年份在1980~2099之间,按ESC程序结束。
ds3231程序

d s3231程序(共10页)--本页仅作为文档封面,使用时请直接删除即可----内页可以根据需求调整合适字体及大小--#include <>#include <>#define uchar unsigned char#define uint unsigned intsbit SDA=P3^6; //模拟I2C数据传送位SDA sbit SCL=P3^7; //模拟I2C时钟控制位SCL//sbit INT=P3^2;//sbit RESET=P3^3;sbit led0=P1^0;sbit led1=P1^1;sbit led2=P1^2;sbit led3=P1^3;sbit led4=P1^4;sbit led5=P1^5;sbit led6=P1^6;sbit led7=P1^7;bit ack; //应答标志位#define DS3231_WriteAddress 0xD0 //器件写地址#define DS3231_ReadAddress 0xD1 //器件读地址#define DS3231_SECOND 0x00 //秒#define DS3231_MINUTE 0x01 //分#define DS3231_HOUR 0x02 //时#define DS3231_WEEK 0x03 //星期#define DS3231_DAY 0x04 //日#define DS3231_MONTH 0x05 //月#define DS3231_YEAR 0x06 //年//闹铃1#define DS3231_SALARM1ECOND 0x07 //秒#define DS3231_ALARM1MINUTE 0x08 //分#define DS3231_ALARM1HOUR 0x09 //时#define DS3231_ALARM1WEEK 0x0A //星期/日//闹铃2#define DS3231_ALARM2MINUTE 0x0b //分#define DS3231_ALARM2HOUR 0x0c //时#define DS3231_ALARM2WEEK 0x0d //星期/日#define DS3231_CONTROL 0x0e //控制寄存器#define DS3231_STATUS 0x0f //状态寄存器#define BSY 2 //忙#define OSF 7 //振荡器停止标志#define DS3231_XTAL 0x10 //晶体老化寄存器#define DS3231_TEMPERATUREH 0x11 //温度寄存器高字节(8位)#define DS3231_TEMPERATUREL 0x12 //温度寄存器低字节(高2位) uchar code dis_code[11]={0xc0,0xf9,0xa4,0xb0, // 0,1,2,30x99,0x92,0x82,0xf8,0x80,0x90, 0xff}; // 4,5,6,7,8,9,off uchar data dis_buf[8];uchar data dis_index;uchar data dis_digit;uchar BCD2HEX(uchar val) //BCD转换为Byte{uchar temp;temp=val&0x0f;val>>=4;val&=0x0f;val*=10;temp+=val;return temp;}uchar HEX2BCD(uchar val) //B码转换为BCD码{uchar i,j,k;i=val/10;j=val;k=j+(i<<4);return k;}void delayus(uint us){while (us--);}void Start_I2C(){SDA=1; //发送起始条件的数据信号delayus(1);SCL=1;delayus(5); //起始条件建立时间大于,延时SDA=0; //发送起始信号delayus(5); // 起始条件锁定时间大于4μsSCL=0; //钳住I2C总线,准备发送或接收数据delayus(2);}void Stop_I2C(){SDA=0; //发送结束条件的数据信号delayus(1); //发送结束条件的时钟信号SCL=1; //结束条件建立时间大于4usdelayus(5);SDA=1; //发送I2C总线结束信号delayus(4);}void SendByte(uchar c){uchar BitCnt;for(BitCnt=0;BitCnt<8;BitCnt++) //要传送的数据长度为8位{if((c<<BitCnt)&0x80)SDA=1; //判断发送位elseSDA=0;delayus(1);SCL=1; //置时钟线为高,通知被控器开始接收数据位 delayus(5); //保证时钟高电平周期大于4μsSCL=0;}delayus(2);SDA=1; //8位发送完后释放数据线,准备接收应答位 delayus(2);SCL=1;delayus(3);if(SDA==1)ack=0;elseack=1; //判断是否接收到应答信号SCL=0;delayus(2);}uchar RcvByte(){uchar retc;uchar BitCnt;retc=0;SDA=1; //置数据线为输入方式for(BitCnt=0;BitCnt<8;BitCnt++){delayus(1);SCL=0; //置时钟线为低,准备接收数据位delayus(5); //时钟低电平周期大于μsSCL=1; //置时钟线为高使数据线上数据有效delayus(3);retc=retc<<1;if(SDA==1)retc=retc+1; //读数据位,接收的数据位放入retc中 delayus(2);}SCL=0;delayus(2);return(retc);}void Ack_I2C(bit a){if(a==0)SDA=0; //在此发出应答或非应答信号elseSDA=1;delayus(3);SCL=1;delayus(5); //时钟低电平周期大于4μsSCL=0; //清时钟线,钳住I2C总线以便继续接收delayus(2);}uchar write_byte(uchar addr, uchar write_data) {Start_I2C();SendByte(DS3231_WriteAddress);if (ack == 0)return 0;SendByte(addr);if (ack == 0)return 0;SendByte(write_data);if (ack == 0)return 0;Stop_I2C();delayus(10);return 1;}uchar read_current(){uchar read_data;Start_I2C();SendByte(DS3231_ReadAddress);if(ack==0)return(0);read_data = RcvByte();Ack_I2C(1);Stop_I2C();return read_data;}uchar read_random(uchar random_addr){Start_I2C();SendByte(DS3231_WriteAddress);if(ack==0)return(0);SendByte(random_addr);if(ack==0)return(0);return(read_current());}void ModifyTime(uchar yea,uchar mon,uchar da,uchar hou,uchar min,uchar sec) {uchar temp=0;temp=HEX2BCD(yea);write_byte(DS3231_YEAR,temp); //修改年temp=HEX2BCD(mon);write_byte(DS3231_MONTH,temp); //修改月temp=HEX2BCD(da);write_byte(DS3231_DAY,temp); //修改日temp=HEX2BCD(hou);write_byte(DS3231_HOUR,temp); //修改时temp=HEX2BCD(min);write_byte(DS3231_MINUTE,temp); //修改分temp=HEX2BCD(sec);write_byte(DS3231_SECOND,temp); //修改秒}void TimeDisplay(uchar Dhour,uchar Dmin,uchar Dsec){dis_buf[7]=dis_code[Dhour / 10]; // 时十位dis_buf[6]=dis_code[Dhour % 10]; // 时个位dis_buf[4]=dis_code[Dmin / 10]; // 分十位dis_buf[3]=dis_code[Dmin % 10]; // 分个位dis_buf[1]=dis_code[Dsec / 10]; // 秒十位dis_buf[0]=dis_code[Dsec % 10]; // 秒个位dis_buf[2]=0xbf; // 显示"-"dis_buf[5]=0xbf;}void DateDisplay(uchar Dyear,uchar Dmonth,uchar Dday){dis_buf[7]=dis_code[Dyear / 10]; // 年十位dis_buf[6]=dis_code[Dyear % 10]; // 年个位dis_buf[4]=dis_code[Dmonth / 10]; // 月十位dis_buf[3]=dis_code[Dmonth % 10]; // 月个位dis_buf[1]=dis_code[Dday / 10]; // 天十位dis_buf[0]=dis_code[Dday % 10]; // 天个位dis_buf[2]=0xbf; // 显示"-"dis_buf[5]=0xbf;}void get_show_time(void){uchar Htemp1,Htemp2,Mtemp1,Mtemp2,Stemp1,Stemp2; Htemp1=read_random(DS3231_HOUR); //时 24小时制 Htemp1&=0x3f;Htemp2=BCD2HEX(Htemp1);Mtemp1=read_random(DS3231_MINUTE); //分Mtemp2=BCD2HEX(Mtemp1);Stemp1=read_random(DS3231_SECOND); //秒Stemp2=BCD2HEX(Stemp1);TimeDisplay(Htemp2,Mtemp2,Stemp2);}void get_show_date(void){uchar Ytemp1,Ytemp2,Mtemp1,Mtemp2,Dtemp1,Dtemp2; Ytemp1=read_random(DS3231_YEAR); //年Ytemp2=BCD2HEX(Ytemp1);Mtemp1=read_random(DS3231_MONTH); //月Mtemp2=BCD2HEX(Mtemp1);Dtemp1=read_random(DS3231_DAY); //日Dtemp2=BCD2HEX(Dtemp1);DateDisplay(Ytemp2,Mtemp2,Dtemp2);}void get_show_Temperature(void){uchar Ttemp1,Ttemp2,Ttemp3,Ttemp4;Ttemp1=read_random(DS3231_TEMPERATUREH); //温度高字节Ttemp2=BCD2HEX(Ttemp1);Ttemp3=read_random(DS3231_TEMPERATUREL); //温度低字节Ttemp4=BCD2HEX(Ttemp3);DateDisplay(0,Ttemp2,Ttemp4);}void timer0() interrupt 1{TH0=0xFC;TL0=0x17;P2=0xff; // 先关闭所有数码管P0=dis_buf[dis_index]; // 显示代码传送到P0口P2=dis_digit;if (dis_digit & 0x80)dis_digit=(dis_digit << 1) | 0x1;elsedis_digit=(dis_digit << 1);dis_index++;dis_index&=0x07; // 8个数码管全部扫描完一遍之后,再回到第一个开始下一次扫描}void main(){uint ii = 0;// RESET=0x1; //DS3231复位操作,正常操作下不需要每次都复位 delayus(5000);led0=0;led1=0;led2=0;led3=0;led4=0;P0=0xff;P2=0xff;dis_digit=0xfe;dis_index=0;TimeDisplay(12, 5, 18);TMOD=0x11; // 定时器0, 1工作模式1, 16位定时方式TH0=0xFC;TL0=0x17;TCON=0x01;IE=0x82; // 使能timer0,1 中断TR0=1;if (write_byte(DS3231_CONTROL, 0x1C) == 0)led0=1;if (write_byte(DS3231_STATUS, 0x00) == 0)led1=1;// ModifyTime(15,9,23,00,00,00); //初始化时钟,2010/6/13,15/30/00 //小时采用24小时制while(1){//get_show_date(); //显示日期//get_show_Temperature(); //显示温度get_show_time(); //显示时间delayus(50000);}}11。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
东南大学C语言课程设计报告课程名称:计算机综合课程设计学院:土木工程学院设计题目:模拟时钟转动程序级别:B级学生姓名:韦信丞学号:05114419同组学生:学号:指导教师:郭恒宁2015年9 月1 日C语言课程设计任务书模拟时钟转动程序一、课程设计的内容1、能模拟机械钟表行走2、还要准确利用数字显示日期和时间3、在屏幕上显示一个活动时钟4、按任意键时程序退出。
二、课程设计应完成的工作1、编写完成相应题目的程序2、编写课程设计报告,课程设计报告应该包含以下6部分1)需求分析:包括设计题目、设计要求以及系统功能需求分析2)总体设计:包括系统总体设计框架和系统功能模块图3)详细设计:包括主要功能模块的算法设计思路以及对应的工作流程图4)调试分析过程描述:包括测试数据、测试输出结果以及对程序测试过程中存在问题进行思考(主要问题的出错现象、出错原因、解决方法及其效果等,相应效果截图)5)总结:课程设计完成了哪些主要功能,是否有扩展功能?还有哪些地方需要改进?课程设计的学习与体会?有哪些合理化建议?6)附录:主要原程序代码含必要的注释3、答辩:在实验室建立程序运行环境,并在指导教师的监督下,独立解决问题,运行程序和回答教师的提问。
四、应收集的资料及其主要参考文献[1]谭浩强.C程序设计(第四版),北京:清华大学出版社,2010年6月[2]陈清华朱红 . C语言课程设计案例精选与编程指导(第一版),南京:东南大学出版社,2003年6月[3]顾小晶 . 实用C语言简明教程(第一版),北京:中国电力出版社,2003年9月目录1.设计目的与要求 (4)2.总体设计 (5)3.详细设计 (6)3.1画出钟表的轮廓3.2获取系统时间4.调试分析 (7)5.总结 (10)6.附录(程序) (11)7.答辩记录(正文处留出适当空白) (15)8.指导教师意见(正文处留出适当空白) (16)1.目的与要求要求:1、能模拟机械钟表行走2、还要准确利用数字显示日期和时间3、在屏幕上显示一个活动时钟4、按任意键时程序退出。
设计总体要求:➢采用模块化程序设计;➢鼓励可视化编程;➢源程序中应有足够的注释;➢学生可自行增加新功能模块(视情况可另外加分);➢必须上机调试通过;➢注重算法运用,优化存储效率与运算效率;➢需提交源程序(含有注释)及相关文件(数据或数据库文件);(cpp文件、txt或dat文件等)➢提交设计报告书,具体要求见以下说明。
课程设计报告要求:①需求和规格说明:问题描述:题目要解决的问题是什么?②设计⊕设计思路:主要算法思想。
⊕总体设计:程序设计组成框图、N-S流程图。
⊕详细设计:模块功能说明(如函数功能、入口及出口参数说明,函数调用关系描述等)。
③调试与测试:调试过程中遇到的主要问题,是如何解决的;对设计和编码的回顾讨论和分析;改进设想;经验和体会等。
④附录:源程序清单和结果。
如果题目规定了测试数据,则结果要包含这些测试数据和运行输出,当然还可以含其他测试数据和运行输出;清单中应有足够的注释。
2.总体设计首先,先画出个钟的大致轮廓。
从输出数字到画出外轮廓,到标出短线到画出时针、分针、秒针。
这个轮廓就已经完成了。
然后,为了更加这个钟的实用性。
就通过获取系统时间来结合实际意义,这是最简单,最好的方法。
从应用上,它显示的是实际的时间,增强了可用性;从编程上,不用再复杂地再编一个更新时间的函数,减少程序的篇幅、复杂性和编程者的工作量。
接着顺带利用时间的变量名来画时针,分针,秒针。
最后,为了让时针,分针,秒针让观察者看起来是连续的变化,即形象地模拟真实的机械钟表那样运动,就用函数让时针,分针,秒针跟着时间一齐走动。
3.详细设计1. 画出钟表的轮廓:1)钟表的外轮廓circle(320,240,189);circle(320,240,180);2)画出钟内的短线x1=180*sin(i*6*pi/180)+320;y1=180*cos(i*6*pi/180)+240;x2=(180-l)*sin(i*6*pi/180)+320;y2=(180-l)*cos(i*6*pi/180)+240;line(x1,y1,x2,y2);3)画出时针、分针、秒针i=now.sec;j=now.min;k=now.hour;dx3=l3*sin(i*6*pi/180);dy3=l3*cos(i*6*pi/180);dx2=l2*sin(j*6*pi/180+i*6*pi/180/60);dy2=l2*cos(j*6*pi/180+i*6*pi/180/60);dx1=l1*sin(k*pi/6+j*pi/360);dy1=l1*cos(k*pi/6+j*pi/360);line(x1,y1,x1+dx3,y1-dy3);line(x1,y1,x1+dx2,y1-dy2);line(x1,y1,x1+dx1,y1-dy1);2. 获取系统时间:time(&rawtime);t=localtime(&rawtime);now.sec=t->tm_sec;now.min=t->tm_min;now.hour=t->tm_hour;now.year=t->tm_year;now.mon=t->tm_mon;now.day=t->tm_mday;now.week=t->tm_wday;4.调试分析在VC环境中,已经将graphics算法删除了,所以在一开始就发现在编译的时候出现了graphicsh.h头文件无法识别的错误。
我上网查阅了相关回答,得知了安装graphics算法的方法,即通过EasyX插件来安装该头文件。
解决了这个问题,便可以调用图形处理的函数。
再后来,发现书本教程主要面向的是TC环境,所以在获取时间这个问题上,教材运用的是gettime和getdate函数,这两个函数在VC环境下是不能运用的,网上也没有对这两个函数进行补充的安装插件,所以只能从用其他函数代替这个方向着眼解决。
于是我查找了关于VC环境中获取系统时间的函数,发现了需要学习几个知识点,首先是time_t类型,这个类型是一种整型,表示从1900年1月1日0:00:00时(这个知识点是在网上查阅到的,网上写的是1970年1月1日0:00:00,但从运行结果上看是1900年)到当前系统时刻的秒数,用到的函数是time_t time(time_t *)函数,其返回值就是time_t类型,返回值储存到指针所指的地址(或者说直接是一个地址)中。
当然这还不够,还需要将这秒数转化成直观的时间格式,这就用到了struct tm localtime(time_t *rawtime)函数,将time_t类型格式化成struct tm类型(系统预定义了的结构体),再将格式化了的数据传到我自己定义的结构体便于利用,这便解决了在VC环境下获取系统时间的问题。
获取时间问题解决后,就到怎么实现时间的递进,一开始我是想用循环结构,每次循环都将秒加一,然后再编出秒一直到年的递进规则,最后,在每个循环结束时,都将程序暂停执行一秒(VC环境中用的是void Sleep(int millisecond)函数)。
首先这本身就很复杂了,更复杂的还是闰年的确定上。
由于辨别是否是闰年的程序要相当地长,从程序的简便化出发就排除了引入系统自动辨别闰年的程序模块,一开始我考虑的是系统的运行时间不会很长,可以通过程序运行前向用户询问今年是否是闰年。
再后来一想,一个好用的系统,除了功能多样化以外,还需要自动化,所以我一直想解决这个非自动化的缺陷。
后来我一想,为什么一定要自己编写出时间的变化呢?系统本身就是在变化的,为什么不直接利用系统时间的变化来带动程序时间的变化呢?因此,我就将获取系统时间步骤放到了for循环中,这样利用同步直接实现了时间的正确递变。
在改变了思路的时候,我又想到,由于获得的时间的毫秒级数据与程序开始运行时刻有关,这就导致了程序时间与系统时间就有了毫秒级的误差,我就想能否将原来思路中用到的Sleep函数删掉,通过频率很高地获取时间来达到显示精准的时间的目的。
于是我就尝试把’Sleep(1000);’语句删掉,然后运行。
结果令我比较失望,由于系统执行for循环的速度并不很快,就造成了图像显示的频闪,非常不美观,索性就留下了’Sleep(1000);’语句,毫秒级的误差应用上也不需要消除。
还有一个问题是模拟时钟图像的变化问题,即实现简单动画化,刚开始,我想采用的是异或划线法删掉前一秒的图像,即通过’setwritemode(1);’语句设定划线模式,在这个模式下,如果先画了一条曲线,那么再有在相同位置再画一条一模一样的曲线的命令,即完全重合时,那么就是删除这条曲线的意思。
但是实际运行过程中,发现采用了这种变化方法的时分秒针的图像在显示屏上根本没有显示,只有不采用这种方法画出的钟表轮廓得以显示。
(如下图1)我一开始是想继续按这思路解决这个问题的,但是我又想,课题中有数字日历及时钟的显示要求,这种字符串图形通过这种方式是否能清楚呢?最后我决定还是换个方法,决定用cleardevice()函数对整个屏幕图像进行清零,再把所有画图的内容全都放在循环里,果然程序便能顺利正确地运行起来。
(如下图2)图1图2剩下的难题就只剩下数字时钟和日历的显示了,我查阅了教材,输出字符串的函数有两种,一种是void far outtextxy(int x,int y,char *str),还有一种void moveto(int x,int y)搭配void far outtext(char *str),但是是要想实现字符串加上变量的数据输出,就必须通过int sprintf(char *str,char *format,variable-list)先格式化format内容到指针str所指的数组里(该数组要足够大),然后通过上述两个方法输出str所指的数组里的内容,这次问题解决得很顺利,一次就能成功执行该功能。
5.总结在这次模拟时钟转动程序设计中,我遇到了很多困难,通过查资料,向同学、学长、老师请教,才一一得到解决。
我发现平时自学到的知识太少了,“书到用时方恨少”,今后我要把更多时间用在基础学习上,利用课余时间多看课外书籍,拓宽知识面。
C语言的设计必须结合实际,充分考虑界面友好等人性化设置,这就要求我们要多观察,敢创新。
另外上机实验是必不可少的,理论的东西学得再好,不结合实验区验证始终只能停留在理论阶段。
通过此次实战演练,我还学到很重要的一点,就是要虚心请教他人,个人的力量总是有限的,只有发挥众人的智慧才能把任务完成的更好,这在今后的工作中也是相当重要的。