模拟时钟转动程序

合集下载

51单片机作的电子钟程序及电路图

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上模拟数字钟(参考)

在CRT上模拟数字钟(参考)
3数字钟程序流程图---------------------------------------------------------------------5
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#模拟时钟表的一种简单制作方法

使用C#模拟时钟表的一种简单制作方法

21 钟 表 的 各 控 件 属 性 的 设 置 .时
GDI 是 Mirsf的新 . ETF a w r 类 库 用 于 图形 编 程 , + coo t N rme ok 因 为 它是 . TFa wok ~部 分 , 以 也 是 面对 对 象 的 NE rme r 的 所
12 备 环 境 和 对 象 .设

对 于《 程 序设 计 》 程 的 教 学 , 师 应 采 用 “ 传 统 的 教 C 课 教 将 学方 式 与 多 媒 体 教 学 相 结 合 ” 的授 课 方 式 。在 教 学 过 程 中 , 教 师 应 有 选 择 地 使 用 多 媒 体 教 学 : 于 课 程 中 的语 句 、 法 、 对 语 语 规等基础知识 , 用多媒体教学 , 少板 书时间 , 运 减 以增 加 信 息 量 的传 授 : 样 , 于课 程 中 抽 象 性 较 强 和 难 以理 解 的 内容 , 同 对 如 指针 、 函数 的参 数 传 递 和 程 序 的流 程 等 , 使 用 多 媒 体 教 学 也 并 针 对 教 学 内容 进行 形 象 生 动 的 演 示 ,这 样 既 有 利 于 学 生 的 理 解 , 能 节 省 讲 授 时 间 , 到 事 半 功 倍 的 作 用 : 对 于 多 媒 又 起 而 体 教 学 不 易 实 施 的 程 序设 计 方 法 的 讲 解 ,则 采 用 传 统 的 教 学 方 式 , 行 课 堂 讨 论 、 书讲 解 结 合 提 问 . 问 题 层 层 剖 析 、 进 板 将 层 层 深 人 , 学 生 充 分 地 参 与 , 步 一 步 地 写 出 算 法 的 表 示 及 其 让 一 演 变 过 程 。 教 师 应 教会 学 生 如 何思 考 、 理 , 何 用 语 句 实 现 推 如

python 时钟 指针的转动逻辑

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实现万年历..

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)

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&&currentMonth!=1 2){currentMonth++;currentDay=1;}else{currentY ear++;currentMonth=1;currentDay=1;}}if(key==PAGEDOUP){if(currentDay!=1){currentDay--;}else if(currentDay==1&&currentMonth==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",&currentY ear,&currentMonth, &currentDay);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程序

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。

(完整word版)STM32实现万年历..

(完整word版)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,一共三个任务:主处理任务、触摸屏任务、秒更新任务。

计算机图形学基础教程孔令德课后答案

计算机图形学基础教程孔令德课后答案

计算机图形学基础教程孔令德课后答案【篇一:大学计算机图形学课程设】息科学与工程学院课程设计任务书题目:小组成员:巴春华、焦国栋成员学号:专业班级:计算机科学与技术、2009级本2班课程:计算机图形学指导教师:燕孝飞职称:讲师完成时间: 2011年12 月----2011年 12 月枣庄学院信息科学与工程学院制2011年12 月20日课程设计任务书及成绩评定12【篇二:计算机动画】第一篇《计算机图形学》小结《计算机图形学》第一章:从计算机的辅助设计,艺术,和虚拟现实技术等方面介绍了计算机图形学的应用领域;接下了解了有关计算机图形学的概念和发展情况和图新显示器的发展和阴极射线管光栅扫描显示等的工作原理;最后介绍了图形学的最新技术。

第二章:介绍了面向对象程序设计,visual c++下的编程,主要基于mfc的编程,更重要的是绘制图形的方法。

第三章:图形的扫描与转换:主要分两部分,一是:直线,圆,和椭圆的扫描和转换中的一些重要而经典的算法。

二是:反走样技术,尤其,直线距离加权反走样的算法。

第四章:主要介绍了多边形填充,有多边形的的概述到有效边表填充,边缘填充,最后区域填充的原理和算法第五章:二维变换和裁剪:主要介绍了裁剪的方法:cohen sutherland算法是最著名的算法,除此之外还有重点分割裁剪算法,梁友栋——barsky算法。

第二篇计算机动画2.1计算机动画的概念:计算机动画是指采用图形与图像的处理技术,借助于编程或动画制作软件生成一系列的景物画面,其中当前帧是前一帧的部分修改。

计算机动画是采用连续播放静止图像的方法产生下图1-1几幅图片就是用计算机动画(a)(b)(c)(d)图2-1 计算机动画示例2.2 计算机动画的发展:计算机动画的发展大致分为三阶段:第一阶段:初出茅庐阶段:20世纪60年代初。

第一部计算机动画片诞生,之后大约20年,二维动画是计算机动画研究的重心,同时,二维动画也被应用于教学演示和辅助传统的动画片制作。

flash代码实例 《模拟时钟》

flash代码实例  《模拟时钟》

第28课时代码实例《模拟时钟》案例说明:曾经在网页上看到过很多漂亮的时钟,本课将制作一个动画实例“模拟时钟”,动画播放后它会调用计算机的当前时间,并在此基础上继续计时。

画面如图1、图2所示:图1动画播放画面1 图2动画播放画面2授课教师:文韬教学目的:通过本案例的学习,让学生能够掌握提取系统时间的函数和设置影片剪辑的属性;教学重点:设置影片剪辑的属性、提取系统时间的函数;教学难点:提取系统时间的函数;教学过程:一、案例分析我们要制作的是典型的象闹钟一样的时钟:圆圆的“身体”,长短粗细各不一样的的秒针、分针和时针。

那么,首先要做的就是先将这些元件制作出来。

二、制作时钟元件1.新建一个FLASH文档,设置舞台尺寸为270*320,背景为白色。

如图3所示:2.新建一个名为“钟面”的图形元件。

如图4所示:图4 新建“钟面”元件图3 设置文档属性3.打开视图菜单下的网格。

这样做的原因是为了在后面的制作过程中对位置的感觉更好一些。

如图5所示:4.选择椭圆工具,按住Shift键画一个线条颜色为黑色、粗细为10、无填充颜色的正圆,大小为:240*240,居中对齐。

如图6所示:5.新建一个名为“时针”的影片剪辑元件。

如图7所示:6.选择矩形工具,在“时针”元件编辑窗口画一个大小为8*80、无边框颜色的黑色矩形长条。

将矩形下方尾部放置在编辑窗口的中心点。

如图8所示:图5 打开网格视图图6 绘制钟面图7 创建“时针”元件7.用以上相同的方法制作“分针”元件和“秒针”元件,注意它们依次变长变细,指针底部与中心点对齐。

“分针”大小为:6*100;“秒针”大小为3*110 如图9、图10所示:图8 绘制时针图9 绘制分针图10 绘制秒针图11 在舞台上摆放各元件图12 设置钟面的数字8.返回主场景,将当前图层改名为“钟面”。

打开库,将“钟面”图形元件放置在舞台上。

新建一个图层,命名为“指针”,再将几个做好的指针组件拖出,按照秒针、分针、时针由上到下的顺序依次摆放,并且分别输入实例名称“miao”、“fen”、“shi”。

单片机时钟1234滚动程序代码

单片机时钟1234滚动程序代码

单片机时钟1234滚动程序代码单片机时钟1234滚动程序代码在单片机中,可以使用数字显示器来显示时钟。

而对于时钟的滚动显示,可以通过不断改变数字的显示值来实现。

以下是一个使用C 语言编写的单片机时钟1234滚动程序的代码示例:```c#include <reg52.h> // 引入单片机的头文件sbit D1 = P2^0; // 数字位选择引脚1sbit D2 = P2^1; // 数字位选择引脚2sbit D3 = P2^2; // 数字位选择引脚3sbit D4 = P2^3; // 数字位选择引脚4unsigned char code LED_Disp[] = { // 数码管显示0-9的编码值 0x3F, // 00x06, // 10x5B, // 20x4F, // 30x66, // 40x6D, // 50x7D, // 60x07, // 70x7F, // 80x6F // 9};void delay(unsigned int t) { // 延时函数unsigned int i, j;for (i = t; i > 0; i--)for (j = 110; j > 0; j--);}void main() {unsigned char i = 0;while (1) {D1 = 1; // 选择第一个数码管P0 = LED_Disp[i % 10]; // 显示个位数字delay(5); // 延时D1 = 0; // 关闭选择D2 = 1; // 选择第二个数码管P0 = LED_Disp[i / 10 % 10]; // 显示十位数字delay(5); // 延时D2 = 0; // 关闭选择D3 = 1; // 选择第三个数码管P0 = LED_Disp[i / 100 % 10]; // 显示百位数字delay(5); // 延时D3 = 0; // 关闭选择D4 = 1; // 选择第四个数码管P0 = LED_Disp[i / 1000 % 10]; // 显示千位数字delay(5); // 延时D4 = 0; // 关闭选择i++; // 数字递增if (i >= 10000)i = 0; // 重新计数}}```这段代码中,我们通过控制四个数码管的选择引脚,以及通过改变P0口的输出值来实现数字的显示。

LED旋转时钟的设计毕业论文

LED旋转时钟的设计毕业论文

LED旋转时钟的设计毕业论文目录引言 (1)1. 毕业设计容介绍 (1)1.1 毕业设计题目 (1)1.2 本课题研究的容 (1)1.3 设计要求 (1)1.4 本课题研究目的及意义 (1)1.5 本课题设计准备 (2)2. 原理介绍 (3)2.1 单片机介绍 (3)2.2 芯片的选择 (3)2.3 单片机STC15F2K08S2介绍 (3)2.4 贴片发光二极管原理介绍 (4)2.5 红外对管原理介绍 (5)2.6 稳压管原理介绍 (5)2.7 视觉暂留介绍 (5)2.8 旋转时钟的实现 (6)3. 毕业设计总体框架 (6)3.1 毕业设计框架图 (6)3.2 总体设计思路 (7)3.3 关于计时和电机转速监测的实现 (8)4. 实验步骤 (8)4.1 详细具体步骤 (8)4.2 硬件设计 (9)4.2.1电路原理图 (9)4.2.2电路各部分功能以及焊接 (10)4.3 程序设计 (11)4.3.1程序设计 (11)4.3.2旋转时钟程序下载 (13)5. 调试过程 (13)6. 总结 (16)谢辞 (18)参考文献 (19)附录 (20)引言现如今大多数人们的家庭使用的时钟主要还是传统意义上的时钟,传统意义上的时钟就是固定的表盘还有时针、分针、秒针,其显示效果非常的单一,不美观并且功能单一。

然而对于科技发展迅速的如今,层出不穷的各种物品越来越多,单一传统的时钟根本不能满足当代人的要求,现如今很多的人就得时钟不但用来看时间还应该是一件很好的装饰品的。

LED旋转时钟,就是基于51单片机的LED 旋转时钟,它的工作原理是利用电机带动LED灯所在的电路板高速旋转,单片机控制LED灯的亮灭,再依靠人眼的视觉暂留现象而形成的一种时钟。

它外型独特,样式新奇,它不同于我们平时使用的时钟,没有传统时钟的单一,新颖的设计很有其吸引力。

1. 毕业设计容介绍1.1 毕业设计题目LED旋转时钟1.2 本课题研究的容本课题设计的主要容是基于单片机的LED旋转时钟。

四位秒表程序

四位秒表程序

重赏之下心有勇夫^_^;汇编时钟程序。

4位共阳管。

P0口段码,P2.0~P2.3位码。

显示毫秒和秒。

三个按键一个控制时钟开始走,一个控制暂停和继续。

一个按键清0;12M晶振 2011 04 20 调试完成STRT EQU P3.2STP EQU P3.3CLRR EQU P3.5ORG 00HSJMP MAINORG 0BHAJMP T0INTORG 30HMAIN: MOV SP,#60HMOV R3,#10MOV R4,#20MOV TMOD,#01H ;定时器T0工作方式1MOV TH0,#0D8H ;10MS定时初值MOV TL0,#0F0HSETB ET0SETB EAk1: LCALL DISPJB STRT,K2LCALL DISPJNB STRT,$-3AJMP STARTk2: LCALL DISPJB STP,K3LCALL DISPJNB STP,$-3AJMP SSK3: LCALL DISPJB CLRR,K1LCALL DISPJNB CLRR,$-3AJMP CLEARSTART: SETB TR0CLR F0 ;如无此条,暂停后,不是按继续键,而是按开始键继续走时,下次按暂停键时,不能暂停AJMP K1SS: CPL F0JNB F0,STARTSTOP: CLR TR0AJMP K2CLEAR: CLR TR0MOV A,#0MOV 20H,AMOV 21H,AMOV 22H,AMOV 23H,AMOV 24H,AMOV 25H,AAJMP K3DISP: MOV A,24HMOV B,#10DIV ABMOV 20H,B ;余数(MS个位数)MOV 21H,A ;商(MS十位数)MOV A,25HMOV B,#10DIV ABMOV 22H,B ;余数(S个位数)MOV 23H,A ;商(S十位数)MOV A,20H ;MS个位ACALL SEG7MOV P0,ASETB P2.4ACALL DLYCLR P2.4MOV A,21H ;MS十位ACALL SEG7MOV P0,ASETB P2.5ACALL DLYCLR P2.5MOV A,22H ;S个位ACALL SEG7MOV P0,ACLR P0.7SETB P2.6ACALL DLYCLR P2.6MOV A,23H ;S十位ACALL SEG7MOV P0,ASETB P2.7ACALL DLYCLR P2.7RETT0INT: MOV TH0,#0D8H MOV TL0,#0F0HINC 24HMOV A,24HCJNE A,#99,T0INTRMOV 24H,#0INC 25HMOV A,25HCJNE A,#60,T0INTRMOV 25H,#0T0INTR: RETIDLY: MOV R7,#10D1: MOV R6,#50DJNZ R6,$DJNZ R7,D1RETSEG7: INC AMOVC A,@A+PCRETDB 0C0H;0DB 0F9H;1DB 0A4H;2 DB 0B0H;3 DB 099H;4 DB 092H;5 DB 082H;6 DB 0F8H;7 DB 080H;8 DB 090H;9 END2STRT EQU P1.0CLRR EQU P1.1ORG 00HAJMP MAINORG 0BHAJMP T0INT0ORG 30HMAIN:MOV SP,#60HMOV R4,#20MOV TMOD,#01HMOV TH0,#3CH;12M晶振时定时初值取#3CB0H,还可细调如TL=#0B7H,可以更准MOV TL0,#0B0HSETB ET0SETB EAk1:ACALL DISP ;开始/暂停键JB STRT,K2ACALL DISPJNB STRT,$-2AJMP K1K2:JB CLRR,K1ACALL DISPJNB CLRR,$-2MOV A,#0CLR TR0MOV 26H,AMOV 27H,AMOV 28H,AAJMP K2DISP:MOV A,26HMOV B,#10DIV ABMOV 20H,B ;余数(百分秒位数)MOV 21H,A ;商(十分秒位数)MOV A,27HMOV B,#10DIV ABMOV 22H,B ;余数(秒个位数)MOV 23H,A ;商(秒十位数)MOV A,28HMOV B,#10DIV ABMOV 24H,B ;余数(分个位数)MOV 25H,A ;商(分十位数)MOV A,20H ;百分秒?ACALL SEG7MOV P0,ACLR P2.3ACALL DLYSETB P2.3MOV A,21H ;十分秒ACALL SEG7MOV P0,AACALL DLYSETB P2.2DISP1:MOV A,22H ;秒个位ACALL SEG7MOV P0,ASETB P0.7CLR P2.1ACALL DLYSETB P2.1MOV A,23H ;秒十位ACALL SEG7MOV P0,ACLR P2.0ACALL DLYSETB P2.0RETT0INT0:MOV TH0,#3CH; ;定时中断子程序。

c++模拟时钟实验报告

c++模拟时钟实验报告

集中上机实习报告指导教师:王利姓名:赵蕊学号: 2010211864班级: 0411003时间: 2012.5模拟时钟程序一.需求分析1.题目内容:编写一个模拟时钟程序,此程序在屏幕左方有一指针式钟面,右方有两个矩形框,上面以数字方式显示日期和时间,该时间应与指针显示的时间一致,下方的矩形框作为秒表。

用菜单选项或按钮设置时间和秒表。

时间不必与机器系统时间相同,只要可任意设置即可。

2.题目分析:(1)模拟时钟是一种集计时器和时钟显示于一体的程序。

编写一个指针式时钟程序,此程序在屏幕左方有一个指针式钟面,右方有两个矩形框,上面以数字方式显示日期、星期和时间。

指针式的时钟表盘为圆形,并且圆周上有分布均匀的60个刻度,刻度要求显示清楚,钟面上有长度不相同的指针,即时针、分针、秒针,指针的运动要求具有规律性,且为顺时针。

数字钟显示时间的格式是年月日星期时分秒,小时为24进制,分钟和秒是60进制,指针式的时钟和数字式的时钟显示的时间同步。

按下时钟控制设置时间菜单项可弹出一对话框,用于设置当前的时间、日期和星期;按下秒表控制按钮后,秒表显示窗中显示从0开始的时间,单位为百分之一秒。

再次按下秒表控制按钮后计时停止,该窗口显示累计时间。

(2)本实验主要涉及到的知识点有:时钟指针运动算法、屏幕重绘方法、定时器消息、鼠标消息、菜单命令、对话框、画笔/画刷、显示文字等。

指针运动算法和屏幕重绘方法是本程序主要难点所在。

3.最终效果如下图:二.概要设计1.程序系统模块划分2.程序算法分析本程序不论何种指针,每次转动均以π/30弧度(一秒的角度)为基本单位,且都以表盘中心为转动圆心。

计算指针端点(x, y)的公式如下:x =圆心x坐标+ 指针长度* cos (指针方向角)y =圆心y坐标+ 指针长度* sin (指针方向角)指针长度是指自圆心至指针一个端点的长度,由于指针要跨越圆心,因此一个指针需要计算两个端点。

三个指针的运动是相关联的,秒针转一圈引起分针运动一格,分针每转12格引起时针运动一格,而因此应该使用一个定时器消息来处理指针的运动。

小学信息技术教师招聘第3册《时钟转动巧设计》优质试讲教案教学过程

小学信息技术教师招聘第3册《时钟转动巧设计》优质试讲教案教学过程

时钟转动巧设计尊敬的评委老师,大家上午好我是号考生,今天我试讲的题目是《时钟转动巧设计》,下面开始我的试讲。

上课,同学们好,请坐。

一、导入新课师:上课开始,老师给大家带来一段小视频,请欣赏。

师:通过视频大家发现了什么?师:嗯,里面有各式各样的表。

大家更喜欢哪一种啊?为什么呢?师:前排举手的女生,你来说师:哦,她喜欢机械表,喜欢听表针滴答滴答运转的声音,大家也是一样吗?师:嗯,既然这样,我们能不能用SerainC)软件设计程序模拟机械表,让表针转起来呢?师:如何设计呢?就让我们带着这个疑问一起走进今天的新课《时钟转动巧设计》去寻找答案吧!二、自主探究师:同学们,请看大屏幕上的表盘,如果要制作一个钟表,需要解决什么问题啊?师:后面那位男生,你来说!、师:哦,他说一是要先绘制表盘,二是让时针、分钟、秒针随时间变化绕表盘转动。

师:嗯,你真善于分析问题。

请坐。

师:那就让我们开始今天的第一个任务,去绘制表盘吧!师:在绘制前啊,老师两个温馨提示。

第一,虽然SCrainO绘图功能很强大,但要绘制刻度较多且均匀分布的表盘不是一件容易的事,用程序绘制更方便。

第二,在画大格小格的时候可以用Pen扩展模块中的图章积木来完成。

师:好,接下来,就请同学们自行研读课本,参照活动指导,独立完成任务1吧!师:看到大家都端正了坐姿,想必大家都已经完成了,谁来给大家分享一下呢?师:前排这位同学举手最快,我来分享吧!师:哦,1、他先是在造型区绘制了两个大小不同的正圆做为圆盘,大家注意,他在画圆的时候按了哪个键,对,是Shift键。

2、第二步,绘制了两个直线角色分别代表小时和分钟的刻度。

3、第三步,添加pen扩展积木。

4、第四步,给两个直线角色添加积木程序。

小时的角色,先是添加移动到积木,然后清除落笔,下面是旋转和图章积木并且是重复12次,因为一周是360度,所以修改角度为30度。

分钟角色和小时角色基本上一样,就是把旋转角度改为了6度。

用C++编写模拟时钟程序

用C++编写模拟时钟程序

模拟时钟程序1 基本功能描述本次课程设计是基于面向对象的应用程序设计,主要运用C++语言在VC++开发环境下的MFC中编程实现。

模拟时钟的基本功能是程序初始在屏幕上有一指针式时钟表盘,表盘为椭圆形,内部分布有12个刻度,表盘上有三个长度和颜色不同的时针分针和秒针,相互之间容易辨认,指针的运动通过数学推导之后以代码实现。

表盘的下方是一个数字形式显示的数字钟,其显示时间的格式是时:分:秒,指针式时钟和数字式时钟显示的时间同步,且两个时钟所显示的时间与系统时间相致,页面的菜单项设有时间设置项,可以对所显示的时间进行调整,能进行调整的具体内容是年、月、日、时、分、秒。

设计成功之后,此应用程序便可以起到时钟显示的作用。

2 设计思路2.1 程序流程图图1 模拟时钟程序流程图2.2 程序流程分析(1) 绘制指针式的时钟和数字式的时钟图形时,要在CView类下进行。

其中OnDraw()函数在绘制视图窗口时被调用,在定义了画刷CBrush和画笔CPen之后,调用GetClientRect()定义屏幕大小并确定椭圆中心的坐标,然后调用Ellipse绘制椭圆,即指针式的时钟表盘,SetTextColor绘制文本颜色,调用MoveTo和LineTo绘制表盘指针,同时调用CreateFont()创建数字钟字体,TextOut则是用以数字钟的文本输出。

(2) 模拟时钟处理消息的过程:首先调用SetTimer函数定义时钟消息,包括参数指定计时器的ID,消息产生的时间间隔,回调函数为NULL;调用消息处理函数OnTimer()刷新窗口显示。

在相应的WM_TIMER消息处理里添加时钟消息响应代码;最后调用KillTimer 释放该时钟。

(3) 要实现时钟的动态效果,即时间窗显示的时间每隔一秒钟更新一次,需要在时间窗格的正文调用CStatusBar::SetPaneText()函数。

要定时更新,则应利用WM_TIMER消息,计时器每隔一定的时间间隔就会发出一个WM_TIMER消息,而这个时间间隔可由用户指定。

用VC++制作-模拟时钟应用程序

用VC++制作-模拟时钟应用程序

案例五模拟时钟应用程序以实例为背景学习基于MFC的WINDOWS应用程序设计,编写一个模拟时钟程序,此程序在屏幕左边有一个指针式钟面,右方有两个矩形框,上面以数字方式显示日期和时间,该时间应与指针显示的时间一致,下方的矩形框作为秒表。

用菜单选项或按钮设置时间和秒表。

时间不必与机器系统时间相同,可任意设置。

模拟时钟示意图1 编程要求(1)为该程序设计一个美观大方的图标。

(2)程序界面设计合理,色彩得体大方,显示正确。

(3)时针、分针和秒针形象美观,即使各指针重合也可辨认。

(4)各指针运动规律正确。

为便于演示,时钟速度应比实际时间快20倍,即1小时相当于3分钟。

(5)数字式时钟的时间显示与指针式时钟显示一致。

(6)按下设置时间按钮或菜单项可弹出一对话框,用于设置当前的时间和日期。

(7)按下秒表控制按钮后,秒表显示窗中显示从0开始的时间,单位为百分之一秒。

再次按下秒表控制按钮后计时停止,该窗口显示累计时间。

2 问题分析本题主要涉及到的知识点有:时钟指针运动算法、屏幕重绘方法、定时器消息、鼠标消息、菜单命令、对话框、画笔/画刷、显示文字等。

指针运动算法和屏幕重绘方法是本程序主要难点所在。

不论何种指针,每次转动均以π/30弧度(一秒的角度)为基本单位,且都以表盘中心为转动圆心。

计算指针端点(x, y)的公式如下:x =圆心x坐标+ 指针长度* cos (指针方向角)y =圆心y坐标+ 指针长度* sin (指针方向角)注意,指针长度是指自圆心至指针一个端点的长度(是整个指针的一部分),由于指针可能跨越圆心,因此一个指针需要计算两个端点。

三个指针的运动是相关联的,秒针转一圈引起分针运动一格,分针转一圈引起时针运动一格,因此应该使用一个定时器消息来处理指针的运动。

若用三个定时器消息分别处理时针、分针和秒针的运动,就会使问题复杂化且不易实现三个指针联动的正确规律。

采用一个定时器消息可以很容易实现指针联动算法。

由于屏幕的重绘速度很快(50 ms一次),如果采用全屏删除式重绘则闪烁十分明显,显示效果不佳。

桌面时钟制作原代码

桌面时钟制作原代码

// AlarmSetDlg.cpp : implementation file//#include "stdafx.h"#include "deskclock.h"#include "AlarmSetDlg.h"#include "BeepSetDlg.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif///////////////////////////////////////////////////////////////////////////// // AlarmSetDlg dialogAlarmSetDlg::AlarmSetDlg(CWnd* pParent /*=NULL*/): CDialog(AlarmSetDlg::IDD, pParent){//{{AFX_DATA_INIT(AlarmSetDlg)m_bSound = TRUE;m_bMusic = 0;m_strAlarmMusic = _T("");m_pickerTime = 0;//}}AFX_DATA_INITSYSTEMTIME time;GetLocalTime(&time);m_pickerTime = time;m_hour = time.wHour;m_minute = time.wMinute;m_second = time.wSecond;}void AlarmSetDlg::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(AlarmSetDlg)DDX_Text(pDX, IDC_HO, m_hour);DDX_Text(pDX, IDC_MI, m_minute);DDX_Text(pDX, IDC_SE, m_second);DDX_Check(pDX, IDC_BMUSIC, m_bSound);DDX_Radio(pDX, IDC_MUSIC, m_bMusic);DDX_Text(pDX, IDC_PATHMUSIC, m_strAlarmMusic);DDX_DateTimeCtrl(pDX, IDC_DATETIMEPICKER2, m_pickerTime);//}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(AlarmSetDlg, CDialog)//{{AFX_MSG_MAP(AlarmSetDlg)ON_BN_CLICKED(IDC_MUSIC, OnMusic)ON_BN_CLICKED(IDC_BEEP, OnBeep)ON_BN_CLICKED(IDC_BMUSIC, OnBmusic)ON_BN_CLICKED(IDC_SMUSIC, OnSelectMusic)ON_BN_CLICKED(IDC_SBEEP, OnSelectBeep)//}}AFX_MSG_MAPEND_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// AlarmSetDlg message handlersBOOL AlarmSetDlg::OnInitDialog(){CDialog::OnInitDialog();// TODO: Add extra initialization hereSetEnable();return TRUE; // return TRUE unless you set the focus to a control// EXCEPTION: OCX Property Pages should return FALSE }void AlarmSetDlg::SetEnable(){if(m_bSound){GetDlgItem(IDC_MUSIC)->EnableWindow(true);GetDlgItem(IDC_BEEP)->EnableWindow(true);if(!m_bMusic){GetDlgItem(IDC_PATHMUSIC)->EnableWindow(true);GetDlgItem(IDC_SMUSIC)->EnableWindow(true);GetDlgItem(IDC_SBEEP)->EnableWindow(false);}else{GetDlgItem(IDC_PATHMUSIC)->EnableWindow(false);GetDlgItem(IDC_SMUSIC)->EnableWindow(false);GetDlgItem(IDC_SBEEP)->EnableWindow(true);}}else{GetDlgItem(IDC_PATHMUSIC)->EnableWindow(false);GetDlgItem(IDC_SMUSIC)->EnableWindow(false);GetDlgItem(IDC_SBEEP)->EnableWindow(false);GetDlgItem(IDC_MUSIC)->EnableWindow(false);GetDlgItem(IDC_BEEP)->EnableWindow(false);}}void AlarmSetDlg::OnMusic(){// TODO: Add your control notification handler code hereUpdateData(true);SetEnable();}void AlarmSetDlg::OnBeep(){// TODO: Add your control notification handler code hereUpdateData(true);SetEnable();}void AlarmSetDlg::OnBmusic(){// TODO: Add your control notification handler code hereUpdateData(true);SetEnable();}void AlarmSetDlg::OnSelectMusic(){// TODO: Add your control notification handler code hereCFileDialog dlg(TRUE,"wave",NULL,NULL,"wave file(*.wav)|*.WAV",NULL);if (dlg.DoModal()==IDOK){m_strAlarmMusic = dlg.GetPathName();UpdateData(false);}}void AlarmSetDlg::OnSelectBeep(){// TODO: Add your control notification handler code hereBeepSetDlg dlg;dlg.m_typeBeep = m_typeBeep;if(dlg.DoModal() == IDOK){m_typeBeep = dlg.m_typeBeep;}}// BackSetDlg.cpp : implementation file//#include "stdafx.h"#include "deskclock.h"#include "BackSetDlg.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif///////////////////////////////////////////////////////////////////////////// // BackSetDlg dialogBackSetDlg::BackSetDlg(CWnd* pParent /*=NULL*/): CDialog(BackSetDlg::IDD, pParent){//{{AFX_DATA_INIT(BackSetDlg)m_bPicture = 0;m_strBk = _T("");m_bBkStre = -1;//}}AFX_DATA_INIT}void BackSetDlg::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(BackSetDlg)DDX_Radio(pDX, IDC_COLOR, m_bPicture);DDX_Text(pDX, IDC_EDITPICTURE, m_strBk);DDX_Radio(pDX, IDC_CENTER, m_bBkStre);//}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(BackSetDlg, CDialog)//{{AFX_MSG_MAP(BackSetDlg)ON_BN_CLICKED(IDC_COLOR, OnColor)ON_BN_CLICKED(IDC_RADIO2, OnRadio2)ON_WM_PAINT()ON_BN_CLICKED(IDC_BKCOLOR, OnBkcolor)ON_BN_CLICKED(IDC_BKPICTURE, OnBkpicture)//}}AFX_MSG_MAPEND_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// BackSetDlg message handlersBOOL BackSetDlg::OnInitDialog(){CDialog::OnInitDialog();// TODO: Add extra initialization hereSetEnable();return TRUE; // return TRUE unless you set the focus to a control// EXCEPTION: OCX Property Pages should return FALSE }void BackSetDlg::SetEnable(){if(!m_bPicture){GetDlgItem(IDC_BKCOLOR)->EnableWindow(true);GetDlgItem(IDC_BKPICTURE)->EnableWindow(false);GetDlgItem(IDC_EDITPICTURE)->EnableWindow(false);GetDlgItem(IDC_STRE)->EnableWindow(false);GetDlgItem(IDC_CENTER)->EnableWindow(false);}else{GetDlgItem(IDC_BKCOLOR)->EnableWindow(false);GetDlgItem(IDC_BKPICTURE)->EnableWindow(true);GetDlgItem(IDC_EDITPICTURE)->EnableWindow(true);GetDlgItem(IDC_STRE)->EnableWindow(true);GetDlgItem(IDC_CENTER)->EnableWindow(true);}}void BackSetDlg::OnColor(){// TODO: Add your control notification handler code hereUpdateData(true);SetEnable();}void BackSetDlg::OnRadio2(){// TODO: Add your control notification handler code hereUpdateData(true);SetEnable();}void BackSetDlg::OnPaint(){CPaintDC dc(this); // device context for paintingCPen penBorderH(PS_SOLID,1,RGB(200,200,200));CPen *ppenOld = dc.SelectObject(&penBorderH);CBrush brPointH(m_colorBk);CBrush* pbrOld = dc.SelectObject(&brPointH);dc.Rectangle(70,105,130,135);}void BackSetDlg::OnBkcolor(){// TODO: Add your control notification handler code hereCColorDialog dlg;dlg.m_cc.Flags|=CC_RGBINIT ;dlg.m_cc.rgbResult=m_colorBk;if(IDOK==dlg.DoModal()){m_colorBk = dlg.m_cc.rgbResult;Invalidate();}}void BackSetDlg::OnBkpicture(){// TODO: Add your control notification handler code hereCFileDialog dlg(TRUE,"bmp",NULL,NULL,"bmp file(*.bmp)|*.BMP|",NULL);if (dlg.DoModal()==IDOK){m_strBk = dlg.GetPathName();UpdateData(false);}}// BeepSetDlg.cpp : implementation file//#include "stdafx.h"#include "deskclock.h"#include "BeepSetDlg.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif/////////////////////////////////////////////////////////////////////////////// BeepSetDlg dialogBeepSetDlg::BeepSetDlg(CWnd* pParent /*=NULL*/): CDialog(BeepSetDlg::IDD, pParent){//{{AFX_DATA_INIT(BeepSetDlg)m_typeBeep = -1;//}}AFX_DATA_INITm_times = 5;}void BeepSetDlg::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(BeepSetDlg)DDX_Radio(pDX, IDC_XIAOJIUWO, m_typeBeep);//}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(BeepSetDlg, CDialog)//{{AFX_MSG_MAP(BeepSetDlg)ON_BN_CLICKED(IDC_XIAOJIUWO, OnXiaoJiuWo)ON_BN_CLICKED(IDC_UP, OnUp)ON_BN_CLICKED(IDC_DOWN, OnDown)ON_BN_CLICKED(IDC_C1, OnC1)ON_BN_CLICKED(IDC_D1, OnC2)ON_BN_CLICKED(IDC_E1, OnC3)ON_BN_CLICKED(IDC_F1, OnC4)ON_BN_CLICKED(IDC_G1, OnC5)//}}AFX_MSG_MAPEND_MESSAGE_MAP()///////////////////////////////////////////////////////////////////////////// // BeepSetDlg message handlersvoid BeepSetDlg::OnXiaoJiuWo(){// TODO: Add your control notification handler code hereUpdateData(true);ClockBeep();}void BeepSetDlg::OnUp(){// TODO: Add your control notification handler code hereUpdateData(true);ClockBeep();}void BeepSetDlg::OnDown(){// TODO: Add your control notification handler code here UpdateData(true);ClockBeep();}void BeepSetDlg::OnC1(){// TODO: Add your control notification handler code here UpdateData(true);ClockBeep();}void BeepSetDlg::OnC2(){// TODO: Add your control notification handler code here UpdateData(true);ClockBeep();}void BeepSetDlg::OnC3(){// TODO: Add your control notification handler code here UpdateData(true);ClockBeep();}void BeepSetDlg::OnC4(){// TODO: Add your control notification handler code here UpdateData(true);ClockBeep();}void BeepSetDlg::OnC5(){// TODO: Add your control notification handler code here UpdateData(true);ClockBeep();}void BeepSetDlg::ClockBeep(){yf a[1000]={{z3,125},{z3,50},{z4,100},{z3,50},{z2,50}, //5 {z2,125},{z2,50},{z5,100},{z2,50},{z1,50}, //10{z1,125},{z1,50},{z6,100},{z5,100}, //14{z3,125},{z4,25},{z3,25},{z2,100},{z2,100}, //19{z3,125},{z3,50},{z4,100},{z5,50},{z3,50}, //24{z5,125},{z5,50},{g2,100},{z7,50},{g1,50}, //29{g1,200},{g1,50},{z7,50},{z6,50},{z7,50}, //34{g1,125},{z7,50},{g1,200}, //37{g1,50},{z7,50},{g1,50},{z7,50},{g1,100},{z3,50},{z5,50}, //44{z5,250},{z6,50},{z7,50}, //47{g1,50},{z7,50},{g1,50},{z7,50},{g1,100},{g2,100},{g3,100}, //54{g3,300},{z6,50},{z7,50}, //57{g1,50},{z7,50},{g1,50},{z7,50},{g1,100},{g3,100}, //63{z7,50},{z6,50},{z7,50},{z6,50},{z7,50},{z5,50},{z5,50},{g1,50}, //71 {g1,200},{g3,75},{g4,25},{g4,50},{g3,50}, //76{g2,200},{yaya,50},{z5,50},{g1,50},{g2,50}, //81{g3,50},{g1,50},{g1,50},{z5,50},{z5,100},{z5,50},{g3,50}, //88{g2,50},{g3,50},{g2,50},{g1,50},{z5,50},{z5,50},{z6,50},{z7,50}, //96 {g1,50},{z6,50},{z6,50},{z3,50},{z3,100},{yaya,50},{z7,50}, //103{g1,50},{z7,50},{g1,50},{g2,50},{z6,50},{z5,50},{z5,100}, //110{z6,100},{z5,50},{z6,50},{z7,100},{g3,50},{g4,50}, //116{g3,50},{g4,50},{g3,50},{g2,50},{g2,50},{g1,100},{z5,50}, //123{z5,50},{z4,50},{z4,50},{g1,50},{g1,50},{g3,50},{g3,50},{g1,50}, //131 {g2,200},{yaya,50},{z5,50},{g1,50},{g2,50}, //136{g3,50},{g1,50},{g1,50},{z5,50},{z5,100},{z5,50},{g3,50}, //143{g2,50},{g3,50},{g2,50},{g1,50},{z5,50},{z5,50},{z6,50},{z7,50}, //151 {g1,50},{z6,50},{z6,50},{z3,50},{z3,100},{z3,50},{z7,50}, //158{g1,50},{z7,50},{g1,50},{g2,50},{z6,50},{z5,50},{z5,100}, //165{z6,50},{z7,50},{g1,50},{g2,100},{g3,50},{g4,50}, //171{g3,50},{g4,50},{g2,50},{g1,50},{g2,50},{g1,50},{g1,100}, //178{g2,50},{g1,50},{g2,50},{z6,50},{g1,100},{g2,50},{g1,50}, //185{g1,400}, //186{g2,50},{g1,50},{g2,50},{z6,50},{z7,100},{z7,50},{g1,50}, //193{g1,400}, //194};int i = 0;switch(m_typeBeep){case 0:yf *atop;atop=a;while(m_times--){Beep(atop->s,atop->t*5);atop++;}break;case 1:for(i = 5 ; i < 5 + m_times; i++){Beep(i * 70,50);Sleep(200);}break;case 2:for(i = 5 + m_times ; i > 5; i--){Beep(i * 70,50);Sleep(200);}break;case 3:for(i = 0 ; i < m_times; i++){Beep(262,50);Sleep(200);}break;case 4:for(i = 0 ; i < m_times; i++){Beep(294,50);Sleep(200);}break;case 5:for(i = 0 ; i < m_times; i++){Beep(330,50);Sleep(200);}break;case 6:for(i = 0 ; i < m_times; i++){Beep(349,50);Sleep(200);}break;case 7:for(i = 0 ; i < m_times; i++){Beep(392,50);Sleep(200);}break;}}// ClockDate.cpp: implementation of the CClockDate class.////////////////////////////////////////////////////////////////////////#include "stdafx.h"#include "deskclock.h"#include "ClockDate.h"#ifdef _DEBUG#undef THIS_FILEstatic char THIS_FILE[]=__FILE__;#define new DEBUG_NEW#endif////////////////////////////////////////////////////////////////////// // Construction/Destruction//////////////////////////////////////////////////////////////////////CClockDate::CClockDate(){m_dColor = RGB(0,255,0);m_wColor = RGB(0,255,0);m_position = 0;m_inType = 1;m_outType = 1;m_bUp = false;}CClockDate::~CClockDate(){}void CClockDate::DrawDate(CDC *pDc, CRect rectClient, CTime oTime) {SetPosition(rectClient);UINT nYear,nMonth, nDay,nDayOfWeek;nYear = oTime.GetYear();nMonth = oTime.GetMonth();nDay = oTime.GetDay();CString strDate,strY ear,strMonth,strDay,strDayOfWeek;strYear.Format("%d",nYear);strMonth.Format("%d",nMonth);if (nMonth <10){strMonth.Format("0%d",nMonth);}strDay.Format("%d",nDay);if (nDay <10){strDay.Format("0%d",nDay);}strDate.Format("%s年%s月%s日",strYear,strMonth,strDay);strDayOfWeek = weekDay( oTime);int nBKMode = pDc->SetBkMode(TRANSPARENT);pDc->SetTextColor(m_dColor);pDc->TextOut(m_DX,m_DY,strDate);pDc->SetTextColor(m_wColor);pDc->TextOut(m_WX,m_WY,strDayOfWeek);pDc->SetBkMode(nBKMode);}void CClockDate::SetPosition(CRect rectClient){CPoint ptMiddle;ptMiddle.x = rectClient.Width()/2;ptMiddle.y = rectClient.Height()/2 - 15;int nRidius = min(ptMiddle.x,ptMiddle.y);if(!m_bUp){m_DX = ptMiddle.x + nRidius * 0.8 - 110;m_DY = ptMiddle.y + 20 ;m_WX = ptMiddle.x - nRidius * 0.8 + 35;m_WY = ptMiddle.y + 20 ;return;}if(m_position == 0){ // 内部switch(m_inType){case 0: // 上m_DX = ptMiddle.x - 46;m_DY = ptMiddle.y - nRidius * 0.7 + 50;m_WX = ptMiddle.x - 16;m_WY = ptMiddle.y - nRidius * 0.7 + 30;break;case 1: // 下m_DX = ptMiddle.x - 46;m_DY = ptMiddle.y + nRidius * 0.7 - 50;m_WX = ptMiddle.x - 16;m_WY = ptMiddle.y + nRidius * 0.7 - 30;break;case 2: // 左m_DX = ptMiddle.x - nRidius * 0.8 + 10;m_DY = ptMiddle.y + 50;m_WX = ptMiddle.x - nRidius * 0.8 + 45;m_WY = ptMiddle.y + 30 ;break;case 3: // 右m_DX = ptMiddle.x + nRidius * 0.8 - 110;m_DY = ptMiddle.y + 50 ;m_WX = ptMiddle.x + nRidius * 0.8 - 75;m_WY = ptMiddle.y + 30 ;break;}}else if(m_position == 1){ // 外部switch(m_outType){case 0: // 左上角m_DX = 10;m_DY = 60;m_WX = 40;m_WY = 40;break;case 1: // 右上角m_DX = rectClient.right - 112;m_DY = 60;m_WX = rectClient.right - 82;m_WY = 40;break;case 2: // 左下角m_DX = 10;m_DY = rectClient.bottom - 80 ;m_WX = 40;m_WY = rectClient.bottom - 60 ;break;case 3: // 右下角m_DX = rectClient.right - 112;m_DY = rectClient.bottom - 80 ;m_WX = rectClient.right - 82;m_WY = rectClient.bottom - 60 ;break;}}}CString CClockDate::weekDay(CTime oTime) {CString str;int nDayOfWeek = oTime.GetDayOfWeek();switch(nDayOfWeek ){case 1:str = "星期日";break;case 2:str = "星期一";break;case 3:str = "星期二";break;case 4:str = "星期三";break;case 5:str = "星期四";break;case 6:str = "星期五";break;case 7:str = "星期六";break;}return str;}// ClockHand.cpp: implementation of the CClockHand class.////////////////////////////////////////////////////////////////////////#include "stdafx.h"#include "deskClock.h"#include "ClockHand.h"#include "ClockScale.h"#ifdef _DEBUG#undef THIS_FILEstatic char THIS_FILE[]=__FILE__;#define new DEBUG_NEW#endif////////////////////////////////////////////////////////////////////// // Construction/Destruction//////////////////////////////////////////////////////////////////////CClockHand::CClockHand(){m_HbordColor = RGB(255,255,255);m_HColor = RGB(128,128,0);m_MbordColor = RGB(255,255,255);m_MColor = RGB(0,128,128);m_SbordColor = RGB(255,128,128);}CClockHand::~CClockHand(){}void CClockHand::DrawHand(CDC *pDC, int nValue,HANDTYPE typeHand,CPoint &ptMiddle,CTime oTime){m_ptMiddle.x = ptMiddle.x;m_ptMiddle.y = ptMiddle.y;m_nRidius = min(m_ptMiddle.x,m_ptMiddle.y);m_nPointWidth = (int)m_nRidius/20;CPoint ptHand[4];//得到指针的位置GetHandPoints(nValue,typeHand,ptHand, oTime);CBrush brHandH(m_HColor);CPen penHandH(PS_SOLID,1,m_HbordColor);CBrush brHandM(m_MColor);CPen penHandM(PS_SOLID,1,m_MbordColor);CPen penrgb(PS_SOLID,1,m_SbordColor);switch(typeHand){case HOUR_HAND://设置画刷、画笔pDC->SelectObject(&brHandH);pDC->SelectObject(&penHandH);//绘制一个四边形pDC->Polygon(ptHand,4);break;case MINUTE_HAND://设置画刷、画笔pDC->SelectObject(&brHandM);pDC->SelectObject(&penHandM);//绘制一个四边形pDC->Polygon(ptHand,4);break;case SECOND_HAND:pDC->SelectObject(&penrgb);pDC->MoveTo(ptHand[0]);pDC->LineTo(ptHand[1]);break;}}void CClockHand::GetHandPoints(int nValue, HANDTYPE typeHand, CPoint *pptHand,CTime oTime){UINT nMinute = oTime.GetMinute();CClockScale Scale;Scale.m_ptMiddle.x = m_ptMiddle.x;Scale.m_ptMiddle.y = m_ptMiddle.y;int nLength = 0;//根据指针的类型区分switch(typeHand){case HOUR_HAND://时针长为钟面半径的一半nLength = MulDiv(m_nRidius, 50, 100);//因为绘制时针按照分针进行,故需要一些变换nValue *= 5;nValue += (nMinute/12);break;case MINUTE_HAND:nLength = MulDiv(m_nRidius, 70, 100);break;case SECOND_HAND:nLength = MulDiv(m_nRidius, 80, 100);break;default:ASSERT(false);}//得到时针和分针外形的四个点if (typeHand == HOUR_HAND || typeHand == MINUTE_HAND){pptHand[0] = puterFacePoint(nValue+30,m_nPointWidth*2);pptHand[1] = puterFacePoint(nValue+15,m_nPointWidth);pptHand[2] = puterFacePoint(nValue,nLength);pptHand[3] = puterFacePoint(nValue-15,m_nPointWidth);}//得到秒针的两个端点elsepptHand[0] = m_ptMiddle;pptHand[1] = puterFacePoint(nValue,nLength);}}void CClockHand::SetHandColor(COLORREF hBColor, COLORREF hColor, COLORREF mBColor, COLORREF mColor, COLORREF sColor){m_HbordColor = hBColor;m_HColor = hColor;m_MbordColor = mBColor;m_MColor = mColor;m_SbordColor = sColor;}void CClockHand::GetHandColor(COLORREF &hBColor, COLORREF &hColor, COLORREF &mBColor, COLORREF &mColor, COLORREF &sColor){hBColor = m_HbordColor;hColor = m_HColor;mBColor = m_MbordColor;mColor = m_MColor;sColor = m_SbordColor;}// ClockNum.cpp: implementation of the CClockNum class.////////////////////////////////////////////////////////////////////////#include "stdafx.h"#include "deskClock.h"#include "ClockNum.h"#ifdef _DEBUG#undef THIS_FILEstatic char THIS_FILE[]=__FILE__;#define new DEBUG_NEW//////////////////////////////////////////////////////////////////////// Construction/Destruction//////////////////////////////////////////////////////////////////////CClockNum::CClockNum(){m_position = 0;m_inType = 1;m_outType = 5;m_color = RGB(0,255,0);m_bgColor = false;}CClockNum::~CClockNum(){}void CClockNum::DrawTime(CDC *pDc, CRect rectClient,CTime oTime) {SetPosition(rectClient);UINT nHour,nMinute,nSecond;nHour = oTime.GetHour();nMinute = oTime.GetMinute();nSecond = oTime.GetSecond();CString strTime,strHour,strMinute,strSecond;strHour.Format("%d",nHour);if (nHour <10){strHour.Format("0%d",nHour);}strMinute.Format("%d",nMinute);if (nMinute <10){strMinute.Format("0%d",nMinute);}strSecond.Format("%d",nSecond);if (nSecond <10){strSecond.Format("0%d",nSecond);}strTime.Format("%s : %s : %s",strHour,strMinute,strSecond);pDc->SetTextColor(m_color);if(!m_bgColor){int nBKMode = pDc->SetBkMode(TRANSPARENT);pDc->TextOut(m_X,m_Y,strTime);pDc->SetBkMode(nBKMode);}else{pDc->TextOut(m_X,m_Y,strTime);}}void CClockNum::SetPosition(CRect rectClient){CPoint ptMiddle;ptMiddle.x = rectClient.Width()/2;ptMiddle.y = rectClient.Height()/2 - 15;int nRidius = min(ptMiddle.x,ptMiddle.y);if(m_position == 0){ // 内部switch(m_inType){case 0: // 上m_X = ptMiddle.x - 35;m_Y = ptMiddle.y - nRidius * 0.7;break;case 1: // 下m_X = ptMiddle.x - 35;m_Y = ptMiddle.y + nRidius * 0.7;break;case 2: // 左m_X = ptMiddle.x - nRidius * 0.8 + 25;m_Y = ptMiddle.y ;break;case 3: // 右m_X = ptMiddle.x + nRidius * 0.8 - 95;m_Y = ptMiddle.y ;break;}}else if(m_position == 1){ // 外部switch(m_outType){case 0: // 左上角m_X = 22;m_Y = 10;break;case 1: // 右上角m_X = rectClient.right - 100;m_Y = 10;break;case 2: // 左下角m_X = 22;m_Y = rectClient.bottom - 30 ;break;case 3: // 右下角m_X = rectClient.right - 96;m_Y = rectClient.bottom - 30;break;case 4: // 上侧居中m_X = ptMiddle.x - 33;m_Y = 2;break;case 5: // 下侧居中m_X = ptMiddle.x - 33;m_Y = rectClient.bottom - 30;break;case 6: // 左侧居中m_X = 10;m_Y = ptMiddle.y ;break;case 7: // 右侧居中m_X = rectClient.right - 86;m_Y = ptMiddle.y ;break;}}}// ClockScale.cpp: implementation of the CClockScale class.//////////////////////////////////////////////////////////////////////// #include "stdafx.h"#include "deskClock.h"#include "ClockScale.h"#include <math.h>#ifdef _DEBUG#undef THIS_FILEstatic char THIS_FILE[]=__FILE__;#define new DEBUG_NEW#endif#define PI 3.1415926////////////////////////////////////////////////////////////////////// // Construction/Destruction//////////////////////////////////////////////////////////////////////CClockScale::CClockScale(){m_color = 0xFF0000;m_style = TYPE_RHOMBUS;m_logColor = 0;}CClockScale::~CClockScale(){}void CClockScale::DrawScale(CDC *pDc,CPoint &ptMiddle){//计算钟面的中心位置m_ptMiddle.x = ptMiddle.x;m_ptMiddle.y = ptMiddle.y;if (m_ptMiddle.y < 0){m_ptMiddle.y = 0;}//计算钟面的半径UINT nRidius = min(m_ptMiddle.x,m_ptMiddle.y);//计算两个刻度之间的距离m_nPointWidth = (int)nRidius/20;// 绘制LOGCBitmap maskbmp,logbmp;maskbmp.LoadBitmap(IDB_LOGMASK);logbmp.LoadBitmap(IDB_LOG);CDC MaskDC,memDC;MaskDC.CreateCompatibleDC(pDc);MaskDC.SelectObject(&maskbmp);memDC.CreateCompatibleDC(pDc);memDC.SelectObject(&logbmp);if(m_nPointWidth > 8){if(m_logColor == 0 ){pDc->BitBlt(m_ptMiddle.x - 25 ,ptMiddle.y - nRidius * 0.7,96,96,&MaskDC,0,0,SRCAND);pDc->BitBlt(m_ptMiddle.x - 25,ptMiddle.y - nRidius * 0.7,96,96,&memDC,0,0,MERGEPAINT);}else if(m_logColor == 1 ){pDc->BitBlt(m_ptMiddle.x - 25 ,ptMiddle.y - nRidius * 0.7,96,96,&MaskDC,0,0,MERGEPAINT);pDc->BitBlt(m_ptMiddle.x - 25,ptMiddle.y - nRidius * 0.7,96,96,&memDC,0,0,SRCAND);}}if (m_nPointWidth < 2){m_nPointWidth = 2;}//保存各个刻度点的位置CPoint ptFace;//设置刻度点的颜色CBrush brPoint(m_color);CBrush* pbrOld = pDc->SelectObject(&brPoint);//刻度所在的圆半径为钟面半径的90%int nFaceLength = MulDiv(nRidius,9,10);//绘制各个刻度for (int nMin=0; nMin<60; nMin++){//bHour为假表示绘制的是分钟刻度BOOL bHour = FALSE;//计算一个刻度点的位置ptFace = ComputerFacePoint(nMin,nFaceLength);//当分钟数是5的倍数时,bHour为真表示绘制小时刻度if (nMin%5==0){bHour = true;}//绘制一个刻度点DrawFacePoint(pDc,ptFace,bHour);}pDc->SelectObject(pbrOld);return;}CPoint CClockScale::ComputerFacePoint(UINT min, int nFaceLength){CPoint ptCalc;//将分钟转换为角度数double fDegrees = 180+((15+min)%60)*6;//再转换为弧度数double fAngle = fDegrees/180;//计算刻度点位置ptCalc.x = m_ptMiddle.x + (int)(cos(fAngle*PI)*nFaceLength);ptCalc.y = m_ptMiddle.y + (int)(sin(fAngle*PI)*nFaceLength);//返回刻度点位置return(ptCalc);}void CClockScale::DrawFacePoint(CDC *pDC, const CPoint &ptFace, BOOL bMajor){CRect rectPoint(ptFace.x,ptFace.y,ptFace.x,ptFace.y);//绘制小时刻度点if (bMajor){//增加高度和宽度,使单点变为小的矩形区rectPoint.InflateRect((m_nPointWidth/2)+2,(m_nPointWidth/2)+2);DrawMajor(pDC, m_style,rectPoint);}//绘制分钟刻度点else{//只有当刻度点之间的距离足够大时才绘制if (m_nPointWidth > 2){rectPoint.InflateRect(1,1);pDC->Draw3dRect(&rectPoint,GetSysColor(COLOR_BTNHIGHLIGHT),GetSysColor(COLOR_BT NSHADOW));}}return;}void CClockScale::DrawMajor(CDC *pDC, MAJORTYPE type, CRect rectPoint){CPen *oldPen;CPoint ptRhombus[4] ;CPen penBorder(PS_SOLID,1,RGB(255,255,255));switch(type){case TYPE_ELLIPSE:pDC->Ellipse(rectPoint);break;case TYPE_RECT:pDC->Rectangle(&rectPoint);pDC->Draw3dRect(&rectPoint,GetSysColor(COLOR_BTNHIGHLIGHT),GetSysColor(COLOR_BT NSHADOW));break;case TYPE_RHOMBUS:oldPen = pDC->SelectObject(&penBorder);ptRhombus[1].x = rectPoint.left + rectPoint.Width()/2;ptRhombus[1].y = rectPoint.top;ptRhombus[0].x = rectPoint.left;ptRhombus[0].y = rectPoint.top + rectPoint.Height()/2;ptRhombus[3].x = rectPoint.left + rectPoint.Width()/2;ptRhombus[3].y = rectPoint.bottom;ptRhombus[2].x = rectPoint.right;ptRhombus[2].y = rectPoint.top + rectPoint.Height()/2;pDC->Polygon(ptRhombus,4);pDC->SelectObject(oldPen);break;case TYPE_TRIANGLE:oldPen = pDC->SelectObject(&penBorder);ptRhombus[0].x = rectPoint.left;ptRhombus[0].y = rectPoint.top + rectPoint.Height()/2;ptRhombus[1].x = rectPoint.left + rectPoint.Width()/2;ptRhombus[1].y = rectPoint.top;ptRhombus[2].x = rectPoint.right;ptRhombus[2].y = rectPoint.top + rectPoint.Height()/2;pDC->Polygon(ptRhombus,3);pDC->SelectObject(oldPen);break;}}void CClockScale::SetScaleStyle(MAJORTYPE type){m_style = type;}void CClockScale::SetScaleColor(COLORREF colorref){m_color = colorref;}void CClockScale::SetLogColor(int color){m_logColor = color;}MAJORTYPE CClockScale::GetScaleStyle(){return m_style;}COLORREF CClockScale::GetScaleColor(){return m_color;}int CClockScale::GetLogColor(){return m_logColor;}// DateSetDlg.cpp : implementation file//#include "stdafx.h"#include "deskclock.h"#include "DateSetDlg.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif///////////////////////////////////////////////////////////////////////////// // DateSetDlg dialogDateSetDlg::DateSetDlg(CWnd* pParent /*=NULL*/): CDialog(DateSetDlg::IDD, pParent){//{{AFX_DATA_INIT(DateSetDlg)m_up = 0;m_in = 0;m_show = 0;//}}AFX_DATA_INIT}void DateSetDlg::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(DateSetDlg)DDX_Control(pDX, IDC_COMOUT, m_comOut);DDX_Control(pDX, IDC_COMIN, m_comIn);DDX_Radio(pDX, IDC_UP, m_up);DDX_Radio(pDX, IDC_IN, m_in);DDX_Radio(pDX, IDC_SHOW, m_show);。

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

东南大学C语言课程设计报告课程名称:计算机综合课程设计学院:土木工程学院设计题目:模拟时钟转动程序级别: B级学生姓名:***学号: ******** 同组学生:学号:指导教师:***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语言的设计必须结合实际,充分考虑界面友好等人性化设置,这就要求我们要多观察,敢创新。

另外上机实验是必不可少的,理论的东西学得再好,不结合实验区验证始终只能停留在理论阶段。

通过此次实战演练,我还学到很重要的一点,就是要虚心请教他人,个人的力量总是有限的,只有发挥众人的智慧才能把任务完成的更好,这在今后的工作中也是相当重要的。

相关文档
最新文档