模拟时钟转动程序
- 格式:doc
- 大小:366.50 KB
- 文档页数:17
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不显示)状态。
教学目标:1、学会循环和判断嵌套积木的综合使用;2、能运用pen模块和脚本积木制作一个转动的钟表;3、体会利用程序快捷和精准绘制图形的方法,以及利用时间控制指针转动的技巧。
教学重难点:能运用pen模块和脚本积木制作一个转动的钟表。
教学过程:一、情景导入同学们,在我们实际生活中时间是最宝贵的,平时我们看到的时钟是不停的转动来提示我们时间段该做什么事情了,今天我们就用Scraino软件中的嵌套积木来设置下如何是时钟转动起来。
二、引导探究,学习新知(一)表盘绘制有妙招1、先绘制两个圆作为圆盘。
2、再用程序绘制里面的刻度线。
3、刻度线是均匀分布的,通过计算可以知道每条线的间隔度数。
4、一圈360度,12个大格每个大格30度,60个小格每个小格6度。
5、用图章积木来绘制,添加Pen扩展积木。
6、分别给两个直线角色(刻度)添加积木程序。
(二)时间控制指针转如何用Scraino模块中的嵌套积木进行指针转动呢?1、使用绘图编辑器分别绘制时针、分针和秒针三个角色。
2、将表针移动到相应的位置。
3、分别给指针角色添加相应的命令积木。
4、真阳一个会根据当前时间走动的钟表就完成了!(三)重要的事情说三遍画表时,要注意朝正右方绘制,还要注意绘制的位置,在绘图编辑器中选择椭圆工具,按下shift键在进行绘制,可以画出正圆。
(四)练习阶段使用嵌套积木试试自主的设置下一个钟表吧。
三、感悟新知,综合练习分组合作设置下不同形状的钟表(难度较高,适宜而止)。
学生展示,交流作品。
四、课堂总结同学们,今天我们的收获真不少,其实Scraino的有趣和神奇不止这些,让我们期待下次更精彩的内容。
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. 指针转动逻辑现在我们可以编写一个主函数来模拟时钟指针的转动逻辑。
//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程序结束。
以下是一个简单的使用Python和turtle库来创建一个模拟时钟的代码。
这个时钟将显示当前的时间,并且每秒更新一次。
python复制代码import turtleimport timewin = turtle.Screen()win.setup(width=600, height=600)win.bgcolor("black")# 创建一个新的Turtle对象clock_turtle = turtle.Turtle()clock_turtle.hideturtle()# 循环每秒更新一次时间while True:# 获取当前时间current_time = time.strftime("%H:%M:%S")# 清空屏幕win.clear()# 画时钟的边框clock_turtle.penup()clock_turtle.goto(-200, -200)clock_turtle.pendown()clock_turtle.circle(400)# 画时钟的小时数clock_turtle.penup()clock_turtle.goto(-100, -150)clock_turtle.pendown()clock_turtle.setheading(0)clock_turtle.forward(200)clock_turtle.setheading(90)clock_turtle.forward(100)clock_turtle.setheading(180)clock_turtle.forward(200)clock_turtle.setheading(270)clock_turtle.forward(100)# 画时钟的分钟数clock_turtle.penup()clock_turtle.goto(-50, -150)clock_turtle.pendown()clock_turtle.setheading(0)clock_turtle.forward(150)clock_turtle.setheading(90)clock_turtle.forward(100)clock_turtle.setheading(180)clock_turtle.forward(150)clock_turtle.setheading(270)clock_turtle.forward(100)# 画时钟的秒钟数clock_turtle.penup()clock_turtle.goto(0, -150)clock_turtle.pendown()clock_turtle.setheading(0)clock_turtle.forward(120)clock_turtle.setheading(90)clock_turtle.forward(100)clock_turtle.setheading(180)clock_turtle.forward(120)clock_turtle.setheading(270)clock_turtle.forward(100)# 显示时间文本clock_turtle.penup()clock_turtle.goto(-150, -80)clock_turtle.pendown()clock_turtle.color("white")clock_turtle.write(current_time, font=("Arial", 24, "normal")) # 显示时间文本,字体大小为24,正常样式显示文本。
基于LabVIEW的闹钟程序编写目的:用LabVIEW软件编写一个小的闹钟程序,要满足有以下功能:●可以实现时钟即时显示●添加万年历显示●添加闹钟自动屏蔽周末●可手动设置闹铃工作日仪器设备简介:LabVIEW(Laboratory VirtualInstrumentEngineeringWorkbench)是一种用图标代替文本行创建应用程序的图形化编程语言。
传统文本编程语言根据语句和指令的先后顺序决定程序执行顺序,而LabVIEW 则采用数据流编程方式,程序框图中节点之间的数据流向决定了VI及函数的执行顺序。
VI指虚拟仪器,是LabVIEW 的程序模块。
LabVIEW是图形化编程语言,也是第三代的编程语言,LabVIEW是一种程序开发环境,由美国国家仪器(NI)公司研制开发的,类似于C和BASIC开发环境,但是LabVIEW与其他计算机语言的显著区别是:其他计算机语言都是采用基于文本的语言产生代码,而LabVIEW使用的是图形化编辑语言G编写程序,产生的程序是框图的形式。
LabVIEW提供很多外观与传统仪器(如示波器、万用表)类似的控件,可用来方便地创建用户界面。
用户界面在LabVIEW中被称为前面板。
使用图标和连线,可以通过编程对前面板上的对象进行控制。
这就是图形化源代码,又称G 代码。
LabVIEW的图形化源代码在某种程度上类似于流程图,因此又被称作程序框图代码。
步骤及内容:1)实时时间的显示实时时间的显示采用表盘式,表盘式的采用LabVIEW自带的转盘控件具体如下图所示。
图1 表盘式时钟在这里需要说明的是,软件自带的量表控件只有一根指针,需在属性中添加指针变成三个指针(分针、时针、秒针),但是指针长短是一样的,这样便无法区分时针分针,这里采用一种简单的办法来实现区分时针、分针的转盘,原理就是建立两个转盘控件,一个作为秒针以及分针,另一个作为时针,同时时针控件通过自定义删除除指针之外的所有东西,然后将之覆盖在分针、秒针表盘上面,变成为如上所示的时钟转盘。
简单的51单片机时钟程序,可以通过按键来设置时间,按键可以自己更改。
#include<reg52.h>#define uint unsigned int#define uchar unsigned char#define tt 46080 //设置时间间隔,对应11.0592MHZ的晶振uchar code table[]="Happy every day!";uchar code table1[]="00:00:00";uchar num,hh,mm,ss,t,s1num=0;sbit en=P3^4;sbit rs=P3^5;sbit rw=P3^6;sbit s1=P3^0;sbit s2=P3^1;sbit s3=P3^2;//按键所用的端口sbit s4=P3^3;void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--); //大约是1ms,因为单片机的时钟周期为11.0592mhz。
}void write_com(uchar com){rs=0; //指令P0=com; //写指令函数delay(1);en=1;delay(1);en=0;}void write_data(uchar dat){rs=1; //数据P0=dat; //写指令函数delay(1);en=1;delay(1);en=0;}void init(){en=0; //初始时使能为0rw=0;write_com(0x38); //显示屏模式设置为1602方案write_com(0x0c);write_com(0x06); //显示开关/光标设置write_com(0x01); //清屏write_com(0x80); //指针置零for(num=0;num<16;num++)write_data(table[num]);write_com(0xc3);for(num=0;num<8;num++)write_data(table1[num]);}void dingshi(){TMOD=0x01; //确定定时器工作模式(定时模式)TH0=(65536-tt)/256; //赋初值为tt微秒TL0=(65536-tt)%256; //不赋值时默认其值是0EA=1; //开总中断ET0=1; //开定时器0中断// IE=0x82; //总线写法TR0=1; //启动定时器0 总线TCON=0x10;}void shuanxin(uchar add,uchar date){uchar shi,ge;write_com(0xc3+add); //指针指向shi=date/10;ge=date%10;write_data(0x30+shi);write_data(0x30+ge); //指针自动后移,故不必再写指针位置}/***************借助蜂鸣器接地起作用***************/ void keyscan(){if(s1==0){delay(5);if(s1==0){s1num++;while(!s1);if(s1num==1){TR0=0; //时钟停止运行write_com(0xca); //指针指向sswrite_com(0x0f); //光标闪烁}if(s1num==2){write_com(0xc7); //指针指向mmwrite_com(0x0f);}if(s1num==3){write_com(0xc4); //指针指向hhwrite_com(0x0f);}if(s1num==4){s1num=0;TR0=1; //时钟运行write_com(0x0c); //取消闪烁}}}/***************调节时间****************/if(s1num!=0) //目的是使s1按下的前提才起作用{if(s2==0){delay(5);if(s2==0){while(!s2); //松手检测,松手后方可向下执行if(s1num==1){ss++;if(ss==60)ss=0;shuanxin(6,ss);write_com(0xca);}if(s1num==2){mm++;if(mm==60)mm=0;shuanxin(3,mm);write_com(0xc7);}{hh++;if(hh==24)hh=0;shuanxin(0,hh);write_com(0xc4);}}}}if(s1num!=0) //s1按下的前提才起作用{if(s3==0){delay(5);if(s3==0){while(!s3);if(s1num==1){ss--;ss=59;shuanxin(6,ss);write_com(0xca);}if(s1num==2){mm--;if(mm==-1)mm=59;shuanxin(3,mm);write_com(0xc7);}if(s1num==3){hh--;if(hh==-1)hh=23;shuanxin(0,hh);write_com(0xc4);}}}}if(s1num!=0) //s1按下的前提才起作用{if(s4==0){delay(5);if(s4==0){while(!s4);if(s1num==1){ss=0;shuanxin(6,ss);write_com(0xca);}if(s1num==2){mm=0;shuanxin(3,mm);write_com(0xc7);}if(s1num==3){hh=0;shuanxin(0,hh);write_com(0xc4);}}}}}void main(){init();dingshi();while(1){keyscan();if(t==20){P1=P1-1;t=0;ss++;if(ss==60){ss=0;mm++;if(mm==60){mm=0;hh++;if(hh==24){hh=0;}shuanxin(0,hh);}shuanxin(3,mm);}shuanxin(6,ss);}}}void time0() interrupt 1{TH0=(65536-tt)/256; //不赋值时默认其值是0 TL0=(65536-tt)%256;t++;}。
计算机图形学基础教程孔令德课后答案【篇一:大学计算机图形学课程设】息科学与工程学院课程设计任务书题目:小组成员:巴春华、焦国栋成员学号:专业班级:计算机科学与技术、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年,二维动画是计算机动画研究的重心,同时,二维动画也被应用于教学演示和辅助传统的动画片制作。
第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”。
摘要模拟电子时钟主要就是对电子时钟4个功能模块的组成进行编程。
对电子时钟的界面显示模块,时钟动画处理模块,数字时钟处理模块。
界面显示模块主要调用了C语言图形系统函数和字符屏幕处理函数画出时钟程序的主面。
按键控制处理模块第一是读取用户按键的键值。
第二是通过对键盘按键值的判断,执行相应的操作。
时钟动画处理模块是通过对相关条件的判断和时钟指针坐标值的计算,完成时,分,秒指针的擦除和重绘。
以及最后的数字处理模块是实现数字时钟的显示和数字时钟的修改。
关键词:C语言;电子时钟;WIN-TC;目录(参考一)第一章综述 (4)1.1 课题的现实意义 (4)1.2 软件环境 (4)1.3 硬件环境 (4)1.4 项目人员分工 (4)第二章系统设计流程图 (5)2.1 系统流程图 (5)2.2 主要功能表 (5)第三章系统分析和设计 (8)3.1 图形的绘制和输出 (8)3.2 文本的输出显示 (8)3.3 计算函数的调用 (8)3.4 程序的运行和退出 (10)第四章系统测试 (11)4.1 系统测试 (11)4.2 调试 (11)4.3 错误原因分析一 (11)4.4 错误原因分析二 (11)第五章用户使用说明书 (14)5.1 运行WIM-TC程序进入系统界面 (14)5.2 系统的使用 (14)5.3 退出程序 (14)第六章工作总结 (15)第七章源代码 (16)参考文献 (28)第一章综述1.1课题的现实意义:随着社会的进步和科技的发展,电子钟表业成为了我们生活中不可缺少的一部分。
特别是应用在如火车站之类的公共场所,其用途不言而喻。
在此,我们介绍一个电子时钟的设计和实现,模拟windows自带的时钟。
1.2软件环境:WINTC;C语言,Windows开发环境;1.3硬件环境:学校台式电脑1.4项目人员分工:界面设计--------刘丹,程序设计--------林帅键界面设计:在颜色搭配的发面,其中也遇到了一点小麻烦,就是在搭配秒针颜色的时,运行的时候秒针走的所有路径都会留下痕迹,开始的时候秒针的颜色只能选择深灰色,其他的颜色都会出现路径走时痕迹的出现,这时候就应该考虑到在编写程序中这个数字代号是否已经被其他的名称所使用了。
集中上机实习报告指导教师:王利姓名:赵蕊学号: 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格引起时针运动一格,而因此应该使用一个定时器消息来处理指针的运动。
时钟转动巧设计尊敬的评委老师,大家上午好我是号考生,今天我试讲的题目是《时钟转动巧设计》,下面开始我的试讲。
上课,同学们好,请坐。
一、导入新课师:上课开始,老师给大家带来一段小视频,请欣赏。
师:通过视频大家发现了什么?师:嗯,里面有各式各样的表。
大家更喜欢哪一种啊?为什么呢?师:前排举手的女生,你来说师:哦,她喜欢机械表,喜欢听表针滴答滴答运转的声音,大家也是一样吗?师:嗯,既然这样,我们能不能用SerainC)软件设计程序模拟机械表,让表针转起来呢?师:如何设计呢?就让我们带着这个疑问一起走进今天的新课《时钟转动巧设计》去寻找答案吧!二、自主探究师:同学们,请看大屏幕上的表盘,如果要制作一个钟表,需要解决什么问题啊?师:后面那位男生,你来说!、师:哦,他说一是要先绘制表盘,二是让时针、分钟、秒针随时间变化绕表盘转动。
师:嗯,你真善于分析问题。
请坐。
师:那就让我们开始今天的第一个任务,去绘制表盘吧!师:在绘制前啊,老师两个温馨提示。
第一,虽然SCrainO绘图功能很强大,但要绘制刻度较多且均匀分布的表盘不是一件容易的事,用程序绘制更方便。
第二,在画大格小格的时候可以用Pen扩展模块中的图章积木来完成。
师:好,接下来,就请同学们自行研读课本,参照活动指导,独立完成任务1吧!师:看到大家都端正了坐姿,想必大家都已经完成了,谁来给大家分享一下呢?师:前排这位同学举手最快,我来分享吧!师:哦,1、他先是在造型区绘制了两个大小不同的正圆做为圆盘,大家注意,他在画圆的时候按了哪个键,对,是Shift键。
2、第二步,绘制了两个直线角色分别代表小时和分钟的刻度。
3、第三步,添加pen扩展积木。
4、第四步,给两个直线角色添加积木程序。
小时的角色,先是添加移动到积木,然后清除落笔,下面是旋转和图章积木并且是重复12次,因为一周是360度,所以修改角度为30度。
分钟角色和小时角色基本上一样,就是把旋转角度改为了6度。
模拟时钟程序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消息,而这个时间间隔可由用户指定。
一·功能1、计时功能,数码管显示数值从00:00:00--23:59:59循环替换,且周期时间与实际时间吻合。
2、定时闹钟功能,按下“定时”键后,可以设定所需要的任意时间,定时完成后,当到达设定时间后,蜂鸣器发声。
3、调整时间功能,根据此项功能可将时钟调至正确的时间。
4、查看定时功能,当设定完成后可以查看上次定时的时间,且能在此基础上进行重新定时。
二·按键说明设定键:按一次开始设定时间,并将设定过程显示在数码管上。
若未按此键,则其他按键无效。
设定过程中,再按一次此键,定时结束,数码管显示返回时钟。
当第一次按下设定键时,显示值为00:00:00,在此基础上调节定时时间。
第一次设定完成后,以后再按设定键,显示初值则为上次定时的时间。
确定键:在定时过程中按下此键,则保留当前设定的时间为定时时间。
若定时过程未按此键,定时无效。
向上键:按下此键,使得当前设定值在现有数值上加一,当加至满位时,当前值变为零。
向下键:按下此键,使得当前设定值在现有数值上减一,当减至零时,当前值变为满位减一。
向左键:按下此键,使得设定值移向左边一位,若已经在最左边,则移至最右边。
向右键:按下此键,使得设定值移向右边一位,若已经在最右边,则移至最左边。
三·具体操作演示(一)·定时及查看定时演示1.仿真开始。
如图:2、按键如图:3、按下设定键,开始设定时间,如图:4、如图所示,当前设定时位。
按向上键,使数值加一。
5、按下向右键,设定位移至分位。
6、按下向下键,使数字减一。
7、按确定键,确定当前设定的时间。
再按设定键,退出定时,开始时钟显示。
8、设定完成后按设定键,显示前次设定值,可在此基础上重新设定,也可直接再按设定键推出。
9、当时钟运行到设定时间时,蜂鸣器发声。
(二)·调整时间演示1、计时开始。
2、按照定时的方法开始设定时间,使其显示20:10:09。
3、调整到正确时间后,按下确定键不放,同时再按一下设定键,将目前设定值送入时钟,使其开始从设定值计时。
案例五模拟时钟应用程序以实例为背景学习基于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一次),如果采用全屏删除式重绘则闪烁十分明显,显示效果不佳。
课程设计课程名称高级语言程序课程设计题目名称模拟时钟转动程序学生学院自动化学院专业班级自动化06级(2 )班学号 3106000858 学生姓名霍杰英指导教师杨其宇2007年6月18日广东工业大学课程设计任务书题目名称模拟时钟转动程序学生学院自动化学院专业班级自动化06级(2 )班姓名霍杰英学号3106000858一、课程设计的内容要求:能模拟机械钟表行走,还要准确地利用数字显示日期和时间,在屏幕上显示一个活动时钟,按任意键时程序退出。
二、课程设计的要求与数据1、进一步掌握和利用C语言进行程设计的能力;2、进一步理解和运用结构化程序设计的思想和方法;3、初步掌握开发一个小型实用系统的基本方法;4、学会调试一个较长程序的基本方法;5、学会利用流程图或N-S图表示算法;6、掌握书写程序设计开发文档的能力。
三、课程设计应完成的工作1、编写完成相应题目的程序;2、编写课程设计报告,课程设计报告的内容应包括以下6个部分:1) 需求分析:包括设计题目、设计要求以及系统功能需求分析;2) 总体设计:包括系统总体设计框架和系统功能模块图;3) 详细设计:包括主要功能模块的算法设计思路以及对应的工作流程图;4) 调试分析过程描述:包括测试数据、测试输出结果,以及对程序调试过程中存在问题的思考(列出主要问题的出错现象、出错原因、解决方法及效果等,适当的包含结果截图);5) 总结:课程设计完成了哪些功能,有没有什么扩展功能?还有哪些地方需要改进?课程设计过程中的学习体会与收获、对本次课程设计的认识以及自己的建议等内容;6) 附录:主要源程序代码,含必要的注释。
3、答辩:在实验室建立程序运行的环境,并在指导教师的监督下,独立解决问题、运行程序和回答教师提出的问题。
四、课程设计进程安排五、应收集的资料及主要参考文献[1] 谭浩强.C程序设计(第三版)[M],北京:清华大学出版社,2005.9[2] 谭浩强. C程序设计题解与上机指导(第三版)[M],北京:清华大学出版社,2005.7[3] 夏宝岚张慕蓉夏耘.程序设计教程(第二版)[M],上海:华东理工出版社,2003.1[4] 陈锦昌赵明秀.c语言计算机绘图教程(第一版)[M],广州:华南理工大学出版社,1998.9[5] /course/3_program/c/cshl/2007213/21159.html发出任务书日期:2007年 6 月18 日指导教师签名:计划完成日期:2007年 6 月22 日基层教学单位责任人签章:主管院长签章:目录1 设计目的与要求 (5)2 总体设计 (6)3 详细设计 (7)功能模块设计 (7)3.1画出钟表的轮廓 (7)3.2获取系统时间 (7)3.3让时间和声音动起来 (7)4调试分析 (8)5 总结 (11)6 附录 (12)7 答辩记录 (16)8 指导教师意见 (17)1 目的与要求(1) C题目二十九: 模拟时钟转动程序要求:能模拟机械钟表行走,还要准确地利用数字显示日期和时间,在屏幕上显示一个活动时钟,按任意键时程序退出。
课程设计的内容及要求:利用学到的编程知识和编程技巧,通过布置具有一定难度的程序设计题目,帮助学生熟悉程序编写,及时查究错误,独立完成。
总体要求①对系统进行功能模块分析、控制模块分析正确;②系统设计要实用;③编程简练,可用,功能全面,具有较好的健壮性;④说明书、流程图要清楚。
课程设计报告要求①需求和规格说明:问题描述:题目要解决的问题是什么?②设计⊕设计思路:主要算法思想。
⊕总体设计:程序设计组成框图、N-S流程图。
⊕详细设计:模块功能说明(如函数功能、入口及出口参数说明,函数调用关系描述等)。
③调试与测试:调试过程中遇到的主要问题,是如何解决的;对设计和编码的回顾讨论和分析;改进设想;经验和体会等。
④附录:源程序清单和结果。
如果题目规定了测试数据,则结果要包含这些测试数据和运行输出,当然还可以含其他测试数据和运行输出;清单中应有足够的注释。
这系统要求实现能模拟机械钟表行走和准确地利用数字显示日期和时间,所以,为了实现模拟机械钟表行走要应用图形函数,为了实现利用数字显示日期和时间要获取系统时间。
总的而言,课程设计的目的:课程设计为学生提供了一个既动手又动脑,独立实践的机会,将课本上的理论知识和实际应用问题进行有机结合,锻炼学生分析、解决实际问题的能力,提高学生项目开发及程序调试能力。
(2)就我自己的个人而言,由于我自己的课程设计是:模拟时钟转动程序。
与之前的所学内容在实现的方式上有很大的不同,在时间紧,压力大的境况下,我还是将它完成了,所以,写这个程序的过程中,我学到了其他同学不同的知识,而且,也锻炼了我在短时间内学一个之前完全没有接触的工具的能力。
在学习计算机绘图的过程中,我明白到:计算机绘图是计算机技术与传统图形结合而成的一门学科。
今天,随着计算机绘图在现代科学技术各个领域中的广泛应用,计算机绘图课程应成为应用类课程中必不可少的课程。
2 总体设计首先,先画出个钟的大致轮廓。
从输出数字到画出外轮廓,到标出短线到画出时针、分针、秒针。
这个轮廓就已经完成了。
然后,为了更加这个钟的实用性。
就通过获取系统时间来结合实际意义,这是最简单,最好的方法。
从应用上,它显示的是实际的时间,增强了可用性;从编程上,不用再复杂地再编一个更时间一样的函数来,减少程序的篇幅、复杂性和编程者的工作量。
接着顺带利用时间的变量名来画时针,分针,秒针。
最后,为了让时针,分针,秒针让观察者看起来是连续的变化,即形象地模拟真实的机械钟表那样运动,就用函数让时针,分针,秒针跟着时间一齐走动。
而且配有声音,听起来,就真的让观察者有面对着真实的机械钟表一样的感觉。
又考虑到人的视觉上和听觉上与实际上的差异,程序不是严格上的一秒、一秒地运行。
看起来更逼真,而听起来又与画面同步,没有了那种一快一慢的感觉。
3 详细设计功能模块设计3.1画出钟表的轮廓:1)钟表的外轮廓 (类似于右图circle(300,240,200);circle(300,240,205);circle(300,240,5);2)画出钟内的短线x1=200*sin(i*6*pi/180)+300;y1=200*cos(i*6*pi/180)+240;x2=(200-l)*sin(i*6*pi/180)+300;y2=(200-l)*cos(i*6*pi/180)+240;line(x1,y1,x2,y2);3)画出时针、分针、秒针d(150,n,30);d(170,m,6);d(190,s,6);3.2 获取系统时间getdate(d);gettime(t);3.3让时间和声音动起来1)时间时针d(150,h,30);h=t[0].ti_hour;d(150,h,30);分针d(170,m,6);m=t[0].ti_min;d(170,m,6);秒针d(190,s,6);s=t[0].ti_sec;d(190,s,6);2)声音delay()sound()最后输出结果,类似与下图4 调试分析一开始的时候,我在网海里千寻百找,功夫不负有心人,终于在/course/3_program/c/cshl/2007213/21159.html,让我找到了它。
最初兴奋的我在Microsoft Visual Studio 6.0那里调试,就出现了i:\zhong.c(2) : fatal error C1083: Cannot open include file: 'graphics.h': No such file or directory。
Error executing cl.exe.这个错误。
就知道,原来Microsoft Visual Studio 6.0的数据库里没有graphics(图形函数的原型文件),所以,我就改用TurboC3.0,一开始的时候,出现了几个错误,都是比较简单的,没多久就被消除了,谁知道,成功正在望的时候,我按Run的时候,出现了9个linker error,一开始想了很久没搞懂,就向人求助,不问不知道,原来TurboC3.0与TurboC2.0是有区别的,而且TurboC3.0并不是完完全全超越了TurboC2.0。
于是,我又改用TurboC2.0,继续我的调试生涯。
本想大展鸿图,有遇上自己一个人不可逾越的问题,我一compile,就出现(图1中的)26个错误,有unable to open include file……又有undefined structure…in function main等等。
后来,‘到处找高人指点迷津。
终于知道,原来这是TurboC中一安装的时候,是有默认路径,要改地址(如图2),先到菜单栏option中找到diretories,改地址之后,错误就真的所剩无几。
图(1)图(2)后来,我觉得程序太乱,它里面又没有对齐,又不是按照模块输进去的,思绪有些乱,就改了改,不改不知道,我把int i,l,x1,x2,y1,y2;放在for(i=0;i<60;i++){if(i%5==0)l=15;elsel=5;x1=200*sin(i*6*pi/180)+300;y1=200*cos(i*6*pi/180)+240;x2=(200-l)*sin(i*6*pi/180)+300;y2=(200-l)*cos(i*6*pi/180)+240;line(x1,y1,x2,y2);} 前居然出现了(图3的)错误undefined symbol ‘i’(还有l,y1,y2,x1,x2) in function init。
我老是想不出是什么原因和由于时间紧迫,所以我就放弃这个改动。
图(3)还有就是,我把int gdriver=9,gmode=2;initgraph(&gdriver,&gmode,"c:\\tc");放在紧跟setbkcolor(1);circle(300,240,200);circle(300,240,205);circle(300,240,5);就有(图4)expression syntax in function init的错误。
后来才发现,原来函数开始运行是在main()里面,我把initgraph(&gdriver,&gmode,"c:\\tc");(函数对图形系统初始化)放在自编函数init里,而主函数main里没有了initgraph就不能运行。
还有一些比较零散的错误我在这里就不作一一分析了。
图(4)5 总结我的课程设计完成了模拟时钟转动和用数字显示时间的功能。
还有可以让使用者按照自己的心意随意改动时钟的颜色,外型,声音的扩展功能。