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

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

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

教学目标: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编写程序来模拟时钟指针的运动逻辑。
本文将介绍如何使用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单片机时钟程序

简单的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++;}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程设计课程名称高级语言程序课程设计题目名称模拟时钟转动程序学生学院自动化学院专业班级自动化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 总结我的课程设计完成了模拟时钟转动和用数字显示时间的功能。
还有可以让使用者按照自己的心意随意改动时钟的颜色,外型,声音的扩展功能。