具体实现功能

具体功能:

实现年、月、日、时、分、秒、农历的显示,例如:如图显示的是2001年1月1日,农历12月7日,00点01分23秒。

设计介绍

单片机介绍

51单片是一种低功耗、高性能CMOS8位微控制器,具有 8K 在系统可编程Flash 存储器。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得STC89C51为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。具有以下标准功能:8k字节Flash,512字节RAM,32 位I/O 口线,看门狗定时器,内置4KB EEPROM,MAX810复位电路,三个16 位 定时器/计数器,一个6向量2级中断结构,全双工串行口。另外 STC89X51 可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU 停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。最高运作频率35Mhz,6T/12T可选。

设计思路

文献研究法:搜集整理相关单片机智能手环系统相关研究资料,认真阅读文献,为研究做准备;

调查研究法:通过调查、分析、具体试用等方法,发现单片机智能手环系统的现状、存在问题和解决办法;

比较分析法:比较不同单片机智能手环系统的具体原理,以及同一类传感器性能的区别,分析单片机智能手环系统的研究现状与发展前景;

软硬件设计法:通过软硬件设计实现具体硬件实物,最后测试各项功能是否满足要求。

设计内容

仿真图

本设计利用protues8.7软件实现仿真设计,具体如图。

Protues也是在单片机仿真设计中常用的设计软件之一,通过设计出硬件电路图,及写入驱动程序,就能在不实现硬件的情况进行电路调试。另外,protues还能实现PCB的设计,在仿真中也可以与KEIL实现联调,便于程序的调试,且支持多种平台,使用简单便捷。

程序

本设计由汇编语言编写,主代码具体如下:

TIME_WEEK DATA 52H       ;星期存放单元TIME_YEAR DATA 5DH        ;年份低两位存放单元(BCD码)TIME_MONTH DATA 5EH      ;月份存放单元(BCD码)TIME_DATA DATA 5FH        ;日存放单元(BCD码)YEARH DATA 36H             ;年份高两位YEAR DATA 35H               ;年份低两位存放单元(BCD码)MONTH DATA 34H            ;月份存放单元(BCD码)DAY DATA 33H                ;日存放单元(BCD码)HOUR DATA 32H               ;时存放单元(BCD码)MINUTE DATA 31H            ;分存放单元(BCD码)SEC DATA 30H                ;秒存放单元(BCD码)AAA  BIT P3.0                 ;显示位(74LS164 数据)BBB BIT P3.1                 ;显示脉冲(74LS164时钟)AA BIT P3.3                    ;时间调整按键BB BIT P3.4                    ;加1调整CC BIT P3.5                    ;闹钟调整BL BIT P3.2                    ;闹钟输出 BZ1  BIT  21H.0TIMES    DATA    20H        ;调时标志COM     DATA    P1          ;段码数据ORG 0000H          ;程序执行开始地址LJMP      START  ;跳到标号START执行ORG 0003H          ;外中断0中断程序入口RETI                     ;外中断0中断返回ORG 000BH        ;定时器T0中断程序LJMP      INTT0  ;跳至INTTO执行ORG 0013H        ;外中断1中断程序入口RETI                   ;外中断1中断返回ORG 001BH        ;定时器T1中断程序入口RETIORG 0023H        ;串行中断程序入口地址RETI                    ;串行中断程序返回START:               ;主 程 序                 ;;MOV   R0,#30H          ;清30H-38H共11个内存单元MOV   R7,#9            ;9个字节CLEETE:MOV   @R0,#00H            INC      R0DJNZ    R7,CLEETEMOV    TIMES,#00H       ;清调时标志MOV    TMOD,#01H       ;设T0为16位定时器MOV    TL0,#0C0H         ;40MS定时初值(T0计时用)MOV    TH0,#63H         ;40MS定时初值MOV  SEC,#0MOV MINUTE,#0HMOV HOUR,#0HMOV DAY,#01HMOV MONTH,#01HMOV YEAR,#01HMOV YEARH,#20HSETB     EA                  ;总中断开放SETB     ET0                 ;允许T0中断SETB     TR0                 ;开启T0定时器MOV     R4,#19          ;1秒定时用(40MS×25)START1:CALL      DISP              ;调用显示子程序JNB      AA,SETMM1    ;P3.3口为0时转时间调整程序JMP     START1           ;P3.3口为1时跳回START1SETMM1:    CALL       SETMM         ;调时间调整程序SETMMJMP START1SETMM:                    ;时间调整程序CALL DISPCALL DISPJB AA,SETMMO              ;是干扰跳过SETMM2:JNB AA,SETMM3CLR ET0CLR TR0                         ;关T0中断MOV SEC,#0                 ;秒清零MOV TIMES,#01H           ;分开始调整MOV R0,#MINUTE           ;SETMM4:NOPINC22:CALL OFFL                            ;灭显示CALL INC11                        ;加调整CALL DISPJB AA,INC22CALL DISPJB AA,INC22INC R0MOV A,TIMESRL AMOV TIMES,AJNB TIMES.5,SETMM4        ;继续调整下一数据SETMM12:JNB AA,SETMM11SETMMO:SETB TR0SETB ET0                         ;调整完成开始计时RETSETMM11:CALL DISPJMP SETMM12SETMM3:CALL DISP     JMP SETMM2                ;避免调整时无显示INC11:MOV R3,#40INC111:MOV A,@R0JB BB,INC17ADD A,#1                     ;加1DA ACALL  INC000                 ;数据比较  INC13:JNB BB,INC14INC17:MOV @R0,A                 ;存入调整后的数据CALL DISPDJNZ R3,INC111RETINC14:CALL DISPJMP INC13OFFL:                             ;灭显示MOV 22H,@R0MOV R6,#10OFF1:MOV R7,#10OFF2:MOV @R0,#0AAH         ;放入熄灭码CALL DISPDJNZ R7,OFF2DJNZ R6,OFF1MOV @R0,22HRETINC000:                      ;比较子程序JB TIMES.0,INC001       ;分比较JB TIMES.1,INC002       ;时比较JB TIMES.2,INC003       ;日比较JB TIMES.3,INC004       ;月比较JB TIMES.4,INC005       ;年比较JMP INCOUT                 INC005:CJNE A,#99H,INCOUTMOV A,#00H               ;超过99年为00年JMP INCOUTINC004:CJNE A,#13H,INCOUTMOV A,#01H               ;超过12月为1月JMP INCOUTINC003:CJNE A,#32H,INCOUTMOV A,#01H               ;超过31天为1日JMP INCOUTINC002:CJNE A,#24H,INCOUTMOV A,#00H               ;超过23时为0时JMP INCOUTINC001:CJNE A,#60H,INCOUTMOV A,#00H               ;超过59分为0分INCOUT:RET                      ;返回INTT0:           ;1秒计时程序              ;;PUSH    ACC               ;累加器入栈保护PUSH     PSW             ;状态字入栈保护ORL      TL0,#0C0H       ;低8位初值修正MOV   TH0,#63H        ;高8位初值修正DJNZ   R4,CLKE111     ;25次中断未到JMP   LOOP11CLKE111:JMP   CLKE                  LOOP11:MOV   R4,#19H           ;25次中断到(1秒)重赋初值MOV   A,SEC                ;调整秒ADD   A,#1DA    AMOV   SEC,ACJNE  A,#60H,CLKE99  ;整分否MOV   SEC,#0             ;清秒MOV   A,MINUTE          ;调整分ADD   A,#1DA    AMOV   MINUTE,ACLK0:CJNE  A,#60H,CLKE      ;整点否MOV   MINUTE,#0       ;清分MOV   A,HOUR            ;调整时ADD   A,#1DA    AMOV   HOUR,ACJNE  A,#24H,CLKE     ;零点否MOV   HOUR,#0         ;清时MOV   A,DAY            ;调整日期ADD   A,#1DA    AMOV   DAY,AMOV   A,MONTH         ;查阅本月最大日期INC   AMOVC  A,@A+PCSJMP  CLK1DB 31H,28H,31H       ;对应月份编码:01H,02H,03HDB 30H,31H,30H       ;对应月份编码:04H,05H,06HDB 31H,31H,30H       ;对应月份编码:07H,08H,09HDB 00H,00H,00H       ;对应无效月份编码:0AH,0BH,0CHDB 00H,00H,00H       ;对应无效月份编码:0DH,0EH,0FHDB 31H,30H,31H       ;对应月份编码:10H,11H,12HCLK1:CLR   CSUBB  A,DAYJNC   CLKE                ;本月未满MOV   A,MONTHCJNE  A,#2,CLK3       ;是二月MOV   A,YEARANL   A,#13H           ;保留年份中非4的整数部分JNB   ACC.4,CLK2ADD   A,#2CLK2:ANL   A,#3             ;能否被4整除JNZ   CLK3             ;非闰年MOV   A,DAYXRL   A,#29HJZ    CLKE              ;闰年二月可以有29日CLK3:MOV   DAY,#1          ;调整到下个月的1日MOV   A,MONTHADD   A,#1DA    AMOV   MONTH,ACJNE  A,#13H,CLKEMOV   MONTH,#1        ;调整到下一年的一月份MOV   A,YEAR             ;调整年份ADD   A,#1DA    AMOV   YEAR,ACLKE99:CALL  CONVERT         ;农历转换子程序CLKE:                       ;时钟调整完毕,处理其它定时任务POP   PSWPOP   ACC    RETI                  ;完成DISP:     ;显示寄存器处理PUSH  PSWPUSH  ACCMOV   23H,R0         ;保存R0DISP99:MOV   R1,#40H       ;显示寄存器首址MOV   R0,#30H       ;待处理寄存器首址MOV   R2,#9           ;处理N次DISP1:MOV   A,@R0         ;低寄存器1内容存入AANL   A,#0FH MOV   @R1,A         ;将A的值存入显示寄存器1 MOV   A,@R0         ;低寄存器1内容存入ASWAP  AANL   A,#0FH INC   R1                  ;R1地址加1  MOV   @R1,A         ;将A的值存入显示寄存器2DJNZ  R2,DISP2       ;处理完N次,没有地址加1CALL  DISPLAYMOV   R0,23H        POP   ACCPOP   PSWRETDISP2:INC   R1INC   R0JMP   DISP1  DISPLAY:          MOV   R1,#40H       ;指向显示数据首址MOV    R5,#19        ;显示19个数据SETB   AAAPLAY: SETB   BBBNOPCLR    BBB                ;移一位CLR    AAA               ;清零MOV  A,@R1          ;取显示数据到AMOV  DPTR,#TAB     ;取段码表地址MOVC A,@A+DPTR ;查显示数据对应段码MOV   COM,A        ;段码放入P1口CALL    DL1MS         ;显示1MSMOV   COM,#0FFH  ;P1口复位DJNZ   R5,PLAY1  CLR    BBBSETB   AAA RET                      ;返回PLAY1:INC    R1              ;显示下一位JMP    PLAYTAB:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH,0A3H,8EH,0ABHDL1MS:MOV   25H,R7MOV   24H,R6      ;保存R6,R7MOV   R7,#20DS1:MOV   R6,#10DJNZ  R6,$DJNZ  R7,DS1MOV   R7,25HMOV   R6,24HRETSTART_YEAR EQU 01CONVERT_YEAR DATA 5CHCONVERT_MONTH DATA 38H ;BIT7 为1 表示闰月CONVERT_DATE DATA 37HTEMP_BYTE1 DATA 57HTEMP_BYTE2 DATA 58HTEMP_BYTE3 DATA 59HTEMP_BYTE4 DATA 5AHTEMP_BYTE5 DATA 5BH;以下为公历转农历子程序CONVERT:MOV A,YEARMOV TIME_YEAR,AMOV A,MONTHMOV TIME_MONTH,AMOV A,DAYMOV TIME_DATA,A MOV A,TIME_YEARMOV B,#16DIV ABMOV CONVERT_YEAR,BMOV B,#10MUL ABADD A,CONVERT_YEARMOV CONVERT_YEAR,AMOV A,TIME_MONTHJNB ACC.4,CON_02CLR ACC.4 ;ACC.4 为1 表示大于10 月ADD A,#10CON_02: MOV CONVERT_MONTH,AMOV A,TIME_DATAMOV B,#16DIV ABMOV CONVERT_DATE,BMOV B,#10MUL ABADD A,CONVERT_DATEMOV CONVERT_DATE,AMOV DPTR,#MONTH_DATA MOV A,CONVERT_YEARCON_06: CLR CSUBB A,#START_YEARMOV B,#3 ;表格每年3 字节MUL ABADD A,DPLMOV DPL,AMOV A,BADDC A,DPHMOV DPH,AMOV A,#2MOVC A,@A+DPTR ;读本年表格最后一字节CLR ACC.7 ;ACC.7 是闰年第13 个月大小,在此不用MOV B,#32DIV ABMOV TEMP_BYTE1,A ;春节月份MOV TEMP_BYTE2,B ;春节日; 以下计算当前日期距元旦天数MOV TEMP_BYTE3,#0 ;设距元旦天数高位为0MOV A,CONVERT_MONTHCJNE A,#10,CON_08CON_08: JC CON_09 ;9 月以前日子数小于256 天,高字节为0(9 月份过去的整月为8 个月)MOV TEMP_BYTE3,#1CON_09: MOV A,CONVERT_YEARANL A,#03H ;ACC 为除4 的余数JNZ CON_10 ;转常年处理; 年除4 余数为0 是闰年MOV A,CONVERT_MONTHLCALL GET_RUN_DAYS_LOW ;取得闰年过去月的天数的低字节SJMP CON_12CON_10: MOV A,CONVERT_MONTHLCALL GET_DAYS_LOW ;取得常年过去月的天数的低字节CON_12: MOV B,CONVERT_DATEDEC B ;因为日期从1 日起,而不是0 日起ADD A,B ;过去的整月天数加当月天数MOV TEMP_BYTE4,AJNC CON_14INC TEMP_BYTE3 ;TEMP_BYTE3,TEMP_BYTE4 分别为公历年过去的天数的高低字节; 以下求春节距元旦天数,因肯定小于256 天所以只用一字节表示CON_14: MOV A,TEMP_BYTE1LCALL GET_DAYS_LOW ;春节不会在3 月份,不用考虑闰年DEC A ;因为日期从1 日起ADD A,TEMP_BYTE2MOV TEMP_BYTE5,A ;TEMP_BYTE5,为春节距元旦天数MOV A,CONVERT_MONTHCJNE A,TEMP_BYTE1,CON_20 ;转换月与春节月比较MOV A,CONVERT_DATECJNE A,TEMP_BYTE2,CON_20 ;转换日与春节日比较CON_20: JC CON_22LJMP CON_60 ;当前日大于等于春节日期,公历年与农历年同年份CON_22: MOV A,CONVERT_YEAR ;不到春节,农历年比公历年低一年JNZ CON_24MOV A,#100 ;年有效数0-99CON_24: DEC AMOV CONVERT_YEAR,AMOV A,DPLCLR CSUBB A,#3MOV DPL,AJNC CON_26DEC DPH ;表格指针指向上一年CON_26: MOV A,TEMP_BYTE5CLR CSUBB A,TEMP_BYTE4MOV TEMP_BYTE3,A ;TEMP_BYTE3 中为当前日离春节的天数MOV CONVERT_MONTH,#12 ;农历月为12 月CLR F0 ;1901-2099 年没有闰12 月,清闰月标志CLR AMOVC A,@A+DPTRANL A,#0F0HSWAP A;MOV TEMP_BYTE4,A ;TEMP_BYTE4 中为闰月JZ CON_30 ;没有闰月转移MOV A,#2 ;有闰月,取第13 个月天数MOVC A,@A+DPTRMOV C,ACC.7MOV A,#1MOVC A,@A+DPTRRLC A ;ACC 中为最后6 个月的大小值SJMP CON_34CON_30: MOV A,#1MOVC A,@A+DPTR ;ACC 中为最后6 个月的大小值CON_34: MOV TEMP_BYTE5,ACON_40: MOV A,TEMP_BYTE5RRC AMOV TEMP_BYTE5,AJC CON_42MOV B,#29 ;小月29 天SJMP CON_44CON_42: MOV B,#30 ;大月30 天CON_44: MOV A,TEMP_BYTE3CLR CSUBB A,BJZ CON_46 ;正好够减,就是农历日1 日JNC CON_50;不够减一月天数,结束农历月调整CPL A ;求补取绝对值INC ACON_46: INC A ;加1 即为农历日MOV B,#10 ;转换并保存农历日,月,年DIV ABSWAP AORL A,BMOV CONVERT_DATE,AMOV A,CONVERT_MONTHMOV B,#10DIV ABSWAP AORL A,BMOV CONVERT_MONTH,AMOV A,CONVERT_YEARMOV B,#10DIV ABSWAP AORL A,BMOV CONVERT_YEAR,ACALL WEEK      ;星期转换子程序?RET ;结束转换CON_50: MOV TEMP_BYTE3,A ;TEMP_BYTE3 存减去一月后的天数JB F0,CON_52 ;是闰月,前推一月,月份不减DEC CONVERT_MONTH;CON_52: MOV A,CONVERT_MONTHCJNE A,TEMP_BYTE4,CON_54CPL F0 ;当前月与闰月相同,更改闰月标志CON_54: SJMP CON_40CON_60: MOV A,TEMP_BYTE4 ;春节日小于当前日,农历年同公历年CLR CSUBB A,TEMP_BYTE5MOV TEMP_BYTE4,AJNC CON_62DEC TEMP_BYTE3 ;TEMP_BYTE3 TEMP_BYTE4 中为公历日离春节的天数CON_62: MOV CONVERT_MONTH,#1 ;农历月为1 月CLR AMOVC A,@A+DPTRMOV TEMP_BYTE5,AANL A,#0F0HSWAP A;XCH A,TEMP_BYTE5 ;TEMP_BYTE5 中为闰月,ACC 为当年农历表第一字节CLR F0 ;第一个月肯定不是闰月ANL A,#0FHMOV TEMP_BYTE1,AMOV A,#1MOVC A,@A+DPTRMOV TEMP_BYTE2,AANL A,#0F0HORL A,TEMP_BYTE1SWAP AMOV TEMP_BYTE1,AMOV A,#2MOVC A,@A+DPTRMOV C,ACC.7MOV A,TEMP_BYTE2ANL A,#0FHSWAP AMOV ACC.3,C;MOV TEMP_BYTE2,A ;以上TEMP_BYTE1,TEMP_BYTE2 各BIT 存农历年大小CON_70: MOV A,TEMP_BYTE2RLC AMOV TEMP_BYTE2,AMOV A,TEMP_BYTE1RLC AMOV TEMP_BYTE1,AJC CON_72MOV B,#29 ;小月29 天处理SJMP CON_74CON_72: MOV B,#30 ;大月30 天CON_74: MOV A,TEMP_BYTE4CLR CSUBB A,BJNC CON_78 ;低字节够减跳转MOV B,A ;低字节不够减, B 暂存减后结果,MOV A,TEMP_BYTE3JZ CON_76 ;高字节为0,不够减DEC TEMP_BYTE3MOV TEMP_BYTE4,BSJMP CON_80CON_76: MOV A,TEMP_BYTE4 ;不够减结束月调整LJMP CON_46 ;转日期加1 后,处理并保存转换后农历年月日CON_78: MOV TEMP_BYTE4,A ;TEMP_BYTE3 TEMP_BYTE4 天数为减去一月后天数CON_80: MOV A,CONVERT_MONTHCJNE A,TEMP_BYTE5,CON_82CPL F0 ;当前月与闰月相同,更改闰月标志JNB F0,CON_82 ;更改标志后是非闰月,月份加1SJMP CON_70CON_82: INC CONVERT_MONTH;SJMP CON_70GET_DAYS_LOW:MOVC A,@A+PC ;取得常年过去月的天数的低字节RETDB 0,31,59,90,120,151,181,212,243,17,48,78GET_RUN_DAYS_LOW:MOVC A,@A+PC ;取得闰年过去月的天数的低字节RETDB 0,31,60,91,121,152,182,213,244,18,49,79MONTH_DATA:;公历年对应的农历数据,每年三字节,;格式第一字节BIT7-4 位表示闰月月份,值为0 为无闰月,BIT3-0 对应农历第1-4 月的大小;第二字节BIT7-0 对应农历第5-12 月大小,第三字节BIT7 表示农历第13 个月大小;月份对应的位为1 表示本农历月大(30 天),为0 表示小(29 天).;第三字节BIT6-5 表示春节的公历月份,BIT4-0 表示春节的公历日DB 04DH,04AH,0B8H; 2001DB 00DH,04AH,04CH; 2002DB 00DH,0A5H,041H; 2003DB 025H,0AAH,0B6H; 2004DB 005H,06AH,049H; 2005DB 07AH,0ADH,0BDH; 2006DB 002H,05DH,052H; 2007DB 009H,02DH,047H; 2008DB 05CH,095H,0BAH; 2009DB 00AH,095H,04EH; 2010DB 00BH,04AH,043H; 2011DB 04BH,055H,037H; 2012DB 00AH,0D5H,04AH; 2013DB 095H,05AH,0BFH; 2014DB 004H,0BAH,053H; 2015DB 00AH,05BH,048H; 2016DB 065H,02BH,0BCH; 2017DB 005H,02BH,050H; 2018DB 00AH,093H,045H; 2019DB 047H,04AH,0B9H; 2020DB 006H,0AAH,04CH; 2021DB 00AH,0D5H,041H; 2022DB 024H,0DAH,0B6H; 2023DB 004H,0B6H,04AH; 2024DB 069H,057H,03DH; 2025DB 00AH,04EH,051H; 2026DB 00DH,026H,046H; 2027DB 05EH,093H,03AH; 2028DB 00DH,053H,04DH; 2029DB 005H,0AAH,043H; 2030DB 036H,0B5H,037H; 2031DB 009H,06DH,04BH; 2032DB 0B4H,0AEH,0BFH; 2033DB 004H,0ADH,053H; 2034DB 00AH,04DH,048H; 2035DB 06DH,025H,0BCH; 2036DB 00DH,025H,04FH; 2037DB 00DH,052H,044H; 2038DB 05DH,0AAH,038H; 2039DB 00BH,05AH,04CH; 2040DB 005H,06DH,041H; 2041DB 024H,0ADH,0B6H; 2042DB 004H,09BH,04AH; 2043DB 07AH,04BH,0BEH; 2044DB 00AH,04BH,051H; 2045DB 00AH,0A5H,046H; 2046DB 05BH,052H,0BAH; 2047DB 006H,0D2H,04EH; 2048DB 00AH,0DAH,042H; 2049DB 035H,05BH,037H; 2050DB 009H,037H,04BH; 2051DB 084H,097H,0C1H; 2052DB 004H,097H,053H; 2053DB 006H,04BH,048H; 2054DB 066H,0A5H,03CH; 2055DB 00EH,0A5H,04FH; 2056DB 006H,0B2H,044H; 2057DB 04AH,0B6H,038H; 2058DB 00AH,0AEH,04CH; 2059DB 009H,02EH,042H; 2060DB 03CH,097H,035H; 2061DB 00CH,096H,049H; 2062DB 07DH,04AH,0BDH; 2063DB 00DH,04AH,051H; 2064DB 00DH,0A5H,045H; 2065DB 055H,0AAH,0BAH; 2066DB 005H,06AH,04EH; 2067DB 00AH,06DH,043H; 2068DB 045H,02EH,0B7H; 2069DB 005H,02DH,04BH; 2070DB 08AH,095H,0BFH; 2071DB 00AH,095H,053H; 2072DB 00BH,04AH,047H; 2073DB 06BH,055H,03BH; 2074DB 00AH,0D5H,04FH; 2075DB 005H,05AH,045H; 2076DB 04AH,05DH,038H; 2077DB 00AH,05BH,04CH; 2078DB 005H,02BH,042H; 2079DB 03AH,093H,0B6H; 2080DB 006H,093H,049H; 2081DB 077H,029H,0BDH; 2082DB 006H,0AAH,051H; 2083DB 00AH,0D5H,046H; 2084DB 054H,0DAH,0BAH; 2085DB 004H,0B6H,04EH; 2086DB 00AH,057H,043H; 2087DB 045H,027H,038H; 2088DB 00DH,026H,04AH; 2089DB 08EH,093H,03EH; 2090DB 00DH,052H,052H; 2091DB 00DH,0AAH,047H; 2092DB 066H,0B5H,03BH; 2093DB 005H,06DH,04FH; 2094DB 004H,0AEH,045H; 2095DB 04AH,04EH,0B9H; 2096DB 00AH,04DH,04CH; 2097DB 00DH,015H,041H; 2098DB 02DH,092H,0B5H; 2099DB 00DH,053H,049H; 2100;以下子程序用于从当前公历日期,推算星期,;入口:TIME_YEAR,TIME_MONTH ,TIME_DATA ,定义公历年月日,BCD 码,其中月的;以下子程序用于从当前公历日期,推算星期,;入口:TIME_YEAR,TIME_MONTH ,TIME_DATE ,定义公历年月日,BCD 码,其中月的;年份存入R5,月份存入R6,日期存入R7(BCD码)TIME_WEEK1 DATA 52HWEEK:MOV A,TIME_YEARMOV B,#16DIV ABMOV TEMP_BYTE1,BMOV B,#10MUL ABADD A,TEMP_BYTE1MOV TEMP_BYTE1,A ;TEMP_BYTE1=年MOV A,TIME_MONTHJB ACC.7,GETW02MOV A,#100ADD A,TEMP_BYTE1MOV TEMP_BYTE1,A ;20 世纪年+100MOV A,TIME_MONTHCLR ACC.7GETW02: JNB ACC.4,GETW04ADD A,#10CLR ACC.4GETW04: MOV TEMP_BYTE2,A ;TEMP_BYTE2=月MOV A,TIME_DATAMOV B,#16DIV ABMOV TEMP_BYTE3,BMOV B,#10MUL ABADD A,TEMP_BYTE3MOV TEMP_BYTE3,A ;TEMP_BYTE3=日MOV A,TEMP_BYTE1;ANL A,#03HJNZ GETW10 ;非闰年转移MOV A,TEMP_BYTE2CJNE A,#3,GETW06GETW06: JNC GETW10 ;月大于2 转移DEC TEMP_BYTE3 ;份小于等于2,又是闰年,日减1GETW10: MOV A,TEMP_BYTE2;LCALL GET_CORRECT ;取月校正表数据ADD A,TEMP_BYTE1MOV B,#7DIV AB ;B 放年加校正日数之和后除7 的余数不先做这一步;有可能数据溢出MOV A,TEMP_BYTE1ANL A,#0FCHRR ARR A ;以上年除4 即闰年数ADD A,BADD A,TEMP_BYTE3MOV B,#7DIV ABMOV A,BCJNE A,#0,OUTOUTMOV  B,#8OUTOUT:               ;星期日显示8MOV TIME_WEEK1,BRETGET_CORRECT:MOVC A,@A+PCRETDB 0,3,3,6,1,4,6,2,5,0,3,5ENDGET_CORRECT:MOVC A,@A+PCRETDB 0,3,3,6,1,4,6,2,5,0,3,5END

设计分享|基于51单片机的万年历(汇编)相关推荐

  1. 设计分享|基于51单片机的数字时钟(汇编)

    具体实现功能 具体功能: 上电后滚动显示年.月.日.时.分,最后进入秒计时,通过四个按键可对时间进行设置操作. 设计介绍 单片机介绍 51单片是一种低功耗.高性能CMOS8位微控制器,具有 8K 在系 ...

  2. 设计分享 | 基于51单片机实现温度监测报警系统

    嵌入式工程师成长日记 https://mp.weixin.qq.com/s?__biz=Mzg4Mzc3NDUxOQ==&mid=2247484116&idx=1&sn=296 ...

  3. 设计分享 | 基于51单片机实现红外控制系统控制电机调速

    vx[嵌入式工程师成长日记] https://mp.weixin.qq.com/s?__biz=Mzg4Mzc3NDUxOQ==&mid=2247484124&idx=1&sn ...

  4. 基于51单片机的万年历(算法实现)

    基于51单片机的万年历,用到了单片机独立键盘.数码管.LED灯模块实现. 想要简单还是DS1302好用. 1 /******************************************** ...

  5. 基于51单片机的万年历(包含闹钟,秒表)实现

    开头唠一唠: 趁着寒假的时间,也趁着课程设计正好是做一个万年历.就打算好好从头到尾来一遍.涨涨知识.首先说的是本人也是小白一颗,大神们能帮忙指正错误的话,不胜感激.写博客只是为了总结经验,要是帮到一部 ...

  6. 51单片机项目设计:基于51单片机时钟万年历

    文章目录 一.项目功能 二.材料选择 三.原理图设计 四.PCB设计 五.程序设计 哔哩哔哩视频链接: https://www.bilibili.com/video/BV1EF411z7im/ 资料链 ...

  7. 智能手环功能模块设计_基于51单片机的智能手环蓝牙模块设计

    龙源期刊网 http://www.qikan.com.cn 基于 51 单片机的智能手环蓝牙模块设计 作者:王烈进 王游司 陈洪燕 孙超 卢宇 来源:<电脑知识与技术> 2018 年第 2 ...

  8. 用计算机设计电路图,基于51单片机的计算器设计(含电路图,程序)

    基于51单片机的计算器设计(含电路图,程序)(课题申报表,任务书,开题报告,中期检查表,外文翻译,论文11200字,程序,答辩PPT) 摘 要 计算器一般是指"电子计算器",能进行 ...

  9. 基于单片机的超市储物柜设计_基于51单片机对电子储物柜系统的设计

    电路描述: 安全是我们日常的生活中最关心的问题. 每个人都觉得安全问题是非常至关重要的,在家里的门和安全,可以尽可能多的安全. 为了对于门访问安全 因此,我们打算通过引进一个电子密码锁系统,该系统包括 ...

最新文章

  1. 使用beanutil简化request值的接收
  2. 一、pytorch搭建实战以及sequential的使用
  3. mysql外键教程_关于MySQL外键的简单学习教程
  4. 清空文件夹里面的所有文件和文件夹
  5. 2018年第九届蓝桥杯—C/C++程序设计省赛解题
  6. Qt学习之路1---软件下载安装及工程简介
  7. 圆周率一千万亿位_圆周率是如何计算的?祖冲之的缀术居然失传了
  8. JAVA通过调用数据库函数调用存储过程
  9. java获取不到ipv6的网卡
  10. Java基础编程题——水仙花数
  11. electron webview 页面加载事件顺序
  12. 在Android手机上对https请求进行抓包
  13. 软件工程大学生职业生涯规划_软件工程专业大学生职业生涯规划书范文
  14. SPSS软件中常见的统计分析方法有哪些
  15. android 浏览器隐藏地址,移动端隐藏手机浏览器的地址栏一下底部的菜单栏
  16. 生活杂谈-简单电器维修知识
  17. 中职计算机课题申报,中职计算机教研课题怎么申报
  18. 几个好玩有趣的Python入门实例
  19. try..catch捕获不到空指针等异常的问题
  20. 谷歌地图下载器中地图艺术照

热门文章

  1. [FastDFS] 文件路径M00是什么意思
  2. 普通用户强制修改root密码
  3. 工业循环水浅层砂过滤器(励进浅层介质过滤器)介绍及现场案例图
  4. Latex、如何将word中的表格转换为Latex代码
  5. 北斗短报文通信实现源码
  6. php两个图片并排显示,wordpress文章图片怎么并排
  7. 理解Marx-5 从巴黎到布鲁塞尔,创立历史唯物主义
  8. dlib 面部表情跟踪
  9. 在IE8中使用建行企业网银的解决方法
  10. 电脑赚钱兼职平台有哪些?分享几个正规靠谱的平台