模拟时钟转动程序
51单片机作的电子钟程序及电路图
![51单片机作的电子钟程序及电路图](https://img.taocdn.com/s3/m/087b08ee998fcc22bcd10d58.png)
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不显示)状态。
汇编语言实时时钟程序的设计说明
![汇编语言实时时钟程序的设计说明](https://img.taocdn.com/s3/m/d4da1e90227916888486d788.png)
课程设计说明书姓名:学号:院系:专业:题目:实时时钟程序设计指导教师:职称:课程设计说明书院系:专业:姓名:学号:课程设计题目:实时时钟程序设计起迄日期:课程设计地点:指导教师:系主任:课程设计任务书课程设计任务书目录第一章课题设计目的容及要求 (6)1.1 目的................ ... . . . . . . . . .61.2 容 (6)1.3 要求 (6)第二章程序流程图设计 (2)2.1主流程图设计 (2)2.2子流程图设计.............. 错误!未定义书签。
第三章程序段落的说明 (8)3.1光标的设立和隐藏 (8)3.2调用系统的时间 (5)3.3判断是否有键盘的输入 (6)第四章程序调试说明、结果记录与分析 (7)4.1程序调试的过程 (7)4.2调试结果 (7)4.3分析结果 (8)第五章总结与体会 (8)参考文献 (8)附录 (9)1.程序流程图 (9)2.程序清单 (11)第一章课题设计目得容及要求1.1 目得1)培养学生文献检索的能力,特别是如何利用Internet检索需要的文献资料。
2)培养学生综合分析问题、发现问题和解决问题的能力。
3)培养学生运用知识的能力和工程设计的能力。
4)提高学生课程设计报告撰写水平。
1.2 容设计一个根据所学汇编语言课程的知识,熟练8086汇编语言的编程原理,和程序设计思想,编写一个实时时钟程序进一步提高综合运用知识的能力。
1.3 要求每隔一秒显示系统时钟;可以重复输入,有退出键功能。
第二章程序流程图设计2.1主流程图设计由方案设计分析可知,此次设计比较简单,先初始化程序,然后设立光标,在光标移动时,不断地取时,取分,取秒,并不断的循环。
在循环的过程中,当按下ESC键时退出程序;当按下其它键时,程序继续运行,并显示时间界面,再按下ESC键时,程序又将退出。
流程图设计:当初始化后,设定一个光标用来显示时间的时、分、秒,并将光标隐藏。
python 时钟 指针的转动逻辑
![python 时钟 指针的转动逻辑](https://img.taocdn.com/s3/m/1e2d75113069a45177232f60ddccda38376be1fd.png)
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实现万年历..](https://img.taocdn.com/s3/m/322a9836bd64783e09122ba2.png)
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)](https://img.taocdn.com/s3/m/a2c2ab577cd184254a35352a.png)
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(矩形。
模拟时钟程序
![模拟时钟程序](https://img.taocdn.com/s3/m/6691110af78a6529647d536e.png)
//1.程序与处理;#include<iostream.h>#include<bios.h>#include<dos.h>#include<conio.h>#define LEFT 0x4b00#define RIGHT 0x4d00#define DOWN 0x5000#define UP 0x4800#define PAGEUP 0x4900#define PAGEDOWN 0x5100#define QLOWER 0x1071#define QUPPER 0x1051#define SPACE 0x3920#define ESC 0x011bstruct Date sysTime;int currentY ear;int currentMonth;int currentDay;int n_currentMon;int n_lastMon;void checkDate();int isleapyear(int year);int getWeek(int year,int month,int day);void printSpace(int n);void printseparator();void printUsage();void printWeek();void printWeek2(int week);void showCalendar(int year,int month,int day);void getKeyV alue();//2.功能控制模快void checkDate(){if(currentY ear<=0){gotoxy(1,27);printf("The year should be a positive number!\n");gotoxy(1,28);printf("press any key to continue......");getchar();getchar();currentY ear=sysTime.da_year;currentMonth=sysTime.da_mon;currentDay=sysTime.da_day;}if(currentMonth>12||currentMonth<1){gotoxy(1,27);printf("The month should be a number between 1 and 12!\n");gotoxy(1,28);printf("please press any key to continue.......");getchar();getchar();currentY ear=sysTime.da_Y ear;currentMonth=sysTime.da_mon;currentDay=sysTime.da_day;}if(currentDay>31||currentDay<1){printf("The day should be a number between 1 and 31!\n");printf("please press any key to continue.......");getchar();getchar();currentY ear=sysTime.da_Y ear;currentMonth=sysTime.da_mon;currentDay=sysTime.da_day;}}int isLeapYear(int year){if(year%4==0&&year%100||year%400==0)return 1;else return 0;}int getweek(int year,int month,int day){int leapFlag;int week;int i;int a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};int count=0;if(leapFlag==1)a[2]++;for(i=1;i<month;i++){count+=a[i];}count+=day;week=(year+1+(year-1)/4+(year-1)/100+(year-1)/40 0+count)%7;return week;}//3.打印输出模块void printSpace(int n){int i;for(i=0;i<n;i++)printf(" ");}void printfSeparator(){int i;for(i=0;i<38;i++)printf("=");printf("\n");}void printUsage(){printf("------------Usage------------");printf("YEAR");printf("UP key()to increase;\n");printf("DOWN key()to increase;\n");printf("Month");printf("Right key()to increase;\n");printf("UP key()to decrease.\n");printf("Query");printf("Q/q key\n");printf("Reset");printf(". Space key.\n");printf("Exit");printf("Esc key\n");}void printWeek(){int day;day=getWeek(currentY ear,currentMonth,currentDay );if(day==0)printf("%d-%d-%d,Sunday!",currentY ear,currentMo nth,currentDay);if(day==1)printf("%d-%d-%d,Monday!",currentY ear,currentM onth,currentDay);if(day==2)printf("%d-%d-%d,Tuesday!",currentY ear,currentM onth,currentDay);if(day==3)printf("%d-%d-%d,Wednesday!",currentY ear,curren tMonth,currentDay);if(day==4)printf("%d-%d-%d,Thursday!",currentY ear,current Month,currentDay);if(day==5)printf("%d-%d-%d,Friday!",currentY ear,currentMo nth,currentDay);if(day==6)printf("%d-%d-%d,Saturday!",currentY ear,current Month,currentDay);}void printWeek2(int week){if(week==0)printf(",Sunday");if(week==1)printf(",Monday");if(week==2)printf(",Tuesday");if(week==3)printf(",Wendesday");f(week==4)printf(",Thursday");if(week==5)printf(",Friday");if(week==6)printf(",Staturday");}//4.日历显示模块void showCalendar(int year,int month,int day){int i,int j;int outDay;int leapFlag;int dayLastMon;int week;int a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};outDay=0;dayLastMon=0;week=0;leapFlag=isleapyear(year);if(leapFlag==1){a[2]++;}if(day<a[month]){printf("The number of this month's day is %d at most!\n",a[month]);getchar();getchar();year=sysTime.da_year;month=sysTime.da_mon;day=sysTime.da_day;currentY ear=sysTime.da_year;currentMonth=sysTime.da_mon;currentDay=sysTime.da_day;}n_lastmon=a[month-1];n_currentmon=a[month];clarscr();printf("\nThe calendar of %d",year);textcolor(10);if(leapFlag==1)printf("[leap year]",year);textcolor(10);if(leapFlag==0)printf("[not leap year]",year);printf("\n");textcolor(7);printfSeparator();textcolor(YELLOW);switch(month){case 1:printf("January 1");break;case 2:printf("February 2");break;case 3:printf("Marth 3");break;case 4:printf("April 4");break;case 5:printf("May 5");break;case 6:printf("June 6");break;case 7:printf("July 7");break;case 8:printf("August 8");break;case 9:printf("September 9");break;case 10:printf("October 10");break;case 11:printf("November 11");break;case 12:printf("December 12");break;}textcolor(7);printf("\n\n");textcolor(13);printf("Sun Mon Tue Wed Thu Fri Sat"); textcolor(7);printf("\n\n");for(i=0;i<6;i++){if(i==0){printSpace(dayLastMon*4);for(j=0;j<7-dayLastMon;j++)if(outday==day-1){textcolor(YELLOW);printf("[%d]",++outDay);textcolor(7);}else if(outDay==day&&week!=0){printf("%3d",++outDay);}else{Printf("%4d",++outDay);}week=(week<6)?week+1:0;}printf("\n\n");}else{for(j=0;j<7;j++){if(outday<a[month]){if(outday==day-1){if(outday<9){printf("[%d]",++outday);}else{printf("[%2d]",++outday);}}else if(outday==day&&week!=0){printf("[%3d]",++outday);}}week=(week<6)?week+1:0;}printf("\n\n");if(outday==a[month])break;}printfSeparator();printf("The day you choose is:\n\n");printWeek();printf("-------------\n");printf("\nTodayis:%d-%d-%d",sysTime.da_year,sysTime.da_mon,sysTi me.da_day);printWeek2(getWeek(sysTime.da_year,sysTime.da_ mon,sysTime.da_day));printf("\n\n");printUsage();}//5.键值获取模块;void getkeyvalue(){int key;char ch;currentY ear=sysTime.da_year;currentMonth=sysTime.da_mon;currentDay=sysTime.da_day;showCalendar(currentY ear,currentMonth,currentDa y);while(1)key=bioskey(0);if(key==RIGHT){if(currentMonth==12){currentY ear++;currentMonth=1;}elsecurrentMonth++;}if(key==LEFT){if(currentMonth==1){currentY ear--;currentMonth=12;}elsecurrentMonth--;}if(key==UP){currentY ear--;}if(key==DOWN){currentY ear++;}if(key==PAGEDOWN){if(currentDay!=n_currentDay){currentDay++;}if(currentDay==n_currentDay&¤tMonth!=1 2){currentMonth++;currentDay=1;}else{currentY ear++;currentMonth=1;currentDay=1;}}if(key==PAGEDOUP){if(currentDay!=1){currentDay--;}else if(currentDay==1&¤tMonth==1){currentY ear--;currentMonth=12;currentDay=31;}else{currentMonth--;currentDay=n_lastMonth;}}if(key==QLOWER||QUPPER){printf("Inputdate(eg,%d-%d-%d):",sysTime.da_year,sysTime.da_mon ,sysTime.da_day);scanf("%d-%d-%d",¤tY ear,¤tMonth, ¤tDay);checkDate();}if(key==SPACE){currentY ear=sysTime.da_year;currentMonth=sysTime.da_mon;currentDay=sysTime.da_day;}if(key==ESC){printf("Do you really want to quit?(Y/N)");ch=getchar();if(ch=='y'||ch=='Y')break;}showCalendar(currentY ear,currentMonth,currentDa y);}//6.主函数void main(){getdate(&sysTime);getKeyV alue();}基本要求:1.自行设计界面,要求用户输入要查询的日期,年份在1980~2099之间,按ESC程序结束。
ds3231程序
![ds3231程序](https://img.taocdn.com/s3/m/2033389801f69e314232941b.png)
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。
单片机电子时钟汇编程序
![单片机电子时钟汇编程序](https://img.taocdn.com/s3/m/8e1098f5910ef12d2af9e79b.png)
;==============================================================; 文件名称: KeyScan.Asm; 功能描述: 8255扩展IO, 完成键盘及数码管显示实验.; 按下按键, 数码管显示相应键值.;通过第一列按键改变时分秒的值,在按下第一个按键时,停止计数器,并将秒的值30h单元的内容加一。
;在按下第二个按键时,停止计数器,并将分的值31h单元的内容加一?;在按下第三个按键时,停止计数器,并将分的值32h单元的内容加一?;在按下第四个按键时,重新启动定时器开始计时。
;为什么要加34h(I don't know),如果没有将会出现一个非常奇异的现象,小时只能加到8,然后单片机死机了。
;==============================================================A_8255 EQU 7F00H ;8255端口定义B_8255 EQU 7F01HC_8255 EQU 7F02HCON_8255 EQU 7F03HCOUNT DATA 20HORG 0000HLJMP MAINORG 000BHLJMP TIME0MAIN:MOV A, #81HMOV DPTR, #CON_8255 ;8255控制端口MOVX @DPTR, A ;写入控制字MOV A,#0FFH ;关闭显示MOV DPTR,#A_8255MOVX @DPTR,A ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;定时器初始化MOV SP,#4FHMOV TMOD,#01HMOV TH0,#4CHMOV TL0,#00HSETB ET0SETB EASETB TR0MOV COUNT,#14HMOV 30H,#00H ;30H~32H SA VE SECOND,MINUTE,HOUR MOV 31H,#00H ;MOV 32H,#00H ;MOV 33H,#00H ;SA VE KEY V ALUEMOV 34H,#00H ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;BEGIN: LCALL DIS ;调用显示子程序LCALL CCSCAN ;判是否有键按下MOV A,33H ;MODIFY TIMERJZ BEGINLCALL KEYXAJMP BEGIN;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KEYX:MOV A,33HCJNE A,#01H,KEY1 ;STOP TIMERCLR EACLR ET0CLR TR0INC 30H ;SELECT LEDMOV A,30HCJNE A,#60,KEY00MOV 30H,#00HKEY00:MOV 33H,#00HAJMP OVERKEY1: CJNE A,#04H,KEY2 ;ADD V ALUEMOV 33H,#00HCLR EACLR ET0CLR TR0INC 31HMOV A,31HCJNE A,#60,KEY11MOV 31H,#00HKEY11:AJMP OVERKEY2: CJNE A,#08H,KEY3 ;MOV 33H,#00HCLR EACLR ET0CLR TR0INC 32HMOV A,32HCJNE A,#24,KEY22MOV 32H,#00HKEY22:AJMP OVERKEY3: CJNE A,#0CH,OVER ;START TIMER MOV 33H,#00HACALL START_TIME0OVER:RET ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;START_TIME0:MOV TMOD,#01HMOV TH0,#4CHMOV TL0,#00HSETB ET0SETB EASETB TR0MOV COUNT,#14HRET ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KEYSCANCCSCAN:;PUSH ACCMOV DPTR,#A_8255 ;按键扫描MOV A,#00HMOVX @DPTR,AMOV DPTR,#C_8255MOVX A,@DPTRCPL A ;取反ANL A,#0FHJNZ INK2 ;KEY DOWN AJMP EXITINK2:;LCALL DLNMS ;消除按键抖动MOV DPTR,#A_8255 ;按键扫描MOV A,#00HMOVX @DPTR,AMOV DPTR,#C_8255MOVX A,@DPTRCPL A ;取反ANL A,#0FHJNZ INK3 ;KEY DOWNAJMP EXITINK3:MOV R2,#0FEHMOV R4,#00H ;从第0列开始扫描COLUM: MOV DPTR,#A_8255MOV A,R2MOVX @DPTR,A ;写入列扫描值MOV DPTR, #C_8255MOVX A,@DPTRJB ACC.0,LINE1 ;判第0行的值MOV 33H,#01H ;第0行AJMP EXITLINE1: JB ACC.1,LINE2MOV 33H,#04H ;第1行AJMP EXITLINE2: JB ACC.2,LINE3MOV 33H,#08H ;第2行AJMP EXITLINE3: JB ACC.3,EXITMOV 33H, #0CH ;第3行EXIT:;POP ACCRET;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;DIS: PUSH ACC ;显示子程序PUSH 00HPUSH 03HAGAIN:;;DISPLAY SECOND ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;FIRST SECOND SEG DISPLAYMOV A,30H ;a存放表内偏移地址MOV B,#10DIV AB;MOV A,BMOV DPTR,#DSEGS ;数码管段表地址,dptr存放表的首地址MOVC A,@A+DPTR ;查表MOV DPTR,#B_8255 ;送段显示MOVX @DPTR,AMOV A,#0EFH ;SELECT FIRST SEGMOV DPTR,#A_8255MOVX @DPTR,AACALL DL1MSMOV A,BMOV DPTR,#DSEGS ;数码管段表地址,dptr存放表的首地址MOVC A,@A+DPTR ;查表MOV DPTR,#B_8255 ;送段显示MOVX @DPTR,AMOV A,#0DFH ;SELECT FIRST SEGMOV DPTR,#A_8255MOVX @DPTR,AACALL DL1MS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; MINUTE SEG DISPLAYMOV A,31H ;a存放表内偏移地址MOV B,#10DIV AB;MOV A,BMOV DPTR,#DSEGS ;数码管段表地址,dptr存放表的首地址MOVC A,@A+DPTR ;查表MOV DPTR,#B_8255 ;送段显示MOVX @DPTR,AMOV A,#0FBH ;SELECT FIRST SEGMOV DPTR,#A_8255MOVX @DPTR,AACALL DL1MSMOV A,BMOV DPTR,#DSEGS ;数码管段表地址,dptr存放表的首地址MOVC A,@A+DPTR ;查表MOV DPTR,#B_8255 ;送段显示MOVX @DPTR,AMOV A,#0F7H ;SELECT FIRST SEGMOV DPTR,#A_8255MOVX @DPTR,AACALL DL1MS ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; HOUR SEG DISPLAYMOV A,32H ;a存放表内偏移地址MOV B,#10DIV AB;MOV A,BMOV DPTR,#DSEGS ;数码管段表地址,dptr存放表的首地址MOVC A,@A+DPTR ;查表MOV DPTR,#B_8255 ;送段显示MOVX @DPTR,AMOV A,#0FEH ;SELECT FIRST SEGMOV DPTR,#A_8255MOVX @DPTR,AACALL DL1MSMOV A,BMOV DPTR,#DSEGS ;数码管段表地址,dptr存放表的首地址MOVC A,@A+DPTR ;查表MOV DPTR,#B_8255 ;送段显示MOVX @DPTR,AMOV A,#0FDH ;SELECT FIRST SEGMOV DPTR,#A_8255MOVX @DPTR,AACALL DL1MS ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; HOUR SEG DISPLAYMOV A,34H ;a存放表内偏移地址MOV B,#10DIV AB;MOV A,BMOV DPTR,#DSEGS ;数码管段表地址,dptr存放表的首地址MOVC A,@A+DPTR ;查表MOV DPTR,#B_8255 ;送段显示MOVX @DPTR,AMOV A,#07FH ;SELECT FIRST SEGMOV DPTR,#A_8255MOVX @DPTR,AACALL DL1MSMOV A,BMOV DPTR,#DSEGS ;数码管段表地址,dptr存放表的首地址MOVC A,@A+DPTR ;查表MOV DPTR,#B_8255 ;送段显示MOVX @DPTR,AMOV A,#0BFH ;SELECT FIRST SEGMOV DPTR,#A_8255MOVX @DPTR,AACALL DL1MS ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OUT: POP 03HPOP 00HPOP ACCRET;数码管段显示值DSEGS: DB 03FH, 06H,05BH,04FH,066H,06DH,07DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71HDL1MS: MOV R7,#05HDL0: MOV R6,#080HDL1: DJNZ R6,DL1DJNZ R7,DL0RETDLNMS: MOV R7,#0F0HDL03: MOV R6,#0F0HDL13: DJNZ R6,DL13DJNZ R7,DL03RET;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; TIME0:PUSH ACCMOV TH0,#04CHMOV TL0,#00HDJNZ COUNT,NEXT1MOV COUNT,#14HINC 30HMOV A,30HCJNE A,#60,NEXT1MOV 30H,#00HINC 31HMOV A,31HCJNE A,#60,NEXT1MOV 31H,#00HINC 32HMOV A,32HCJNE A,#24,NEXT1MOV 32H,#00HNEXT1:POP ACCRETIEND。
ds3231程序
![ds3231程序](https://img.taocdn.com/s3/m/c37c5334ef06eff9aef8941ea76e58fafab045ec.png)
#include 〈reg51.h>#include <intrins。
h〉#define uchar unsigned char#define uint unsigned intsbit SDA=P3^6; //模拟I2C数据传送位SDAsbit 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); //起始条件建立时间大于4.7us,延时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); //时钟低电平周期大于4.7μ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);}}。
计算机图形学基础教程孔令德课后答案
![计算机图形学基础教程孔令德课后答案](https://img.taocdn.com/s3/m/8c2399ca0975f46527d3e1d8.png)
计算机图形学基础教程孔令德课后答案【篇一:大学计算机图形学课程设】息科学与工程学院课程设计任务书题目:小组成员:巴春华、焦国栋成员学号:专业班级:计算机科学与技术、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代码实例 《模拟时钟》](https://img.taocdn.com/s3/m/b68938ed6294dd88d0d26b64.png)
第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”。
用数码管(8位)显示的数字时钟程序
![用数码管(8位)显示的数字时钟程序](https://img.taocdn.com/s3/m/6402641fe3bd960590c69ec3d5bbfd0a7856d571.png)
用数码管(8位)显示的数字时钟程序
一、程序概述
本程序使用单片机AT89S52,通过数码管(8位)显示当前时间,支持12小时制和24小时制切换,精度为秒。
二、程序实现
程序首先定义了数码管的连接方式和每个数字的位图数据,然后定义了时间变量和函数,包括:
1.初始化函数:设置数码管端口和时钟计数器的计数方式。
2.读时钟函数:读取时钟计数器及寄存器,返回当前时间的小时、分钟和秒数。
3.显示函数:将当前时间转化为8个数码管显示的位图数据,用数字和符号映射表将数字和符号的位图数据与数码管连接方式对应起来,输出到数码管上。
在主函数中,程序初始化后循环执行读时钟函数和显示函数,实现时钟的实时显示。
三、程序特点
1.采用8位数码管显示,时间更加直观。
2.支持12小时制和24小时制切换,适用于不同场景。
3.实现精度为秒的实时显示,更加准确。
四、程序优化
1.增加闹钟功能,提醒用户打卡或者起床。
2.加入温度传感器模块,实现显示温度的功能。
3.优化显示效果,增加字体和颜色等选项。
五、程序应用
本程序可应用于家庭、办公室、学校等场合,用于显示时间,提醒用户合理安排时间和时间管理,也可作为DIY电子制作的教学和实验材料,提高学生的动手实践能力和电子信息技术水平。
单片机时钟1234滚动程序代码
![单片机时钟1234滚动程序代码](https://img.taocdn.com/s3/m/b33f8b3a6d85ec3a87c24028915f804d2b168717.png)
单片机时钟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口的输出值来实现数字的显示。
VC++课程设计--基于MFC的模拟时钟
![VC++课程设计--基于MFC的模拟时钟](https://img.taocdn.com/s3/m/8559ae221711cc7931b716af.png)
VC++课程设计--基于MFC的模拟时钟计科2011级VC++课程设计实验报告题目:基于MFC的模拟时钟班级:计科1104班学号:1108030429姓名:张宝龙日期:2014/1/7课程设计实验报告1、题目:基于MFC的模拟时钟2、编程要点:制作时钟的过程中,首先给时钟创建一个基类CClockElement,还需要派生类CClockBackground,CClockHourHand,CClockMin Hand,CClockSecHand分别控制时钟的背景,时钟的时针,分针,秒针。
3、实现过程:(1)工程、风格、控件与变量表本时钟是基本对话框的时钟,界面简约,便于使用。
控件控件名控件类型Clock 静态文本变量表变量名类型m_crMain COLORREF m_crOther COLORREFm_tmCur CTimem_rcRegion CRectm_nRadius intm_clockBK CClockBackground m_clockHour CClockHourHandm_clockMin CClockMinHandm_clockSec CClockSecHandm_rcClient CRectm_Clock CClockEX(2)主要功能程序代码CClockBackground::CClockBackground() {//为时钟背景定义默认的颜色设置m_crMain=RGB(0,0,255);m_crOther=RGB(0,255,0);}void CClockBackground::Draw(CDC *pDC) {//设置准备环境CPenpenMain(PS_SOLID,1,m_crMain),penOther(PS _SOLID,1,m_crOther);CBrushbrMain(m_crMain),brOther(m_crOther);CPen*pOldPen=pDC->SelectObject(&penOther);CBrush*pOldBrush=pDC->SelectObject(&brMain);CPointptCenter=m_rcRegion.CenterPoint();int nRadius=m_nRadius-8;for(int i=0;i<60;i++){CPoint ptEnd=ptCenter;ptEnd.Offset((int)(nRadius*sin(2*PI*(i% 60)/60)),(int)(-nRadius*cos(2*PI*(i%60)/60)));CRect rcDot(-2,-2,2,2);rcDot.OffsetRect(ptEnd);pDC->Ellipse(rcDot);}//绘制12个小方框,表示12个正点pDC->SelectObject(&penMain);pOldBrush=pDC->SelectObject(&brOth er);for(i=0;i<12;i++){CPoint ptEnd=ptCenter;double fRadian=2*PI*(i%12)/12;ptEnd.Offset((int)(nRadius*sin(fRadian) ),(int)(-nRadius*cos(fRadian)));CRect rcDot(-3,-3,3,3);rcDot.OffsetRect(ptEnd);pDC->Rectangle(rcDot);}//huanyuan设备环境pDC->SelectObject(pOldPen);pDC->SelectObject(pOldBrush);}CClockHourHand::CClockHourHand(){//定义默认颜色m_crMain=RGB(0,0,128);m_crOther=RGB(128,128,0);}void CClockHourHand::Draw(CDC *pDC){//设置准备环境CPenpenMain(PS_SOLID,1,m_crMain),penOthe r(PS_SOLID,1,m_crOther);CBrushbrMain(m_crMain),brOther(m_crOther);CPen*pOldPen=pDC->SelectObject(&penOther );CBrush*pOldBrush=pDC->SelectObject(&brMain);//确定当前指针的弧度intnTime=(m_tmCur.GetHour()%12)*3600;nTime+=m_tmCur.GetMinute()*60;nTime+=m_tmCur.GetSecond();doublefRadian=2*PI*nTime/3600/12;//确定绘制菱形指针所需的四个角的坐标CPoint ptDiamond[4];for(int i=0;i<4;i++){ptDiamond[i]=m_rcRegion.CenterPoin t();}int nRadius=m_nRadius/2;ptDiamond[0].Offset((int)(nRad ius*sin(fRadian)),(int)(-nRadius*cos (fRadian)));fRadian+=0.5*PI;nRadius=m_nRadius/20;ptDiamond[1].Offset((int)(nRad ius*sin(fRadian)),(int)(-nRadius*cos (fRadian)));fRadian+=0.5*PI;nRadius=m_nRadius/10;ptDiamond[2].Offset((int)(nRad ius*sin(fRadian)),(int)(-nRadius*cos (fRadian)));fRadian+=0.5*PI;nRadius=m_nRadius/20;ptDiamond[3].Offset((int)(nRad ius*sin(fRadian)),(int)(-nRadius*cos (fRadian)));//绘制菱形时钟pDC->Polygon(ptDiamond,4);//huanyuan设备环境pDC->SelectObject(pOldPen);pDC->SelectObject(pOldBrush);}CClockMinHand::CClockMinHand(){//定义默认颜色m_crMain=RGB(0,255,100);m_crOther=RGB(128,128,0);}void CClockMinHand::Draw(CDC *pDC){//设置准备环境CPenpenMain(PS_SOLID,1,m_crMain),penOthe r(PS_SOLID,1,m_crOther);CBrushbrMain(m_crMain),brOther(m_crOther);CPen*pOldPen=pDC->SelectObject(&penOther );CBrush*pOldBrush=pDC->SelectObject(&brMain );//确定分针所在位置的弧度intnTime=m_tmCur.GetMinute()*60;nTime+=m_tmCur.GetSecond();double fRadian=2*PI*nTime/3600;//确定绘制菱形指针所需的四个角的坐标CPoint ptDiamond[4];for(int i=0;i<4;i++){ptDiamond[i]=m_rcRegion.CenterPoin t();}int nRadius=m_nRadius/4;ptDiamond[0].Offset((int)(nRad ius*sin(fRadian)),(int)(-nRadius*cos (fRadian)));fRadian+=0.5*PI;nRadius=m_nRadius/20;ptDiamond[1].Offset((int)(nRadius*sin(fRadian)),(int)(-nRadius*cos (fRadian)));fRadian+=0.5*PI;nRadius=m_nRadius/10;ptDiamond[2].Offset((int)(nRad ius*sin(fRadian)),(int)(-nRadius*cos (fRadian)));fRadian+=0.5*PI;nRadius=m_nRadius/20;ptDiamond[3].Offset((int)(nRad ius*sin(fRadian)),(int)(-nRadius*cos (fRadian)));//绘制菱形时钟pDC->Polygon(ptDiamond,4);//huanyuan设备环境pDC->SelectObject(pOldPen);pDC->SelectObject(pOldBrush);}CClockSecHand::CClockSecHand(){//设定秒针的默认颜色m_crMain=RGB(0,200,200);m_crOther=RGB(0,200,200);}void CClockSecHand::Draw(CDC *pDC){int nTime=m_tmCur.GetSecond();CPointptStart=m_rcRegion.CenterPoint();CPoint ptEnd=ptStart;int nRadius=m_nRadius-10;ptEnd.Offset((int)(nRadius*sin (2*PI*nTime/60)),(int)(-nRadius*cos( 2*PI*nTime/60)));CPenpenMain(PS_SOLID,1,m_crMain);CPen*pOldPen=pDC->SelectObject (&penMain);pDC->MoveTo(ptStart);pDC->LineTo(ptEnd);pDC->SelectObject(pOldPen);}void CClockEX::OnTimer(UINT nIDEvent){Invalidate(FALSE);CStatic::OnTimer(nIDEvent);}void CClockEX::OnSize(UINT nType, int cx, int cy){CStatic::OnSize(nType, cx, cy);GetClientRect(m_rcClient);//获取当前客户区m_clockBK.SetRegion(m_rcClient );m_clockHour.SetRegion(m_rcClie nt);m_clockMin.SetRegion(m_rcClien t);m_clockSec.SetRegion(m_rcClien t);}void CClockEX::OnPaint(){CPaintDC dc(this); // device context for painting//实现双缓冲绘图---防止屏幕闪烁CDC dcMem;dcMem.CreateCompatibleDC(&dc);CBitmap bmp;bmp.CreateCompatibleBitmap(&dc ,m_rcClient.Width(),m_rcClient.Heigh t());dcMem.SelectObject(&bmp);DrawClock(&dcMem); //绘制时钟dc.BitBlt(0,0,m_rcClient.Width (),m_rcClient.Height(),&dcMem,0,0,SR CCOPY);}voidCClockEX::PreSubclassWindow(){GetClientRect(m_rcClient);//获取当前客户区m_clockBK.SetRegion(m_rcClient );m_clockHour.SetRegion(m_rcClie nt);m_clockMin.SetRegion(m_rcClien t);m_clockSec.SetRegion(m_rcClien t);SetTimer(1,100,NULL);CStatic::PreSubclassWindow();}void CClockEX::DrawClock(CDC *pDC){CTimetmCur=CTime::GetCurrentTime();m_clockBK.SetTime(tmCur);m_clockHour.SetTime(tmCur);m_clockMin.SetTime(tmCur);m_clockSec.SetTime(tmCur);m_clockBK.Draw(pDC);m_clockHour.Draw(pDC);m_clockMin.Draw(pDC);m_clockSec.Draw(pDC);}CClockElement::CClockElement(){m_nRadius=0;m_crMain=RGB(255,0,0);m_crOther=RGB(128,128,0);}voidCClockElement::SetRegion(LPRECT lprcRect){m_rcRegion=lprcRect;m_nRadius=m_rcRegion.Width()/2;if(m_rcRegion.Width()>m_rcRegion.Hei ght()){m_nRadius=m_rcRegion.Height()/2;}}void CClockElement::SetTime(const CTime &tmCur){m_tmCur=tmCur;}voidCClockElement::SetColor(COLORREF crMain,COLORREF crOther){m_crMain=crMain;m_crOther=crOther;}4、运行效果展示:5、自我总结:该小程序是基于MFC中的对话框的,主要针对画笔和画刷的用法,没有涉及连接数据库和算法,完全是为了本学期所学知识的运用,由于时间紧,所以没能深入的探索MFC的奥妙,不过通过本次设计,我对老师课堂上所讲述的关于该类型的知识,有了进一步的了解和掌握,初步的熟悉了画笔和画刷的简单用法,还巩固了MFC类中的基本操作,例如,添加新类,新变量,创建新的对话框,添加控件等方面的知识。
四位秒表程序
![四位秒表程序](https://img.taocdn.com/s3/m/07f6cac4050876323112124e.png)
重赏之下心有勇夫^_^;汇编时钟程序。
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++模拟时钟实验报告](https://img.taocdn.com/s3/m/3f3605234b35eefdc8d333e8.png)
集中上机实习报告指导教师:王利姓名:赵蕊学号: 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册《时钟转动巧设计》优质试讲教案教学过程](https://img.taocdn.com/s3/m/b5083e62657d27284b73f242336c1eb91a37339c.png)
时钟转动巧设计尊敬的评委老师,大家上午好我是号考生,今天我试讲的题目是《时钟转动巧设计》,下面开始我的试讲。
上课,同学们好,请坐。
一、导入新课师:上课开始,老师给大家带来一段小视频,请欣赏。
师:通过视频大家发现了什么?师:嗯,里面有各式各样的表。
大家更喜欢哪一种啊?为什么呢?师:前排举手的女生,你来说师:哦,她喜欢机械表,喜欢听表针滴答滴答运转的声音,大家也是一样吗?师:嗯,既然这样,我们能不能用SerainC)软件设计程序模拟机械表,让表针转起来呢?师:如何设计呢?就让我们带着这个疑问一起走进今天的新课《时钟转动巧设计》去寻找答案吧!二、自主探究师:同学们,请看大屏幕上的表盘,如果要制作一个钟表,需要解决什么问题啊?师:后面那位男生,你来说!、师:哦,他说一是要先绘制表盘,二是让时针、分钟、秒针随时间变化绕表盘转动。
师:嗯,你真善于分析问题。
请坐。
师:那就让我们开始今天的第一个任务,去绘制表盘吧!师:在绘制前啊,老师两个温馨提示。
第一,虽然SCrainO绘图功能很强大,但要绘制刻度较多且均匀分布的表盘不是一件容易的事,用程序绘制更方便。
第二,在画大格小格的时候可以用Pen扩展模块中的图章积木来完成。
师:好,接下来,就请同学们自行研读课本,参照活动指导,独立完成任务1吧!师:看到大家都端正了坐姿,想必大家都已经完成了,谁来给大家分享一下呢?师:前排这位同学举手最快,我来分享吧!师:哦,1、他先是在造型区绘制了两个大小不同的正圆做为圆盘,大家注意,他在画圆的时候按了哪个键,对,是Shift键。
2、第二步,绘制了两个直线角色分别代表小时和分钟的刻度。
3、第三步,添加pen扩展积木。
4、第四步,给两个直线角色添加积木程序。
小时的角色,先是添加移动到积木,然后清除落笔,下面是旋转和图章积木并且是重复12次,因为一周是360度,所以修改角度为30度。
分钟角色和小时角色基本上一样,就是把旋转角度改为了6度。
用C++编写模拟时钟程序
![用C++编写模拟时钟程序](https://img.taocdn.com/s3/m/c993f59ddaef5ef7ba0d3c6b.png)
模拟时钟程序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++制作-模拟时钟应用程序](https://img.taocdn.com/s3/m/1f8af88aba1aa8114431d9e3.png)
案例五模拟时钟应用程序以实例为背景学习基于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一次),如果采用全屏删除式重绘则闪烁十分明显,显示效果不佳。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
outtextxy(180,410,"Press Esc to change windows!");
def();
clockhandle(); /*开始调用时针处理程序*/
abc();
closegraph(); /*关闭图形函数*/
if(clock==60) clock=0;
sprintf(bufferl,"%d",clock);
outtextxy(x,y,bufferl);
}
/*将double型的小时数转换成int型*/
int digithour(double h)
{ int i;
m=t[0].ti_min;
h=t[0].ti_hour;
x2=98*sin(s/30*PI)+451; /*秒针的x坐标值*/
y2=200-98*cos(s/30*PI); /*秒针的y坐标值*/
line(451,200,x2,y2);
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);
m=t[0].ti_min;
x=50*sin((h*60+m)/360*PI)+451; /*时针的x坐标值*/
y=200-50*cos((h*60+m)/360*PI); /*时针的y坐标值*/
line(451,200,x,y);
x1=80*sin(m/30*PI)+451; /*分针的x坐标值*/
initgraph(&driver,&mode,""); /*初始化图形系统 */
setlinestyle(0,0,3);
setbkcolor(0);
/*画主体框架的边线*/
setcolor(12);
line(82,430,558,430);
line(70,62,70,418);
for(i=0;i<=23;i++)
{if(h==i) return i;}
}
/*将double型的分针数转换成int型*/
/*消除当前时针*/
setcolor(15);
x=50*sin((h*60+m)/360*PI)+451;
y=200-50*cos((h*60+m)/360*PI);
line(451,200,x,y);
/*绘制新的时针*/
setcolor(7);
line(392,310,510,310);
line(392,330,510,330);
arc(392,320,90,270,10);
arc(510,320,270,90,10);
/*绘制数字时钟的分隔符*/
setcolor(5);
for(i=431;i<=470;i+=39)
for(j=317;j<=324;j+=7){
setlinestyle(0,0,3);
circle(i,j,1);
}
/*绘制表示小时的圆点*/
for(i=0,m=0,h=0;i<=11;i++,h++){
x=100*sin((h*60+m)/360*PI)+451;
/*运动的问候语*/
setfillstyle(0,2);
bar(100,115,320,150);
setcolor(4);
settextstyle(1,0,99);
outtextxy(101+n*5,140,"Welcome!");
n=n+1;
/*函数声明*/
int digithour(double);
int digitmin(double);
int digitsec(double);
void digitclock(int,int,int);
void clockhandle();
void abc();
void def();
setwritemode(0); /*规定划线的方式(将所画位置的原来信息覆盖)*/
setcolor(13);
outtextxy(405,75,"BeiJing Shijian");
/*绘制电子时钟的边框*/
setlinestyle(0,0,1);
}
}
/*数字时钟的秒针*/
setcolor(15);
digitclock(485,318,digitsec(s)+1);
/*用原来的颜色在原来位置再绘制秒针,清除当前秒针*/
setcolor(12);
x2=98*sin(s/30*PI)+451;
y2=200-98*cos(s/30*PI);
line(451,200,x2,y2);
/*分针处理*/
if(t[0].ti_min!=m){
/*消除当前分针*/
setcolor(15);
x1=80*sin(m/30*PI)+451;
y1=200-80*cos(m/30*PI); /*分针的y坐标值*/
line(451,200,x1,y1);
/*在数字时钟中显示时间*/
digitclock(408,318,digithour(h));
digitclock(446,318,digitmin(m));
line(82,50,558,50);
line(570,62,570,418);
line(70,62,570,62);
line(76,56,295,56);
line(342,56,564,56);
/*画主体框架的边角弧线*/
setlinestyle(0,0,3);
}
}
}
/*在指定位置显示数字时钟*/
void digitclock(int x,int y,int clock)
{char bufferl[10];
setfillstyle(0,2);
bar(x,y,x+15,328); /*画一个二维码*/
if(n>28) n=0;
/*利用此循环,延时一秒*/
while(t[0].ti_sec==s&&t[0].ti_min==m&&t[0].ti_hour==h)
{ gettime(t);
if(bioskey(1)!=0){
k=bioskey(0);
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,5);
setcolor(5);
delay(700); /*发一个500Hz的音调,维持700毫秒*/ 00);
nosound(); /*关闭PC扬声器*/
s=t[0].ti_sec;
y1=200-80*cos(m/30*PI);
line(451,200,x1,y1);
/*绘制新的分针*/
m=t[0].ti_min;
digitclock(446,318,digitmin(m)); /*在数字时钟中显示新的钟值*/
setlinestyle(0,0,7);
setcolor(9);
outtextxy(301,53,"CLOCK");
setcolor(15);
outtextxy(299,53,"CLOCK"); /*显示标题*/
setcolor(9);
rectangle(342,72,560,380); /*绘制矩形时钟框架 */
x1=80*sin(m/30*PI)+451;
y1=200-80*cos(m/30*PI);
line(451,200,x1,y1);
}
/*小时处理*/
if((t[0].ti_hour*60+t[0].ti_min)!=(h*60+m)){
y=200-100*cos((h*60+m)/360*PI);
setlinestyle(0,0,3);
setcolor(5);
circle(x,y,1);
}
/*绘制表示分针或秒针的圆点*/
setcolor(3);
for(i=0,m=0;i<=59;m++,i++){
outtextxy(110,90,"Name :Li Jianli");
outtextxy(110,105,"Xuehao:12020326");
setcolor(10);
outtextxy(108,90,"Name");
outtextxy(108,105,"Xuehao");
#include<graphics.h>