欢迎来到沃文网! | 帮助中心 分享知识,传播智慧!
沃文网
全部分类
  • 教学课件>
  • 医学资料>
  • 技术资料>
  • 学术论文>
  • 资格考试>
  • 建筑施工>
  • 实用文档>
  • 其他资料>
  • ImageVerifierCode 换一换
    首页 沃文网 > 资源分类 > DOC文档下载
    分享到微信 分享到微博 分享到QQ空间

    模拟时钟程序设计.doc

    • 资源ID:833941       资源大小:125.39KB        全文页数:29页
    • 资源格式: DOC        下载积分:20积分
    快捷下载 游客一键下载
    账号登录下载
    微信登录下载
    三方登录下载: QQ登录 微博登录
    二维码
    微信扫一扫登录
    下载资源需要20积分
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP,下载更划算!
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    模拟时钟程序设计.doc

    1、摘 要模拟电子时钟主要就是对电子时钟4个功能模块的组成进行编程。对电子时钟的界面显示模块,时钟动画处理模块,数字时钟处理模块。界面显示模块主要调用了C语言图形系统函数和字符屏幕处理函数画出时钟程序的主面。按键控制处理模块第一是读取用户按键的键值。第二是通过对键盘按键值的判断,执行相应的操作。时钟动画处理模块是通过对相关条件的判断和时钟指针坐标值的计算,完成时,分,秒指针的擦除和重绘。以及最后的数字处理模块是实现数字时钟的显示和数字时钟的修改。关键词 :C语言;电子时钟;WIN-TC;29目 录(参考一)第一章 综述411 课题的现实意义412 软件环境413 硬件环境414 项目人员分工4第二

    2、章 系统设计流程图521 系统流程图522 主要功能表5第三章 系统分析和设计831 图形的绘制和输出832 文本的输出显示8 33 计算函数的调用834 程序的运行和退出10第四章 系统测试1141 系统测试1142 调试1143 错误原因分析一1144 错误原因分析二11第五章 用户使用说明书1451 运行WIM-TC程序进入系统界面 1452 系统的使用14 53 退出程序14 第六章 工作总结15第七章 源代码 16 参考文献28第一章 综述1.1课题的现实意义: 随着社会的进步和科技的发展,电子钟表业成为了我们生活中不可缺少的一部分。特别是应用在如火车站之类的公共场所,其用途不言而喻

    3、。在此,我们介绍一个电子时钟的设计和实现,模拟windows自带的时钟。1.2软件环境:WINTC;C语言,Windows开发环境;1.3硬件环境: 学校台式电脑1.4项目人员分工: 界面设计-刘丹,程序设计-林帅键界面设计:在颜色搭配的发面,其中也遇到了一点小麻烦,就是在搭配秒针颜色的时,运行的时候秒针走的所有路径都会留下痕迹,开始的时候秒针的颜色只能选择深灰色,其他的颜色都会出现路径走时痕迹的出现,这时候就应该考虑到在编写程序中这个数字代号是否已经被其他的名称所使用了。程序设计:程序应该分模块编译才能提高效率。弄懂程序流程图,可以在最短时间发现错误。实验报告的部分处理:对实验数据报告的整体

    4、思路的流程的粗矿处理和填写。PPT的大体制作:在PPT中主要是根据对我们这次模拟时钟的主要思路,从而我们也是编写程序的主要步骤,在其中我们也注明了一些在模拟时钟出现的一些错误的原因。 第二章 系统设计流程图21系统设计原理图 程序流程图如下所示退出程序开始进入图形界面绘绘制主体框界面绘制电子时钟界面绘制帮助界面调用时钟处理程序结束(图1)2.2 主要功能表如下所示电子时钟 按键控制模块数字动画处理模块界面显示模块时钟动画处理模块 (图2)界面显示模块:电子时钟界面显示在调用时钟运行处理之前完成,在这里主要调用C语言图形系统函数和字符屏幕处理函数画出时钟程序的主界面,主界面包括类似windows

    5、自带的电子时钟的界面和帮助界面两部分。按键控制模块:按键控制模块主要完成两部分功能。第一,读取用户按键的键值。第二,通过对键盘按键值的判断,执行相应的操作,如光标、修改时间。时钟动画处理模块:它通过对相关条件的判断和时钟指针指标值的计算,完成时、分、秒指针的擦除和重绘,以达到模拟时钟运转的功能。数字时钟处理模块:主要实现了数字时钟的显示和数字时钟的修改。其中,在数字时钟的修改中,用户可先按Tab键定位需要修改内容的位置,然后通过按光标上移或下移键来修改当前时间。第三章 系统分析与设计3.1 图形的绘制与输出函数(1)图形方式的初始化通过函数initgraph来完成。其调用格式为:Innitgr

    6、aph(*gdriver, *gmode,*path);函数initgraph是通过从磁盘上装入一个图形驱动程序来初始化图形系统,并将系统设置为图形方式。其中3个参数含义如下:gdriver是一个整型值,用来指定要装入的图形驱动程序。gmode是一个整型值,用来设置图形显示模式。path是一个字符串,用来指明图形驱动所在的路径。如果路径为C:TC,则写在参数中则为“C:TC”. (2)line函数:用来指定两个点之间画一条直线,其调用格式为:line(int x1, int y1, int x2 , int y2);其中(x1,y1)和(x2,y2)分别为直线的两个端点坐标。(3)arc函数:

    7、用来画圆弧,其调用格式为:arc(int x, int y, int angs, int ange, int r);其中(x,y)为圆弧所在的圆心的坐标,angs,ange分别为圆弧的起始角和终止角,单位为“度”,r圆弧的半径(4)circle函数:该函数用来指定圆心和半径画圆。其调用格式为:circle(int x, int y, int r);其中x,y为指定圆心的坐标,r为圆的半径。(5)cleardevice():清屏使用该函数,它的作用就是清除全屏幕,并将当前点位置设置与屏幕的左上角(0,0)。执行后原先的视图不再存在。(6)closegraph():其作用是释放所有图形系统的分配存

    8、储区,恢复到调用initgraph之前状态。(7)setlinestyle():该函数用于设置当前绘图所用的线型与宽度,这些设置仅限于对直线类图形有效。其调用格式为:setlinestyle(int sty, int pat, int b);其3个参数的含义如下:sty用来定义所画直线类型,pat用于用户自定义类型,b指定所画直线粗细。(8)setbkcolor():该函数用来设置背景色,其功能是设置绘图时的背景颜色。其调用格式如下:setbkcolor(int color),其中参数color代表所取颜色,可以为整型常数,也可以为符号常数。(9)setcolor(int color):该函数

    9、用来设置前景色,即绘图用的颜色,其调用格式与“setbkcolor”相同。3.2 文本的输出显示其中调用outtextxy函数,outtextxy函数用来在(X,Y)位置输出一个字符串。其调用格式为:outtextxy(int x, int y , char *text );其中参数(x,y)为指定位置坐标,text为待输出的字符串。3.3计算函数的调用调用clockhandle()函数:(1) 程序中旧时钟指针的去除是借助setwritemode(mode)函数设置画线的方式来实现的。如果mode=1,则表示画线是用当前特性的线与所画之处的线进行异或操作,实际上画出的线是原有线与现在规定的线

    10、进行异或后的结果。因此,当线的特性不变,进行两次画线操作相当于没画线,即在当前位置处清除了原来的画线。(2) bioskey()为直接使用BIOS服务的键盘接口函数。其原型为:int bioskey(int cmd),cmd的值决定执行什么操作,当cmd=0时,bioskey()返回下一个在键值,如果按下一个键则返回一个非零值,否则返回0值;当cmd=2时,bioskey()Shift,Ctril,Alt,ScrollLock,NumLock,CapLock,Insert键的使用状态。(3)time结构体struct timeunsigned char ti_min;/*分钟*/unsigne

    11、d char ti_hour;/*小时*/unsigned char ti_hund;/*百分之一秒*/unsigned char ti_sec;/*秒*/;time 结构体定义在dos.h文件中,用来保存当前系统时间(4)gettime(struct time*t):该函数用于获取系统时间。(5)settime(t):用于设置新的系统时间。(6)数字时钟处理函数:digithour(double);/*将小时数转换成整型*/digitmin(double);/*将分钟数转换成整型*/ digitsec(double);/*将秒数转换成整型*/digitclock(int, int, int)

    12、;/*在指定位置显示时间*/(7)按键处理函数:keyhandle(int key, int count);/*按键处理*/drawcursor(int count);/*根据count的值画一个光标*/clearcursor(int count);/*消除光标*/timeupchange(int count);/*处理光标上移*/timedownchange(int count);/*处理光标下移3.4程序的运行和退出打开WIN-TC软件,新建个文件,将程序复制到软件上,运行程序显示下页界面,按ESC可退出程序。进入图形界面,按TAB键可切换光标在时分秒间的位置,按方向键可调节可调节光标相应

    13、位置时分秒的值。第四章 系统测试4.1系统测试打开WIN-TC软件先进行编译检查语法是否有错误,确认语法正确再运行程序。4.2调试问题一: 程序不显示只是闪过问题二:程序无法正常退出;问题三:图形文件打不开,显示如下代码:“”linker error:unable to open input file Cos.OBJ ; 问题四:图形才画到一半就结束运行;问题五:调试分钟的时候时钟出现问题,时钟分钟不同步;4.3 错误原因分析一软件篇问题一:在Window2000以上版本运行WIN-TC软件是应在其后面的输入语句添加getch().以便让程序可以停顿一下。问题三:将其文件保存在桌面上,导致路径

    14、设置错误。可以再新建个模板,将源代码复制到模板上,默认保存后运行程序问题四:没有调用相关的头文件(#include ),导致当程序调用到与该头文件有关的程序时出错。 4.4错误原因分析二算法篇问题二:程序出现死循环,检查一下循环语句的算法,发现如下循环语句for(count=2;count!=Esc;) 应将其改为for(count=2;k!=Esc).问题五:算法还不够完善,原先算法如下,由于程序中m=t0.ti_min, 导致后面的条件语句(if(t0.ti_hour*60+t0.ti_min)!=(h*60+m))中的m值发生变化,致使调节分钟值的时候时钟无法同步:因此因在设置一个变量r

    15、来收上一个m的值,故改进算法如下所示然而算法仍然不够完善,分钟转完一圈,时钟又要回到原点,由于t0.ti_hour=60时,m=0.导致程序不够完善,故再改进算法如下所示:if(t0.ti_min!=m)/*如果分钟有变化*/ /*消除当前分钟*/setcolor(15);/*白色*/ setlinestyle(0,0,3);x1=80*sin(m/30*PI)+451;y1=200-80*cos(m/30*PI); line(451,200,x1,y1); /*绘制新的分钟*/ r=m;/*第一次改进*/ m=t0.ti_min;digitclock(446,318,digitmin(m);

    16、/*数字时钟显示分钟*/x1=80*sin(m/30*PI)+451; y1=200-80*cos(m/30*PI); line(451,200,x1,y1); else r=m;/*第一次改进*/*小时处理*/if(t0.ti_hour*60+t0.ti_min)!=(h*60+r) /*消除当前时钟*/ setcolor(15);x=50*sin(h*60+r)/360*PI)+451;/*第一次改进*/y=200-50*cos(h*60+r)/360*PI);/*第一次改进*/setlinestyle(0,0,3);line(451,200,x,y);/*绘制新的时钟*/ if(m=0&

    17、r=59) t0.ti_hour+; settime(t);/*第二次改进*/if(m=59&r=1)/*第二次改进*/ t0.ti_hour-; settime(t); h=t0.ti_hour;digitclock(408,318,digithour(h);x=50*sin(h*60+m)/360*PI)+451;y=200-50*cos(h*60+m)/360*PI);line(451,200,x,y); 第五章 用户使用说明书5.1用户使用说明书 5.1 打开WINTC软件,新建个模板,将源代码复制到程序上。先编译该程序,默认保存路径,运行程序进入图形界面。5.2 按TAB键改变切换光

    18、标在数字时钟时分秒间的位置,按上下键改变其光标相应位置的值。5.3 如果想退出程序,则按ESC键,即可退出程序。第六章 工作总结第一次写这么长程序确实是一件很容易让人烦躁的一件事,特别是程序调试不出来的那会时间。有时候一个小小的错误竟然要花半天时间才能检查出来。程序的调试过程中伴随更多的是烦躁与错误,你得去了解计算机,得用计算机的语言来指导计算机执行相应的操作,着实是一件让人很头疼的事。要想当一名优秀的程序员,确实不能急躁,因为人一旦急躁,就没办法冷静下来分析,这会大大降低工作效率。只有冷静下来你才能在最短的时间内最准确的找出问题所在,而不是在一边盲目的调试。 看样子,以后得好好培养自己的性格

    19、,多动手实践,才可以提高自己的编程能力。第七章 源代码#include#include#include#include#define PI 3.141592653#define UP 0x4800 /*上移键修改时间*/#define DOWN 0x5000/*下移键修改时间*/#define ESC 0x11b/*推出系统*/#define TAB 0xf09/*移动光标*/*函数声明*/void clockhandle();/*时钟处理*/int digithour(double);/*将小时数转换成整型*/int digitmin(double);/*将分钟数转换成整型*/int dig

    20、itsec(double);/*将秒数转换成整型*/void digitclock(int, int, int);/*在指定位置显示时间*/int keyhandle(int key, int count);/*按键处理*/void drawcursor(int count);/*根据count的值画一个光标*/void clearcursor(int count);/*消除光标*/int timeupchange(int count);/*处理光标上移*/int timedownchange(int count);/*处理光标下移*/double h,m,s;/*全局变量时,分,秒*/dou

    21、ble x,x1,x2,y,y1,y2;/*全局变量坐标值*/struct time t1;/*定义时间结构体*/void main()int driver,mode=0,i,j;driver=DETECT;/*自动检测显示设备*/initgraph(&driver,&mode,c:tc);/*初始化图形系统*/cleardevice();setlinestyle(0,0,3);setbkcolor(0);/*用调色板设置当前背景颜色*/line(82,430,558,430);line(70,62,70,418);line(82,50,558,50);line(570,62,570,418)

    22、;line(70,62,570,62);line(76,56,297,56);line(340,56,564,56);/*画主体框架边直线*/*画主体框的边角*/arc(82,62,90,180,12);setlinestyle(0,0,3);arc(558,62,0,90,12);setlinestyle(0,0,3);arc(82,418,180,279,12);setlinestyle(0,0,3);arc(558,418,270,360,12);setcolor(15);outtextxy(300,53,CLOCK);/*显示标题*/setcolor(7);setlinestyle(0

    23、,0,3);line(392,310,510,310);line(392,330,540,330);arc(392,320,90,270,10);setlinestyle(0,0,3) ;arc(510,320,270,90,10);/*绘制电子动画时钟下的数字时钟边框架*/*绘制时钟的时分秒的分隔符*/setcolor(15);for(i=431;i=470;i+=39) for(j=317;j=324;j+=7)setlinestyle(0,0,3);circle(i,j,1);setcolor(15);line(424,315,424,325);/*运行时钟前先画一个光标*/*绘制时钟的

    24、原点*/for(i=0,m=0,h=0;i=11;i+,h+)x=100*sin(h*60+m)/360*PI)+451;y=200-100*cos(h*60+m)/360*PI);setlinestyle(0,0,3);circle(x,y,1);/*绘制表示分钟或秒钟的原点*/for(i=0,m=0;i=59;m+,i+)x=100*sin(m/30*PI)+451;y=200-100*cos(m/30*PI);setlinestyle(0,0,1);circle(x,y,1);setlinestyle(0,0,3);setcolor(15);circle(451,200,103);/*在

    25、电子表的左边打印帮助提示信息*/setcolor(15);outtextxy(182,125,help);outtextxy(140,185,Tab : Cursor move);outtextxy(140,225,Up : Time +);outtextxy(140,265,Down: Time -);outtextxy(140,305,Esc : Quit system!);outtextxy(140,345,window XP);outtextxy(150,400,Time is everything!);clockhandle();/*开始调用时钟处理程序*/getch();close

    26、graph();void clockhandle()double r;int k=0,count;setcolor(15);gettime(t);/*取得系统时间*/h=t0.ti_hour;m=t0.ti_min;x=50*sin(h*60+m)/360*PI)+451;/*时钟X的坐标*/y=200-50*cos(h*60+m)/360*PI);/*时钟Y的坐标*/setlinestyle(0,0,3);line(451,200,x,y);/*绘制时钟*/x1=80*sin(m/30*PI)+451;/*分钟的X坐标*/y1=200-80*cos(m/30*PI);/*分钟的Y坐标*/li

    27、ne(451,200,x1,y1);/*绘制分钟*/digitclock(408,318,digithour(h);/*在数字时钟显示小时*/digitclock(446,318,digitmin(m);/*在数字时钟显示分钟*/setwritemode(1);for(count=2;k!=ESC;) setcolor(15); sound(500); delay(700); sound(200); delay(300); nosound(); s=t0.ti_sec; m=t0.ti_min; h=t0.ti_hour; setlinestyle(0,0,1); x2=98*sin(s/30

    28、*PI)+451;/*秒钟的X坐标*/ y2=200-98*cos(s/30*PI);/*秒钟的Y坐标*/ line(451,200,x2,y2);/* 绘制秒钟*/ /*利用此循环,延时一秒*/ while(t0.ti_sec=s&t0.ti_min=m&t0.ti_hour=h) gettime(t);/*取得系统时间*/ if(bioskey(1)!=0) k=bioskey(0); count=keyhandle(k,count); if(count=5) count=1; setcolor(15); digitclock(485,318, (digitsec(s)+1) ; setl

    29、inestyle(0,0,1); x2=98*sin(s/30*PI)+451; y2=200-98*cos(s/30*PI); line(451,200,x2,y2); /*消除当前秒钟*/ /*分钟处理*/ if(t0.ti_min!=m)/*如果分钟有变化*/ /*消除当前分钟*/ setcolor(15);/*白色*/ setlinestyle(0,0,3); x1=80*sin(m/30*PI)+451; y1=200-80*cos(m/30*PI); line(451,200,x1,y1); /*绘制新的分钟*/ r=m; m=t0.ti_min; digitclock(446,3

    30、18,digitmin(m);/*数字时钟显示分钟*/ x1=80*sin(m/30*PI)+451; y1=200-80*cos(m/30*PI); line(451,200,x1,y1); else r=m; /*小时处理*/ if(t0.ti_hour*60+t0.ti_min)!=(h*60+r) /*消除当前时钟*/ setcolor(15); x=50*sin(h*60+r)/360*PI)+451; y=200-50*cos(h*60+r)/360*PI); setlinestyle(0,0,3); line(451,200,x,y); /*绘制新的时钟*/ if(m=0&r=5

    31、9) t0.ti_hour+; settime(t); if(m=59&r=1) t0.ti_hour-; settime(t); h=t0.ti_hour; digitclock(408,318,digithour(h); x=50*sin(h*60+m)/360*PI)+451; y=200-50*cos(h*60+m)/360*PI); line(451,200,x,y); getch(); closegraph(); /*数字时钟处理函数*/void digitclock(int x, int y, int clock)char buffer110; setfillstyle(0,2)

    32、; bar(x,y,x+15,328); if(clock=60) clock=0; sprintf(buffer1,%d,clock); outtextxy(x,y,buffer1);int digithour(double h)int i;for(i=0;i=23;i+)if(h=i) return i;int digitmin(double m)/*分钟*/int i; for(i=0;i=59;i+) if(m=i) return i; int digitsec(double s)int i;for(i=0;i=59;i+) if(s=i) return i; /*时钟按键处理函数*/

    33、 int keyhandle(int key, int count)/*根据输入键执行相应操作*/switch(key) case UP: timeupchange(count-1);break; case DOWN:timedownchange(count-1);break; case TAB:setcolor(15); clearcursor(count);/*消除原来的光标*/ drawcursor(count);/*显示一个新的光标*/ count+; break; return count;void drawcursor(int count)/*根据count的值画一个光标*/swi

    34、tch(count) case 1:line(424,315,424,325);break; case 2:line(465,315,465,325);break; case 3:line(505,315,505,325);break; void clearcursor(int count)switch(count) case 2:line(424,315,424,325);break; case 3:line(465,315,465,325);break; case 1:line(505,315,505,325);break; int timeupchange(int count)/*处理光

    35、标上移*/ if(count=1) t0.ti_hour+; if(t0.ti_hour=24) t0.ti_hour=0; settime(t); if(count=2) t0.ti_min+; if(t0.ti_min=60) t0.ti_min=0; settime(t); if(count=3) t0.ti_sec+; if(t0.ti_sec=60) t0.ti_sec=0; settime(t); int timedownchange(int count)/*处理光标下移*/ if(count=1) t0.ti_hour-; if(t0.ti_hour=0) t0.ti_hour=23; settime(t); if(count=2) t0.ti_min-; if(t0.ti_min=0) t0.ti_min=59; settime(t); if(count=3) t0.ti_sec-; if(t0.ti_sec=0) t0.ti_sec=59; settime(t); 参考文献1 王蕾. 模拟时钟转动程序课程设计报告EB/OL. 2C语言实例解析精粹(第二版)(人民邮电出版社)曹衍龙,林瑞仲,徐慧 编著3C语言课程设计案例精编(第二版)(清华大学出版设)吴启武 刘勇 王俊峰 薛欣


    注意事项

    本文(模拟时钟程序设计.doc)为本站会员(精***)主动上传,沃文网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知沃文网(点击联系客服),我们立即给予删除!




    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服点击这里,给沃文网发消息,QQ:2622162128 - 联系我们

    版权声明:以上文章中所选用的图片及文字来源于网络以及用户投稿,由于未联系到知识产权人或未发现有关知识产权的登记,如有知识产权人并不愿意我们使用,如有侵权请立即联系:2622162128@qq.com ,我们立即下架或删除。

    Copyright© 2022-2024 www.wodocx.com ,All Rights Reserved |陕ICP备19002583号-1

    陕公网安备 61072602000132号     违法和不良信息举报:0916-4228922