51单片机汇编语言万年历完美版.

51单片机汇编语言万年历完美版.
51单片机汇编语言万年历完美版.

;**************万年历制作 BY----信工七

班 ;**************************** ;***************************** ;----------------------------------------------------------------------------------------- RCK BIT P0.5 SCK BIT P0.4 DAT BIT P0.7 RST BIT P0.6 BUZZER BIT P1.3 ;蜂鸣器 BYTE EQU 40H ;用于给锁存器送入数据 GEWEI EQU 41H ;用于存放数码管显示的第一位 SHIWEI EQU 42H ;用于存放数码管显示的第二位 BAIWEI EQU 43H ;用于存放数码管显示的第三位 QIANWEI EQU 44H ;用于存放数码管显示的第四位 TEMP1 EQU 45H TEMP2 EQU 46H COUNT EQU 47H ;用于扩展定时器计数时间 KTIME EQU 49H TEMP EQU 50H DMS EQU 51H ;用于存放运动秒表的最低位 DSECOND EQU 52H ;用于存放运动秒表的秒 DMIN EQU 53H ;用于存放运动秒表的分钟 CLKMIN EQU 54H ;用于存放闹钟分钟 CLKHOUR EQU 55H ;用于存放闹钟时 CLKF EQU 56H ;用于闹钟开启的标志位 ;----------------------------------------------------------------------------------------- ORG 0000H AJMP MAIN ORG 000BH ;定时器0中断入口地址 AJMP T0_INT ORG 001BH ;定时器1中断入口地址 AJMP

T1_INT ;********************************主程序

************************************************* ;----------------------------------------------------------------------------------------- MAIN: MOV R4,#00 ;计数秒 MOV

R5,#50 ;计数分 MOV R6,#15 ;计数时 MOV R0,#14H ;2013年 MOV R1,#0DH MOV R2,#6 ;6月 MOV R3,#18 ;18日 MOV COUNT,#0H MOV A,#5 ;开始使A不等于0,用于后面的判断 MOV CLKMIN,#0H MOV CLKHOUR,#0H MOV CLKF,#0H MOV SP,#60H MOV TMOD,#11H ;设置定时器0为工作模式1 MOV TH0, #03CH MOV TL0, #0B0H ;定时50000 us MOV TH1, #0D8H MOV TL1, #0F0H ;定时1000us=1MS SETB ET0 ;允许定时器中断 SETB ET1 SETB EA ;允许全局中断 SETB PT0 ;定时器中断设为高优先级 SETB EX0 ;允许外部中断 SETB EX1 SETB IT0 ;外部中断设为下降沿触发 SETB IT1 SETB TR0 ;启动定时器 ;--------------------------------------- START: MOV DPTR,#TABLE LJMP KEYSCAN ;首先进入时间显示,由于地址相差太远所以代码顺序有所改变 ;-------------------------------------- MARK2: LJMP KEYSCAN ;地

址差跳远无法跳转,此处进行中间跳转到时间显示界面 KEYCLK: MOV A,CLKF ;此处为闹

钟设置刚进入时的程序,由按键s12进入 JNZ KEYCLKF ;进入后通过CLKF

来判断闹钟功能是否启动,未启动时正常 ;显示为SHOWCLKF,启动时显示SHOWCLKF1,此两种显示差一个数码管最低位标志的点 KEYCLK1: LCALL SHOWCLK ;此处判定未启动闹钟功能时的显示 LCALL S4 ;在闹钟界面查看有无切换显示模式(此处也可认为是确定 ;按键)的按键s4按下, JZ MARK2 ;按下后跳转到时间显示 LCALL S8 ;在闹钟显示界面下查看启动闹钟功能的键s8是否按下MOV A,CLKF JNZ KEYCLKF ;按下后显示SHOWCLKF1的显示 LCALL S16 ;未按下则显示没有闹钟标志的数码管显示,再查看有无进 ;入调节s16的键按下,CJNE A,#7EH,KEYCLK1 ;未按下继续闹钟界面显示 KEYCLK2: LCALL SCLKMIN ;按下进入调节 MOV A,CLKMIN ;显示设置分钟的调节 MOV TEMP,A LCALL KEYSUB1 ;通过加减键s8,s12来设置闹钟 LCALL KEYADD1 MOV A,TEMP SUBB A,#60 ;调节分钟不超过59 JC REMAIN0 MOV TEMP,#0 REMAIN0: MOV A,TEMP MOV CLKMIN,A LCALL S16 ;查看有无进入调节s16的键按下, CJNE A,#7EH,KEYCLK2 ;未按下继续显示分钟调节 KEYCLK3: LCALL SCLKHOUR ;按下进入显示时调节 MOV A,CLKHOUR MOV TEMP,A ;送入参数,通过加减键进行调节设置 LCALL KEYSUB2 LCALL KEYADD2 MOV A,TEMP SUBB A,#24 ;时的设置不超过24 JC REMAIN1 MOV TEMP,#0 ;超过24置0 REMAIN1: MOV

A,TEMP MOV CLKHOUR,A LCALL S16 CJNE A,#7EH,KEYCLK3 ;再次判断有无

调节的切换键(按3次为确定)按下 KEYCLK4: LCALL SHOWCLK ;按下后跳转为闹钟的界面正常显示 LCALL S4 ;再判断有无切换显示模式的键按下,按下跳转显示 JZ KEYSCAN LCALL S8 ;再判断有无启动(关闭)闹钟功能的键按下 MOV A,CLKF ;根据CLKF(闹钟功能启动)的标志位显示不同的闹钟界面 JNZ KEYCLKF ;闹钟功能启动,跳转到KEYCLKF显示闹钟启动标记 GOON: LCALL S16 ;未启动则又判断有无进入调节的键按下 CJNE A,#7EH,KEYCLK4 ;没有按下继续正常显示 AJMP KEYCLK2 ;按下后重复KEYCLK2开始的内容 KEYCLKF: LCALL SHOWCLK1 ;显示出闹钟功能启动后的标记(数码管最低位标记) LCALL

S4 ;查看有无切换显示模式(闹钟设置确定后)键按下 JZ KEYSCAN ;按下后跳转到显示时间的界面 LCALL S8 ;未按则扫描开启(关闭)闹钟功能的键按下 MOV A,CLKF JZ KEYCLK4 ;根据闹钟功能的标记位跳转显示,若判断闹钟功能关闭则 ;跳转到KEYCLK4 显示无标志的闹钟 LCALL S16 ;若判断闹钟功能开启则扫描有无进入调节的按键s16按下

CJNE A,#7EH,KEYCLKF ;未按下则继续显示有标记的闹钟界面 AJMP KEYCLK2 ;按下后则又进入调节界面KEYCLK2 ;-------------------------------------------------- MARK3: LJMP MARK1 ;地址差跳远无法跳转,此处进行中间跳转到闹钟界面 ;---------------------------------------------------- KEYSCAN: LCALL HOURMINUTE ;显示时间 PUSH ACC ;为s12的判断先把A入堆栈,否则s12出会出现判断错误LCALL S4 ;查看有无切换键s4按下,按下跳转显示秒 JZ KEYSCAN1 MOV

A,CLKF ;在显示时间时判断闹钟功能是否开启,未开则跳转显示 JZ GO MOV

A,R6 ;判断是否与闹钟设置的时间相等,R6---时 CJNE A,CLKHOUR,GO MOV A,R5 ;R5--分 CJNE A,CLKMIN,GO LCALL SOUND ;闹钟功能开启,时分相等,则闹铃响 ;-------------------------------------------------- GO: POP ACC ; 如果不pop,A=0

一直成立,此时出现错误跳转 LCALL S12 ;查看有无进入闹钟设置的键按下 JZ MARK3 ; 按下则跳入显示闹钟设置界面 LCALL S16 ;查看有无进入调节键s16按下,按下进入调节 CJNE A,#7EH,KEYSCAN ;未按下则继续显示时间 SMINUTE: LCALL MINUTE ;s16按下后进入分调节显示 MOV TEMP,R5 ;将要调节的分钟送入函数参数 LCALL KEYADD1 ;进入调节后查看是否按下加法键s8,按下加一LCALL KEYSUB1 ;进入调节后查看是否按下减法键s8,按下减一 MOV A,TEMP SUBB A,#60 ;调节不超过60 JC REMAIN2 MOV TEMP,#0 REMAIN2: MOV

R5,TEMP ;把运算完后的分钟送出显示 LCALL S16 CJNE A,#7EH,SMINUTE ;没有s16按下,继续显示分调节 SHOUR: LCALL HOUR ;按下后进入显示时调节 MOV TEMP,R6 ;R6为装时的寄存器,送入参数进行调节 LCALL KEYADD2 LCALL KEYSUB2 MOV A,TEMP SUBB A,#24 ;调节不超过24 JC REMAIN3 MOV TEMP,#0 REMAIN3: MOV R6,TEMP LCALL S16 ; 再次按下s16键可确定时间调节完成 CJNE A,#7EH,SHOUR AJMP KEYSCAN ;调节完后重新正常显示时间 ;----------

----------------------------- ;--------------------------------------- KEYSCAN1: LCALL SHOWSECOND ;按切换键s4后进入的秒显示 LCALL S4 ;与时间显示的时候一样查看有无切换模式的键按下 JZ KEYSCAN2 ;按下则跳转显示日期 LCALL S12 ;此

处为查看有无进入闹钟功能的键按下,有则跳转 JZ MARK1 LCALL S16 ;若无闹钟键按下,查看有无进入调节的键s16按下 CJNE A,#7EH,KEYSCAN1 SMS: LCALL MS ;调节键按下显示需要调节内容 MOV A,COUNT ;与之前的一样把调节参数送入进行调节,此处调姐秒显示的低位 MOV TEMP,A LCALL KEYADD1 LCALL KEYSUB1 MOV A,TEMP SUBB A,#60 ;调节不超过60 JC REMAIN4 MOV TEMP,#0 MOV A,TEMP REMAIN4: MOV

A,TEMP MOV COUNT,A LCALL S16 ;查看有无切换调节内容的键s16按下CJNE A,#7EH,SMS ;没有s16键按下则显示原先调节内容 SSECOND: LCALL SECOND ;有键s16按下则显示进入秒的调节 MOV TEMP,R4 ;参数送入进行调节LCALL KEYADD2 LCALL KEYSUB2 MOV A,TEMP SUBB A,#60 ;调节不超过60 JC REMAIN9 MOV TEMP,#0 REMAIN9: MOV R4,TEMP LCALL S16 ; 再次按下

s16键可确定时间调节完成 CJNE A,#7EH,SSECOND ;未按下则继续显示选中的调节内容 AJMP KEYSCAN1 ;---------------------------------------- MARK1: LJMP KEYCLK ;地址差跳远无法跳转,此处进行中间跳转到闹钟界面 ;---------------------------------------- KEYSCAN2: LCALL SHOWDAY ;此处为日期显示,当切换模式键按下两下后进入显示 LCALL S4 ;与时间显示的时候一样查看有无切换模式的键按下JZ KEYSCAN3 ;按下则跳转显示年份 LCALL S12 ;此处为查看有无进入闹钟功能的键按下,有则跳转 JZ MARK1 LCALL S16 ;若无闹钟键按下,查看有无进入调节的键s16按下 CJNE A,#7EH,KEYSCAN2 SDAY: LCALL DAY ;调节键按下显示需要调节内容,此处为日 MOV TEMP,R3 ; 把日期寄存器R2的值送入临时变量用于调节 LCALL KEYADD1 ;调用加减按键扫描,按下后进行操作 LCALL KEYSUB1 MOV A,TEMP SUBB A,#32 ;调节不超过31 JC REMAIN5 MOV TEMP,#0 REMAIN5: MOV R3,TEMP LCALL S16 ;查看有无切换调节内容的键s16按下 CJNE A,#7EH,SDAY ;没有s16键按下则显示原先调节内容 SSMOUNTH: LCALL MOUNTH ;有键s16按下则显示进入月的调节 MOV TEMP,R2 LCALL KEYADD2

LCALL KEYSUB2 MOV A,TEMP SUBB A,#13 ;调节不超过12 JC REMAIN6 MOV TEMP,#0 REMAIN6: MOV R2,TEMP LCALL S16 ; 再次按下s16键可确定时间调节完成 CJNE A,#7EH,SSMOUNTH ;未按下则继续显示选中的调节内容 AJMP KEYSCAN2 ;--------------------------------------------- ;---------------------------------------------- KEYSCAN3: LCALL SHOWYEAR ;此处为日期显示,当切换模式键按下三下后进入显示 LCALL S4 JZ SHOW0 ;代码的内容除了显示的内容不同其他和以上的一样 LCALL S12 JZ MARK1 LCALL S16 CJNE A,#7EH,KEYSCAN3 SYEAR1: LCALL YEAR1 MOV TEMP,R1 LCALL KEYADD1 LCALL KEYSUB1 MOV

A,TEMP SUBB A,#100 ;调节不超过99 JC REMAIN7 MOV TEMP,#0 REMAIN7: MOV R1,TEMP LCALL S16 ; CJNE A,#7EH,SYEAR1 SYEAR2: LCALL YEAR2 MOV TEMP,R0 LCALL KEYADD2 LCALL KEYSUB2 MOV A,TEMP SUBB

A,#100 ;调节不超过99 JC REMAIN8 MOV TEMP,#0 REMAIN8: MOV R0,TEMP LCALL S16 CJNE A,#7EH,SYEAR2 AJMP KEYSCAN3 ;------------------------------------------ MARK: LJMP KEYSCAN ;地址差跳远无法跳转,此处进行中间跳转到时间显示

界面 ;------------------------------------------ SHOW0: MOV DMS,#0 ;切换键按下四次后此时切换到运动秒表计时从0开始计时 MOV DMIN,#0 MOV DSECOND,#0 LCALL SHOWDD ; 刚进入运动秒表模式,显示全为0 LCALL S4 JZ MARK LCALL S16 CJNE A,#7EH,SHOW0 ;运动秒表开始键按下,则计时开始,否则继续显示0 SETB TR1 ;开启定时器1 SHOWD: LCALL SHOWDD ;开始键s16按下后显示变化的数字 LCALL S4 ;查看有无模式显示键的按下 JZ MARK ;按下则跳转显示LCALL S16 ;查看s16有无按下 CJNE A,#7EH,SHOWD ;再次按下该键s16,停止计时 CLR TR1 ;关闭定时器1 SHOWTING: LCALL SHOWDD ;显示为定时的内容LCALL S4 ;查看有无模式显示键的按下 JZ MARK LCALL S16 CJNE

A,#7EH,SHOWTING ;再次按下s16,显示继续上次状态开始计时 SETB TR1 ;再次开启定时器 SHOWTING1: LCALL SHOWDD ;显示定时变化的定时内容 LCALL S4 JZ MARK LCALL S16 CJNE A,#7EH,SHOWTING1 ;再按一下s16再次进入暂停状态 CLR TR1 SHOWTING2: LCALL SHOWDD LCALL S4 JZ MARK LCALL S16

CJNE A,#7EH,SHOWTING2 AJMP SHOW0 ;再按一下s16 内容清零,重新进入初始化运动秒表模式 ;---------------------------------------------此段主要为调节、显示的过程内容 ;************主程序结束

****************************************************************** ;--------------出程序结束,一下为各个子函数 ;向74hc595发送一个字,并显示数据 ;----------------------------------------------------------------------------------------- SENDBYTE: MOV BYTE,A ;送入需要写入锁存器的参数 MOV A, #1 ;用1来移位选取各个位的数据ANL A,BYTE ;用与来选取数据 JNZ SEND CLR DAT ;与后结果为0则送入0 CLR SCK ;将写入的数据进行右移 SETB SCK AJMP LOOP ;跳转继续重复7次 SEND: SETB DAT ;与后结果不为0,则送入数据1 CLR SCK SETB SCK ;--------送入第一位数据 LOOP: MOV R7,#7 MOV A, #1 LOOP1: RL A MOV B,A ANL A,BYTE JNZ SEND1 SEND0: CLR DAT ;送0 AJMP SUOCUN SEND1: SETB DAT ;送1 AJMP SUOCUN SUOCUN: CLR SCK SETB SCK MOV A,B DJNZ R7,LOOP1 CLR RCK SETB RCK RET ;------------------------以上为数据进行输入锁存 DISPLAY: ACALL JISUAN DISPLAY1: MOV P0,#00H MOV A,GEWEI ACALL SENDBYTE ORL

P0,#08H ;给出最左边数码管的位选 MOV R7,#10H LCALL DLY ;-----------显示最左边的数码管 MOV P0,#00H MOV R7,#03H LCALL DLY MOV A,SHIWEI ACALL SENDBYTE ORL P0,#04H ;给出第二

位数码管的位选 MOV R7,#10H LCALL DLY ;--------------显示第二位数码管MOV P0,#00H MOV R7,#03H LCALL DLY MOV A,BAIWEI ACALL SENDBYTE ORL P0,#02H ;给出第三位数码管的位选 MOV R7,#10H LCALL DLY ;----------------显示第三位数码管 MOV P0,#00H MOV R7,#03H LCALL DLY MOV A,QIANWEI ACALL SENDBYTE ORL P0,#01H ;给出第三位数码管的位选 MOV R7,#10H LCALL DLY ;-------------------显示第四位数码管 RET ; ------------------------以上为数据显示 ;计算各位数的值把要显示的数进行分解 ;----------------------------------------- JISUAN: MOV A,TEMP1 MOV B,#10 DIV AB MOV TEMP1,B MOVC A,@A+DPTR MOV SHIWEI,A MOV A,TEMP1 MOVC A,@A+DPTR MOV GEWEI,A MOV

A,TEMP2 MOV B,#10 DIV AB MOV TEMP2,B MOVC A,@A+DPTR MOV

QIANWEI,A MOV A,TEMP2 MOVC A,@A+DPTR MOV BAIWEI,A RET ;-----------------以上为计算各个位数 ;----------------------------------------------------------------------------------------- ;显示高两位数(用于调节的时候显示) ;---------------------------------------------------------------------------------------- DISPLAY4: ACALL JISUAN MOV P0,#00H MOV A,BAIWEI ACALL SENDBYTE ORL P0,#02H MOV R7,#03H LCALL DLY ;----------------显示第三位数码管 MOV P0,#00H MOV R7,#03H LCALL DLY MOV

A,QIANWEI ACALL SENDBYTE ORL P0,#01H MOV R7,#03H LCALL DLY ;-------------------显示第四位数码管 RET ;------------------------------------------------------------------------------------------ ;只显示低两位数(用于调节的时候显示) ;------------------------------------------------------------------------------------------ DISPLAY2: LCALL JISUAN MOV P0,#00H MOV A,GEWEI LCALL SENDBYTE ORL P0,#08H MOV R7,#03H LCALL DLY ;-----------显示最左边的数码管 MOV P0,#00H MOV R7,#03H LCALL DLY MOV A,SHIWEI LCALL SENDBYTE ORL P0,#04H MOV R7,#03H LCALL DLY ;--------------显示第二位数码管 MOV P0,#00H MOV R7,#03H LCALL DLY RET ;----------------------------------------------------------------------------------------- ;显示时间子程序 ;----------------------------------------------------------------------------------------- HOURMINUTE: MOV TEMP2,R6 MOV TEMP1,R5 LCALL JISUAN ORL BAIWEI,#01H ;--------第三个数码管显示小数点 LCALL DISPLAY1 RET ;由于

只有四个数码管,此处显示时、分 SHOWSECOND: MOV TEMP2,R4 MOV A,COUNT MOV TEMP1,A LCALL JISUAN ORL BAIWEI,#01H LCALL DISPLAY1 RET ;此处单独显示秒 SHOWYEAR: MOV TEMP2,R0 MOV TEMP1,R1 LCALL DISPLAY RET SHOWDAY: MOV TEMP2,R2 MOV TEMP1,R3 LCALL DISPLAY RET SHOWCLK: MOV TEMP2,CLKHOUR MOV TEMP1,CLKMIN LCALL JISUAN ORL BAIWEI,#01H LCALL DISPLAY1 RET SHOWCLK1: MOV TEMP2,CLKHOUR MOV TEMP1,CLKMIN LCALL JISUAN ORL BAIWEI,#01H ORL GEWEI,#01H LCALL DISPLAY1 RET ;----------------------------------------------------------------------------------------- ;调节时间日期时独立显示每两位(用于调节的时候显示) ;---------------------------------------------------------------------------------------- MS: MOV TEMP1,COUNT

LCALL DISPLAY2 RET SECOND: MOV TEMP2,R4 LCALL DISPLAY4 RET MINUTE: MOV TEMP1,R5 LCALL DISPLAY2 RET HOUR: MOV TEMP2,R6 LCALL DISPLAY4 RET DAY: MOV TEMP1,R3 LCALL DISPLAY2 RET MOUNTH: MOV TEMP2,R2 LCALL DISPLAY4 RET YEAR1: MOV TEMP1,R1 LCALL DISPLAY2 RET YEAR2: MOV TEMP2,R0 LCALL DISPLAY4 RET SCLKMIN: MOV TEMP1,CLKMIN LCALL DISPLAY2 RET SCLKHOUR: MOV

TEMP2,CLKHOUR LCALL DISPLAY4 RET ;----------------------------------------------------------------------------------------- ;键盘扫描函数 ;---------------------------------------------------------------------------------------- ;切换调节显示内容键 S16: MOV P2,#0FFH CLR

P2.7 JB P2.0,S16END MOV R7,#18H LCALL DLY JNB P2.0,$ ;当键盘松开时往下执行否则停留在这一步 MOV A,#7EH S16END: RET ;切换模式显示内容键 S4: MOV P2,#0FFH CLR P2.7 JB P2.3,S4END MOV R7,#18H LCALL DLY JNB P2.3,$ ;当键盘松开时往下执行否则停留在这一步 MOV A,#0H ;设置扫描标志位A=0 S4END: RET ;设置闹钟键扫描与减法键位同一键s12 S12: MOV P2,#0FFH CLR P2.7 JB

P2.1,S12END MOV R7,#18H LCALL DLY JNB P2.1,$ ;当键盘松开时往下执行否则停留在这一步 MOV A,#0 ;设置扫描标志位A=0 S12END: RET ;用于确定启动闹钟功能的键盘扫描,与加法键位同一个 S8: MOV P2,#0FFH CLR P2.7 JB P2.2,S8END MOV R7,#18H LCALL DLY JNB P2.2,$ ;当键盘松开时往下执行否则停留在这一步MOV A,CLKF CPL A ;设置扫描标志位A=1 MOV CLKF,A S8END: RET ;单步、连续调节加法键 ;----------------------------------------------------------------------------------------- ;-----------------------------------------------------------------------

------------------ KEYADD2: MOV P2,#0FFH CLR P2.7 JB P2.2,ADDEND2 MOV R7,#18H LCALL DLY JT1: JNB P2.2,KT1 INC TEMP AJMP ADDEND2 KT1: INC KTIME MOV R7,#10H LCALL DLY ;用于调节高两位 MOV A,KTIME CJNE

A,#30,JT1 ADD2: INC TEMP MOV A,TEMP CJNE A,#99,ON2 MOV TEMP,#0 ON2: MOV R7,TEMP MOV TEMP2,R7 LCALL DISPLAY4 MOV R7,#30H LCALL DLY JNB P2.2,ADD2 ADDEND2: RET KEYADD1: MOV P2,#0FFH CLR P2.7 JB

P2.2,ADDEND1 MOV R7,#18H LCALL DLY JT2: JNB P2.2,KT2 INC TEMP AJMP

ADDEND1 ;用于调节低两位 KT2: INC KTIME MOV R7,#10H LCALL DLY MOV A,KTIME CJNE A,#30,JT2 ADD1: INC TEMP MOV A,TEMP CJNE A,#99,ON3 MOV TEMP,#0 ON3: MOV R7,TEMP MOV TEMP1,R7 LCALL DISPLAY2 MOV R7,#30H LCALL DLY JNB P2.2,ADD1 ADDEND1: RET ;----------------------------------------------------------------------------------------- ;单步、连续调节减法键 KEYSUB2: MOV

P2,#0FFH CLR P2.7 JB P2.1,SUBEND2 MOV R7,#18H LCALL DLY JT3: JNB

P2.1,KT3 DEC TEMP AJMP SUBEND2 KT3: INC KTIME MOV R7,#10H ;用于调节高两位 LCALL DLY MOV A,KTIME CJNE A,#30,JT3 SUB2: DEC TEMP MOV

A,TEMP CJNE A,#0,ON MOV TEMP,#99 ON: MOV R7,TEMP MOV TEMP2,R7 LCALL DISPLAY4 MOV R7,#30H LCALL DLY JNB P2.1,SUB2 SUBEND2: RET ;----------------------------------------------------------------------------------------- KEYSUB1: MOV P2,#0FFH CLR P2.7 JB P2.1,SUBEND1 MOV R7,#18H LCALL DLY JT4: JNB P2.1,KT4 DEC TEMP AJMP SUBEND2 KT4: INC KTIME MOV R7,#10H ; LCALL DLY MOV A,KTIME CJNE A,#30,JT4 SUB1: DEC TEMP ;用于调节低两位 MOV A,TEMP CJNE A,#0,ON1 MOV TEMP,#99 ON1: MOV R7,TEMP MOV TEMP1,R7 LCALL DISPLAY2 MOV R7,#30H LCALL DLY JNB P2.1,SUB1 SUBEND1: RET ;蜂鸣器响的子程序 ;----------------------------------------------------------------------------------------- SOUND: CLR BUZZER MOV R7,#5H LCALL DLY SETB BUZZER MOV

R7,#04H LCALL DLY RET ;----------------------------------------------------------------------------------------- ;延时子程序 ;----------------------------------------------------------------------------------------- DLY: PUSH 07H DY1: PUSH 07H DY2: PUSH 07H DY3: DJNZ

R7,DY3 POP 07H DJNZ R7,DY2 PO

P 07H DJNZ R7,DY1 POP 07H DJNZ R7,DLY RET ;----------------------------------------------------------------------------------------- ;定时器中断程序: ;----------------------------------------------------------------------------------------- T0_INT: MOV TH0,#3CH ;定时中断子程序。重装定时常数 MOV TL0,#0B0H ;3CB0=15536;65536-15536=50000 INC COUNT MOV A,COUNT CJNE A,#20,T0INTR ;50000*20=1S,未满20次,跳出中断子程序 MOV COUNT,#0 ;中断满20次COUNT清零 INC R4 CJNE

R4,#60,T0INTR ;不相等时跳转 MOV R4,#0 ;相等时跳转并R5清0 INC R5 CJNE

R5,#60,T0INTR ;不相等时跳转 ;整点报时提醒 MOV R5,#0 ;相等时跳转并R5清0 INC R6 CJNE R6,#24,T0INTR ;不相等时跳转 MOV R6,#0 ;相等时跳转并R0清0 CJNE R2,#2,JBOS ;如果不是2月,判断大月or小月 LCALL JLEAP ; 如果是二月,判断闰年or平年 CJNE A,#0,J29 CJNE R3,#28,INCR3 ;平年二月判断28天 MOV

R3,#1 INC R2 CJNE R2,#12,T0INTR MOV R2,#1 INC R0 AJMP T0INTR J29: CJNE R3,#29,INCR3 ; 闰年二月判断29天 MOV R3,#1 INC R2 CJNE R2,#12,T0INTR MOV R2,#1 INC R0 AJMP T0INTR JBOS: LCALL JMOUNTH ;不是二月,判断大小月 MOV A,B CJNE A,#0,JBIG CJNE R3,#30,INCR3 ;小月判断30天 MOV R3,#1 INC R2 CJNE R2,#12,T0INTR MOV R2,#1 INC R0 AJMP T0INTR JBIG: CJNE

R3,#31,INCR3 ;大月判断31天 MOV R3,#1 INC R2 CJNE R2,#12,T0INTR MOV

R2,#1 INC R0 AJMP T0INTR INCR3: INC R3 T0INTR: RETI ;----------------------------------------------------------------------------------------- ;判断是否为闰年程序 ;----------------------------------------------------------------------------------------- JLEAP: MOV B,#4 ;考虑到实际应用中电子钟不会用到一百年,现在只判断 ;后两位能被4整除即为闰年MOV A,R1 DIV AB MOV A,B CJNE A, #0,UNLEAP MOV A,#1 ;设置闰年标志AJMP LEAPEND UNLEAP: MOV A,#0 LEAPEND: RET ;----------------------------------------------------------------------------------------- ;判断大月小月 ;----------------------------------------------------------------------------------------- JMOUNTH: MOV A,R2 CJNE

A,#4,JMOUNTH6 AJMP SMOUNTH JMOUNTH6: CJNE A,#6, JMOUNTH9 ;判断是否是4.

6.9.11 其中一月 AJMP SMOUNTH JMOUNTH9: CJNE A,#9,JMOUNTH11 AJMP SMOUNTH JMOUNTH11: CJNE A,#11, BMOUNTH AJMP SMOUNTH BMOUNTH: MOV B,#1 ;设置大小月标志 AJMP JEND SMOUNTH: MOV B,#0 JEND: RET ;----------------------------------------------------------------------------------------- ;用于运动秒表的定时器1 ;----------------------------------------------------------------------------------------- T1_INT: MOV TH1, #0D8H MOV TL1, #0F0H INC DMS MOV A,DMS CJNE A,#100,T1_INTEND MOV DMS,#0 INC DSECOND MOV A,DSECOND CJNE

A,#60,T1_INTEND MOV DSECOND,#0 INC DMIN MOV A,DMIN CJNE

A,#10,T1_INTEND MOV DMIN,#0 ;计时最多只记10分钟 T1_INTEND: RETI ;----------------------------------------------------------------------------------------- ;运动秒表显示功

能 ;---------------------------------------------------------------------------------------- SHOWDD: MOV A,DMS MOV B,#10 DIV AB MOVC A,@A+DPTR MOV GEWEI,A MOV

A,DSECOND MOV B,#10 DIV AB MOV TEMP,B MOVC A,@A+DPTR MOV BAIWEI,A MOV A,TEMP MOVC A,@A+DPTR ORL A,#01H MOV SHIWEI,A MOV A,DMIN MOVC A,@A+DPTR ORL A,#01H MOV QIANWEI,A LCALL DISPLAY1 RET ;----------------------------------------------------------------------------------------- ;---------------------------------------------------------------------------------------- TABLE: DB

0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6 ; 显示数字0~9 END

基于51单片机的万年历的设计

单片机课程实训SCM PRACTICAL TRAINING

目录 第一部分课程设计任务书 (1) 一、课程设计题目 (1) 二、课程设计时间 (1) 三、实训提交方式 (1) 四、设计要求 (1) 第二部分课程设计报告 (2) 一、单片机发展概况 (2) 二、MCS-51单片机系统简介 (2) 三、设计思想 (3) 四、硬件电路设计 (3) 1. 总体设计 (3) 2. 晶振电路 (4) 3. 复位电路 (4) 4. DS1302时钟电路 (5) 5. 温度采集系统电路 (5) 6. 按键调整电路 (6) 7. 闹钟提示电路 (6) 五、软件设计框图 (7) 六、程序源代码 (8) 1. 主程序 (8) 2. 温度控制程序 (11) 3. 日历设置程序 (13) 4. 时钟控制程序 (18) 5. 显示设置程序 (20) 七、结束语 (23) 八、课程设计小组分工 (23) 九、参考文献 (23)

第一部分课程设计任务书 一、课程设计题目 用中小规模集成芯片设计制作万年历。 二、课程设计时间 五天 三、实训提交方式 提交实训设计报告电子版与纸质版 四、设计要求 (1)显示年、月、日、时、分、秒和星期,并有相应的农历显示。(2)可通过键盘自动调整时间。 (3)具有闹钟功能。 (4)能够显示环境温度,误差小于±1℃ (5)计时精度:月误差小于20秒。

第二部分课程设计报告 一、单片机发展概况 单片机诞生于20世纪70年代末,它的发展史大致可分为三个阶段: 第一阶段(1976-1978):初级单片机微处理阶段。该时期的单片机具有 8 位CPU,并行 I/O 端口、8 位时序同步计数器,寻址范围 4KB,但是没有串行口。 第二阶段(1978-1982):高性能单片机微机处理阶段,该时期的单片机具有I/O 串行端口,有多级中断处理系统,15 位时序同步技术器,RAM、ROM 容量加大,寻址范围可达 64KB。 第三阶段(1982-至今)位单片机微处理改良型及 16 位单片机微处理阶段民用电子产品、计算机系统中的部件控制器、智能仪器仪表、工业测控、网络与通信的职能接口、军工领域、办公自动化、集散控制系统、并行多机处理系统和局域网络系统。 二、MCS-51单片机系统简介 MCS-51系列单片机产品都是以Intel公司最早的典型产品8051为核心构成的。MCS-51单片机由CPU 、RAM 、ROM 、I/O接口、定时器/计数器、中断系统、内部总线等部件组成。8051单片机的基本性能有: ◆8位CPU; ◆布尔代数处理器,具有位寻址能力; ◆128B内部RAM,21个专用寄存器; ◆4KB内部掩膜ROM; ◆2个16位可编程二进制加1定时器/计数器; ◆32个(4×8位)双向可独立寻址的I/O口; ◆1个全双工UART(异步串行通信口); ◆5个中断源,两级中断结构; ◆片内振荡器及时钟电路,晶振频率为1.2MHz~12MHz; ◆外部程序/数据存储器寻址空间均为64KB; ◆111条指令,大部分为单字节指令; ◆单一+5V电源供电,双列直插40引脚DIP封装。

本科毕业设计--基于51单片机的电子日历设计

成都电子机械高等专科学校成教院毕业设计(论文) 论文题目:基于51单片机的电子日历设计 教学点:重庆科创职业学院 指导老师:张忠雨职称:讲师 学生姓名:聂燕学号: 2011700558 专业:应用电子技术 成都电子机械高等专科学校成教院制 2012 年 3 月 9 日

成都电子机械高等专科学校成教院毕业设计(论文)任务书 题目:基于51单片机的电子日历设计 任务与要求: 通过单片机设计电子日历数码管正常显示阳历、阴历日期,显示的格式为年-月-日,利用外部按键的操作实现阳历和阴历之间的 转换,实现阴历和阳历显示的暂停、运行等功能。 时间:2011年12月15日至2012 年3月15日共12 周教学点:重庆科创职业学院 学生姓名:聂燕学号:2011700558 专业:应用电子技术 指导单位或教研室: 指导教师:张忠雨职称:讲师 成都电子机械高等专科学校成教院制

毕业设计(论文)进度计划表

摘要 设计以单片机AT89C51为核心部件的电子日历,利用74LS245作为驱动器,74LS138作为译码器使用,六个七段数码管均采用共阴极的方式,P0口作为段选码输出口,P2口作为位选码输出口。 本次设计的题目是基于单片机的电子日历设计,可以正常的显示年、月、日,还可以利用外部按键实现阴历和阳历之间的转换以及暂停等功能。电子日历具有性能稳定、精确度高、成本低、易于产品化,以及方便、实用等特点。适用于家庭、公司、机关等众多场所。为人们的日常生活、出行安排提供了方便,成为人们日常生活中不可缺少的一部分。 本次设计可分为两部分:硬件系统、软件系统。 硬件系统包括:AT89S51单片机、74LS245驱动器、74LS138译码器、RC复位电路、+5V直流电源电路、去抖电路、动态显示扫描电路。 软件系统主要有单片机的编程构成。 关键词:单片机,日历,位码,段码,显示

51单片机汇编程序范例

16位二进制数转换成BCD码的的快速算法-51单片机2010-02-18 00:43在做而论道上篇博文中,回答了一个16位二进制数转换成BCD码的问题,给出了一个网上广泛流传的经典转换程序。 程序可见: http: 32.html中的HEX2BCD子程序。 .说它经典,不仅是因为它已经流传已久,重要的是它的编程思路十分清晰,十分易于延伸推广。做而论道曾经利用它的思路,很容易的编写出了48位二进制数变换成16位BCD码的程序。 但是这个程序有个明显的缺点,就是执行时间太长,转换16位二进制数,就必须循环16遍,转换48位二进制数,就必须循环48遍。 上述的HEX2BCD子程序,虽然长度仅仅为26字节,执行时间却要用331个机器周期。.单片机系统多半是用于各种类型的控制场合,很多时候都是需要“争分夺秒”的,在低功耗系统设计中,也必须考虑因为运算时间长而增加系统耗电量的问题。 为了提高整机运行的速度,在多年前,做而论道就另外编写了一个转换程序,程序的长度为81字节,执行时间是81个机器周期,(这两个数字怎么这么巧!)执行时间仅仅是经典程序的!.近来,在网上发现了一个链接: ,也对这个经典转换程序进行了改进,话是说了不少,只是没有实质性的东西。这篇文章提到的程序,一直也没有找到,也难辩真假。 这篇文章好像是选自某个著名杂志,但是在术语的使用上,有着明显的漏洞,不像是专业人员的手笔。比如说文中提到的:

“使用51条指令代码,但执行这段程序却要耗费312个指令周期”,就是败笔。51条指令代码,真不知道说的是什么,指令周期是因各种机型和指令而异的,也不能表示确切的时间。 .下面说说做而论道的编程思路。;----------------------------------------------------------------------- ;已知16位二进制整数n以b15~b0表示,取值范围为0~65535。 ;那么可以写成: ; n = [b15 ~ b0] ;把16位数分解成高8位、低8位来写,也是常见的形式: ; n = [b15~b8] * 256 + [b7~b0] ;那么,写成下列形式,也就可以理解了: ; n = [b15~b12] * 4096 + [b11~b0] ;式中高4位[b15~b12]取值范围为0~15,代表了4096的个数; ;上式可以变形为: ; n = [b15~b12] * 4000 + {[b15~b12] * (100 - 4) + [b11~b0]} ;用x代表[b15~b12],有: ; n =x * 4000 + {x * (100 - 4) + [b11~b0]} ;即: ; n =4*x (千位) + x (百位) + [b11~b0] - 4*x ;写到这里,就可以看出一点BCD码变换的意思来了。 ;;上式中后面的位:

基于51单片机电子万年历设计

基于51单片机电子万年历设计 专业:机电设备维修与管理姓名:杜洪浦指导老师: 摘要电子万年历是一种非常广泛日常计时工具,对现代社会越来越流行。它可以对年、月、日、周日、时、分和秒进行计时,还具有闰年补偿等多种功能,而且DS1302的使用寿命长,误差小。对于数字电子万年历采用直观的数字显示,可以同时显示年、月、日、周日、时、分、秒等信息,还具有时间校准等功能。该电路采用AT89S52单片机作为核心,功耗小,能在3V的低压工作,电压可选用3到5V电压供电。 万年历的设计过程在硬件与软件方面进行同步设计。硬件部分主要由AT89C52单片机,液晶显示电路,复位电路,时钟电路,稳压电路电路以及串口下载电路等组成。在单片机的选择上使用了AT89C52单片机,该单片机适合于许多较为复杂控制应用场合。显示器使用液晶LCD1602。软件方面主要包括日历程序、液晶驱动程序,显示程序等。程序采用汇编语言编写。所有程序编写完成后,在Keil C51软件中进行调试,确定没有问题后,在Proteus软件中嵌入单片机内进行仿真。 关键词时钟电钟,DS1302,液晶LCD1602,单片机 目录 1设计要求与方案论证 (2) 1.1 设计要求 (2) 1.2 系统基本方案选择和论证 (2) 1.2.1单片机芯片的选择方案和论证 (2) 1.2.2 显示模块选择方案和论证 (3) 1.2.3时钟芯片的选择方案和论证: (3) 1.3 电路设计最终方案决定 (3) 2系统的硬件设计与实现 (3) 2.1 电路设计框图 (4) 2.2 系统硬件概述 (4) 2.3 主要单元电路的设计 (4) 2.3.1单片机主控制模块的设计 (4)

51单片机实用汇编程序库(word)

51 单片机实用程序库 4.1 流水灯 程序介绍:利用P1 口通过一定延时轮流产生低电平 输出,以达到发光二极管轮流亮的效果。实际应用中例如:广告灯箱彩灯、霓虹灯闪烁。 程序实例(LAMP.ASM) ORG 0000H AJMP MAIN ORG 0030H MAIN: 9 MOV A,#00H MOV P1,A ;灭所有的灯 MOV A,#11111110B MAIN1: MOV P1,A ;开最左边的灯 ACALL DELAY ;延时 RL A ;将开的灯向右边移 AJMP MAIN ;循环 DELAY: MOV 30H,#0FFH D1: MOV 31H,#0FFH D2: DJNZ 31H,D2 DJNZ 30H,D1 RET END 4.2 方波输出 程序介绍:P1.0 口输出高电平,延时后再输出低电 平,循环输出产生方波。实际应用中例如:波形发生器。 程序实例(FAN.ASM): ORG 0000H MAIN: ;直接利用P1.0 口产生高低电平地形成方波////////////// ACALL DELAY SETB P1.0 ACALL DELAY 10 CLR P1.0 AJMP MAIN ;////////////////////////////////////////////////// DELAY: MOV R1,#0FFH DJNZ R1,$ RET

五、定时器功能实例 5.1 定时1 秒报警 程序介绍:定时器1 每隔1 秒钟将p1.o 的输出状态改变1 次,以达到定时报警的目的。实际应用例如:定时报警器。程序实例(DIN1.ASM): ORG 0000H AJMP MAIN ORG 000BH AJMP DIN0 ;定时器0 入口 MAIN: TFLA G EQU 34H ;时间秒标志,判是否到50 个 0.2 秒,即50*0.2=1 秒 MOV TMOD,#00000001B;定时器0 工作于方式 1 MOV TL0,#0AFH MOV TH0,#3CH ;设定时时间为0.05 秒,定时 20 次则一秒 11 SETB EA ;开总中断 SETB ET0 ;开定时器0 中断允许 SETB TR0 ;开定时0 运行 SETB P1.0 LOOP: AJMP LOOP DIN0: ;是否到一秒//////////////////////////////////////// INCC: INC TFLAG MOV A,TFLAG CJNE A,#20,RE MOV TFLAG,#00H CPL P1.0 ;////////////////////////////////////////////////// RE: MOV TL0,#0AFH MOV TH0,#3CH ;设定时时间为0.05 秒,定时 20 次则一秒 RETI END 5.2 频率输出公式 介绍:f=1/t s51 使用12M 晶振,一个周期是1 微秒使用定时器1 工作于方式0,最大值为65535,以产生200HZ 的频率为例: 200=1/t:推出t=0.005 秒,即5000 微秒,即一个高电

基于AT89C51单片机的电子万年历的设计_课程设计报告

课程设计报告 设计名称:电子万年历设计 专业班级:自动化10101班 完成时间:2013年6月9日 报告成绩:

摘要 本文介绍了基于AT89C51单片机的多功能电子万年历的硬件结构和软硬件设计方法。系统以AT89C51单片机为控制器,以串行时钟日历芯片DS1302记录日历和时间,它可以对年、月、日、时、分、秒进行计时,还具有闰年补偿等多种功能。万年历采用直观的数字显示,可以在LED上同时显示年、月、日、周日、时、分、秒,还具有时间校准等功能。此万年历具有读取方便、显示直观、功能多样、电路简洁、成本低廉等诸多优点,具有广阔的市场前景。 关键字AT89C51;电子万年历; DS1302

1 绪论 1.1 课题研究的背景 随着科技的快速发展,时间的流逝,从观太阳、摆钟到现在电子钟,人类不断研究,不断创新纪录。它可以对年、月、日、时、分、秒进行计时,还具有闰年补偿等多种功能,而且DS1302的使用寿命长,误差小。对于数字电子万年历采用直观的数字显示,可以同时显示年、月、日、时、分、秒和温度等信息,还具有时间校准等功能。该电路采用AT89C51单片机作为核心,功耗小,能在3V 的低压工作,电压可选用3~5V电压供电。 此万年历具有读取方便、显示直观、功能多样、电路简洁、成本低廉等诸多优点,符合电子仪器仪表的发展趋势,具有广阔的市场前景。 1.2课题的研究目的与意义 二十一世纪是数字化技术高速发展的时代,而单片机在数字化高速发展的时代扮演着极为重要的角色。电子万年历的开发与研究在信息化时代的今天亦是当务之急,因为它应用在学校、机关、企业、部队等单位礼堂、训练场地、教学室、公共场地等场合,可以说遍及人们生活的每一个角落。所以说电子万年历的开发是国家之所需,社会之所需,人民之所需。 由于社会对信息交换不断提高的要求及高新技术的逐步发展,促使电子万年历发展并且投入市场得到广泛应用。 1.3课题解决的主要内容 本课题所研究的电子万年历是单片机控制技术的一个具体应用,主要研究内容包括以下几个方面: (1)选用电子万年历芯片时,应重点考虑功能实在、使用方便、单片存储、低功耗、抗断电的器件。 (2)根据选用的电子万年历芯片设计外围电路和单片机的接口电路。 (3)在硬件设计时,结构要尽量简单实用、易于实现,使系统电路尽量简单。 (4)根据设计的硬件电路,编写控制AT89C51芯片的单片机程序。 (5)通过编程、编译、调试,把程序下载到单片机上运行,并实现本设计的功能。 (6)在硬件电路和软件程序设计时,主要考虑提高人机界面的友好性,方便用户操作等因素。 (7)软件设计时必须要有完善的思路,要做到程序简单,调试方便。

51单片机中的汇编语言与C语言.

51单片机中的汇编语言与 C 语言 C 语言, 更多的是为了掌握单片机的应用, C 语言是高效的应用程序开发工具, 与汇编语言比却不是开发高效应用程序的工具。就目前而言, 更多的是为了应用单片机, 开发应用程序, 更多的是强调开发效率, 而不是程序的运行效率 (相对而言。再就是应用程序对单片机内部资源的使用效率, 这在过去, 单片机内部资源紧缺的年代, 特别的强调, 现在已经不是特别重要了。所以, 大多数人都认为,只用 C 语言,就可以应对大多数单片机的应用开发了。 其实,汇编语言跟 C 语言在本质上一样的,只是语言形式不同而已,一个接近底层逻辑, 一个接近人类语言, 本质上都是对寄存器或存储器的读写操作而已。 汇编语言中,用 MOV 来回传送数据, C 语言里,用等号表示数据传送。汇编语言中,用 call 转去执行子过程程序, C 语言里,用个函数名调用子程序。汇编语言中,用 JMP 完成分支转移, C 语言里用 if 、 switch 、 while 、 for 来判断跳转。汇编语言跟 C 一样可以给寄存器指定命名,然后对定义的名称进行操作。汇编语言提供了对很多标志位的操作, C51根据需要也进行了改进, C 语言可以通过 #include给存储器命名来简化操作。 我觉得, C 语言是最接近汇编语言的一种高级语言, 要说不同, 也许具有大量函数的函数库,是 C 语言与汇编语言的最大区别,也是 C 语言比汇编语言有更大开发效率的原因。 在应用汇编语言进行应用程序开发时, 如果精心规划好程序结构, 设计好各种数据结构、子程序、中断程序,积累大量的算法程序(相当于函数库,也可以高效率的用汇编语言进行单片机开发。倒是兼容性、可移植性是汇编语言的最大限制,因为不同单片机有不同的指令系统,而 C 语言把这个问题,交给了机器也就是编译器去解决了。其实, 计算机的发展, 就是把尽可能多的事情交个机器去解决。

51单片机汇编语言教程:13课单片机逻辑与或异或指令详解

51单片机汇编语言教程:第13课-单片机逻辑与或异或指令详解

结果11111001 而所有的或指令,就是将与指仿中的ANL换成ORL,而异或指令则是将ANL换成XRL。即或指令: ORL A,Rn;A和Rn中的值按位'或',结果送入A中 ORL A,direct;A和与间址寻址单元@Ri中的值按位'或',结果送入A中 ORL A,#data;A和立direct中的值按位'或',结果送入A中 ORL A,@Ri;A和即数data按位'或',结果送入A中 ORL direct,A;direct中值和A中的值按位'或',结果送入direct中 ORL direct,#data;direct中的值和立即数data按位'或',结果送入direct中。 异或指令: XRL A,Rn;A和Rn中的值按位'异或',结果送入A中 XRL A,direct;A和direct中的值按位'异或',结果送入A中 XRL A,@Ri;A和间址寻址单元@Ri中的值按位'异或',结果送入A中 XRL A,#data;A和立即数data按位'异或',结果送入A中 XRL direct,A;direct中值和A中的值按位'异或',结果送入direct中 XRL direct,#data;direct中的值和立即数data按位'异或',结果送入direct中。 练习: MOV A,#24H MOV R0,#37H ORL A,R0 XRL A,#29H MOV35H,#10H ORL35H,#29H MOV R0,#35H ANL A,@R0 四、控制转移类指令 无条件转移类指令 短转移类指令 AJMP addr11 长转移类指令

单片机课程设计--基于51单片机的万年历

单片机课程设计报告 万年历的设计

基于51单片机的万年历 摘要: 电子万年历是一种非常广泛日常计时工具,对现代社会越来越流行。它可以对年、月、日、周日、时、分、秒进行计时,使用寿命长,误差小。对于数字电子万年历采用直观的数字显示,可以同时显示年、月、日、周日、时、分、秒和温度等信息,还具有时间校准等功能。该电路采用AT89S52单片机作为核心,功耗小,能在3V的低压工作,电压可选用3~5V电压供电。 本设计是基于51系列的单片机进行的电子万年历设计,可以显示年月日时分秒及周信息,具有可调整日期和时间功能。在设计的同时对单片机的理论基础和外围扩展知识进行了比较全面准备。万年历的设计过程在硬件与软件方面进行同步设计。硬件部分主要由AT89C52单片机,LCD显示电路,以及调时按键电路等组成。在单片机的选择上本人使用了AT89C52单片机,该单片机适合于许多较为复杂控制应用场合。显示器使用了1602液晶显示,并且使用蜂鸣器实现了整点报警的功能,温度测试的功能实现使用了DS18B20,并实现了温度过高或过低时的温度报警。 软件方面主要包括日历程序、时间调整程序,显示程序等。程序采用C语言编写。所有程序编写完成后,在KeilC51软件中进行调试,

确定没有问题后,在Proteus软件中嵌入单片机内进行仿真,并最终实现基本要求。 综上所述此万年历具有读取方便、显示直观、功能多样、电路简洁、成本低廉等诸多优点,符合电子仪器仪表的发展趋势,具有广阔的市场前景。 一、设计要求 基本要求: 1,8 个数码管上显示,显示时间的格式为(假如当前时间是19:32:20)“19-32-20”; 2,具有日历功能; ③时间可以通过按键调整。 发挥部分: ④具有闹钟功能(可以设定多个)。 二:总体设计 电路设计框图

单片机控制系统汇编程序

; step motor control ; ASM for MCS51 mode equ 082h contrl equ 08003h ctl equ 08000h ;8255接口芯片PA口的地址值 Astep equ 01h ;对A相通电,PA口的赋值 Bstep equ 02h ;对B相通电,PA口的赋值 Cstep equ 04h ;对C相通电,PA口的赋值 Dstep equ 08h ;对D相通电,PA口的赋值 dly_c equ 10h ;启动初值(加速度)寄存器 sd1 equ 80 ;0--255 加速度初值:值越小,加速越快 sd2 equ 40 ;

51单片机经典编辑流水灯汇编程序

单片机流水灯汇编程序设计 流水灯汇编程序 8只LED为共阳极连接,即单片机输出端为低电平时即可点亮LED。 ;用最直接的方式实现流水灯 ORG 0000H START:MOV P1,#01111111B ;最下面的LED点亮 LCALL DELAY ;延时1秒 MOV P1,#10111111B ;最下面第二个的LED点亮 LCALL DELAY ;延时1秒 MOV P1,#11011111B ;最下面第三个的LED点亮(以下省略) LCALL DELAY MOV P1,#11101111B LCALL DELAY MOV P1,#11110111B LCALL DELAY MOV P1,#11111011B LCALL DELAY MOV P1,#11111101B LCALL DELAY MOV P1,#11111110B LCALL DELAY MOV P1,#11111111B ;完成第一次循环点亮,延时约0.25秒 AJMP START ;反复循环 ;延时子程序,12M晶振延时约250毫秒 DELAY: ;大约值:2us*256*256*2=260ms,也可以认为为250ms PUSH PSW ;现场保护指令(有时可以不加) MOV R4,#2 L3: MOV R2 ,#00H L1: MOV R3 ,#00H L2: DJNZ R3 ,L2 ;最内层循环:(256次)2个周期指令(R3减一,如果比1大,则转向L2) DJNZ R2 ,L1 ; 中层循环:256次 DJNZ R4 ,L3 ;外层循环:2次 POP PSW RET END

51单片机汇编程序集(二) 2008年12月12日星期五 10:27 辛普生积分程序 内部RAM数据排序程序(升序) 外部RAM数据排序程序(升序) 外部RAM浮点数排序程序(升序) BCD小数转换为二进制小数(2位) BCD小数转换为二进制小数(N位) BCD整数转换为二进制整数(1位) BCD整数转换为二进制整数(2位) BCD整数转换为二进制整数(3位) BCD整数转换为二进制整数(N位) 二进制小数(2位)转换为十进制小数(分离BCD码) 二进制小数(M位)转换为十进制小数(分离BCD码) 二进制整数(2位)转换为十进制整数(分离BCD码) 二进制整数(2位)转换为十进制整数(组合BCD码) 二进制整数(3位)转换为十进制整数(分离BCD码) 二进制整数(3位)转换为十进制整数(组合BCD码) 二进制整数(M位)转换为十进制整数(组合BCD码) 三字节无符号除法程序(R2R3R4/R7)=(R2)R3R4 余数R7 ;二进制整数(2位)转换为十进制整数(分离BCD码) ;入口: R3,R4 ;占用资源: ACC,R2,NDIV31 ;堆栈需求: 5字节 ;出口: R0,NCNT IBTD21 : MOV NCNT,#00H MOV R2,#00H IBD211 : MOV R7,#0AH LCALL NDIV31 MOV A,R7 MOV @R0,A INC R0 INC NCNT MOV A,R3 ORL A,R4 JNZ IBD211 MOV A,R0 CLR C SUBB A,NCNT MOV R0,A RET ;二进制整数(2位)转换为十进制整数(组合BCD码) ;入口: R3,R4 ;占用资源: ACC,B,R7 ;堆栈需求: 3字节

基于51单片机的万年历设计

目录 第一章绪论 (3) 第二章设计要求及设计框图 (4) 2.1 设计要求 (4) 2.2 设计框图 (4) 第三章知识要点 (4) 3.1 LMO16L液晶模块 (4) 3.1.1 LM016L引脚说明 (5) 3.1.2 控制指令 (5) 3.1.3 基于Proteus ISIS 7的液晶模块仿真 (6) 3.2 单片机A T89C51 (8) 3.2.1 主要特性 (8) 3.2.2 管脚说明 (9) 3.2.3 振荡器特性 (11) 3.2.4 芯片擦除 (11) 3.3 时钟芯片DS1302 (11) 3.3.1 DS1302的控制字节 (12) 3.3.2 数据输入输出(I/O) (12) 3.3.3 DS1302的寄存器 (12) 3.4 DS18B20数字温度传感器 (13) 3.4.1技术性能描述 (13) 3.4.2 DS18B20主要的数据部件 (14) 3.4.3 DS18B20温度处理过程 (15) 3.4.4 DS18B20的主要特性 (17) 3.4.5 DS18B20的外形和内部结构 (17) 3.4.6 DS18B20工作原理 (18) 3.4.7 DS18B20的应用电路 (21) 3.4.8 DS18B20使用中注意事项 (23) 第四章硬件设计 (24) 4.1 Proteus软件 (24) 4.1.1 Proteus软件介绍 (24) 4.1.2 功能特点 (24) 4.1.3 革命性的特点 (24) 4.1.4 基本操作 (25) 4.1.5 选择要使用的元件 (25) 4.1.6 功能模块 (26) 4.2 基于89C51的万年历与温度显示器的硬件设计 (28) 4.2.1 设计框图 (29) 4.2.2 电路原理图 (29) 4.3 元件清单 (30) 第五章软件设计 (30)

最经典的51单片机经典流水灯汇编程序

单片机流水灯汇编程序设计 开发板上的8只LED为共阳极连接,即单片机输出端为低电平时即可点亮LED。 程序A: ;用最直接的方式实现流水灯 ORG 0000H START:MOV P1,#01111111B ;最下面的LED点亮 LCALL DELAY;延时1秒 MOV P1,#10111111B ;最下面第二个的LED点亮 LCALL DELAY;延时1秒 MOV P1,#11011111B ;最下面第三个的LED点亮(以下省略) LCALL DELAY MOV P1,#11101111B LCALL DELAY MOV P1,#11110111B LCALL DELAY MOV P1,#11111011B LCALL DELAY MOV P1,#11111101B LCALL DELAY MOV P1,#11111110B LCALL DELAY MOV P1,#11111111B ;完成第一次循环点亮,延时约0.25秒 AJMP START ;反复循环 ;延时子程序,12M晶振延时约250毫秒 DELAY: MOV R4,#2 L3: MOV R2 ,#250 L1: MOV R3 ,#250 L2: DJNZ R3 ,L2 DJNZ R2 ,L1 DJNZ R4 ,L3 RET END 程序B: ;用移位方式实现流水灯

ajmp main ;跳转到主程序 org 0030h ;主程序起始地址 main: mov a,#0feh ;给A赋值成11111110 loop: mov p1,a ;将A送到P1口,发光二极管低电平点亮 lcall delay ;调用延时子程序 rl a ;累加器A循环左移一位 ajmp loop ;重新送P1显示 delay: mov r3,#20 ;最外层循环二十次 d1: mov r4,#80 ;次外层循环八十次 d2: mov r5,#250 ;最内层循环250次 djnz r5,$ ;总共延时2us*250*80*20=0.8S djnz r4,d2 djnz r3,d1 ret end 51单片机经典流水灯程序,在51单片机的P2口接上8个发光二极管,产生流水灯的移动效果。 ORG 0 ;程序从0地址开始 START: MOV A,#0FEH ;让ACC的内容为11111110 LOOP: MOV P2,A ;让P2口输出ACC的内容 RR A ;让ACC的内容左移 CALL DELAY ;调用延时子程序 LJMP LOOP ;跳到LOOP处执行 ;0.1秒延时子程序(12MHz晶振)=================== DELAY: MOV R7,#200 ;R7寄存器加载200次数 D1: MOV R6,#250 ;R6寄存器加载250次数 DJNZ R6,$ ;本行执行R6次 DJNZ R7,D1 ;D1循环执行R7次 RET ;返回主程序

基于某51单片机地键盘盘可调万年历

开放性实验报告 题目: 基于80C51的万年历设计_ 院系:

专业班级: 学号: 姓名: 指导老师:________________________ 时间:2014年9月8号 摘要 电子万年历是一种非常广泛日常计时工具,对现代社会越来越流行。它可以对年、月、日、周、时、分、秒进行计时,还具有闰年补偿等多种功能。本系统选用DALLAS 公司生产的日历时钟芯片DS1302来作为实时时数字万年历采用直观数字显示,可以同时显示年、月、日、周、时、分、秒等信息,还具有键盘时间校准等功能。该电路采用AT89C52单片机作为核心,用以5V电压供电。 本系统硬件部分由AT89C52单片机、DS1302时钟芯片、LCD1602液晶显示环境下以C51语言编写,包括时间设置、时间显示、时间修正等功能。在仿真的时候,以Proteus 与Keil uVision4软件为基础,编写了MCS-51单片机对LCD1602显示控制的软件,绘制其原理图,并使用Proteus软件与Keil uVision4软件建立联合仿真。本设计主要论述了原理图各个模块的作用,以及控制软件的各个模块的编程。

关键词:时钟芯片DS1302;单片机AT89C52;液晶显示1602;独立键盘等

目录 第1章绪论 (1) 1.1实时万年历的简介 (1) 1.2系统所实现的功能 (3) 第2章开发工具软件简介 (4) 2.1K EIL U V ISION4软件简介 (4) 2.2P ROTEUS软件简介 (4)

2.3K EIL U V ISION4与P ROTEUS软件联合仿真 (5) 第3章LCD1602显示控制技术 (6) 3.11602字符型LCD简介 (6) 3.2LCD1602功能 (7) 3.3 LCD1602的指令说明及时序 (8) 3.4LCD1602的RAM地址映射及标准字库表 (7) 3.5 LCD1602的一般初始化(复位)过程 (8) 第4章系统硬件概况 (13) 4.1系统概况 (13) 4.2 MCS-51单片机最小系统模块 (14) 4.3 DS1302时钟芯片控制与键盘设置时间模块 (15) 4.4 LCD1602显示模块 (16) 第5章软件控制系统概况 (18) 5.1程序流程概况 (18) 5.2 流程图 (18) 5.3 源程序代码 (19) 参考文献 (25)

#第3章-MCS-51系列单片机的指令系统和汇编语言程序

第3章MCS一51系列单片机的指令系统 和汇编语言程序 3·1汇编指令 3·1·1请阐明机器语言、汇编语言、高级语言三者的主要区别,进一步说明为什么这三种语言缺一不可。 3·1·2请总结: (1)汇编语言程序的优缺点和适用场合。 (2)学习微机原理课程时,为什么一定要学汇编语言程序? 3·1·3MCS一51系列单片机的寻址方式有哪儿种?请列表分析各种寻址方式的访问对象和寻址范围。 3·1·4要访问片内RAM,可有哪几种寻址方式? 3·1·5要访问片外RAM,有哪几种寻址方式? 3·1·6要访问ROM,又有哪几种寻址方式? 3·1·7试按寻址方式对MCS一51系列单片机的各指令重新进行归类(一般根据源操作数寻址方式归类,程序转移类指令例外)。 3·1·8试分别针对51子系列和52子系列,说明MOV A,direct指令和MOV A,@Rj 指令的访问范围。 3·1·9传送类指令中哪几个小类是访问RAM的?哪几个小类是访问ROM的?为什么访问ROM的指令那么少?CPU访问ROM多不多?什么时候需要访问ROM? 3·1·10试绘图示明MCS一51系列单片机数据传送类指令可满足的各种传送关系。3·1·11请选用指令,分别达到下列操作: (1)将累加器内容送工作寄存器R6. (2)将累加器内容送片内RAM的7BH单元。 (3)将累加器内容送片外RAM的7BH单元。 (4)将累加器内容送片外RAM的007BH单元。 (5)将ROM007BH单元内容送累加器。 3·1·12 区分下列指令的不同功能: (l)MOV A,#24H 和MOV A.24H (2)MOV A,R0和MOV A,@R0 (3)MOV A,@R0和MOVX A,@R0 3·1·13设片内RAM 30H单元的内容为40H; 片内RAM 40H单元的内容为l0H; 片内RAM l0H单元的内容为00H; (Pl)=0CAH。 请写出下列各指令的机器码和执行下列指令后的结果(指各有关寄存器、RAM单元和端口的内容)。 MOV R0,#30H MOV A,@R0 MOV RI,A MOV B,@Rl MOV @R0,Pl MOV P3,Pl MOV l0H,#20H MOV 30H,l0H

单片机汇编语言经典一百例

51单片机实用程序库 4.1 流水灯 程序介绍:利用P1 口通过一定延时轮流产生低电平 输出,以达到发光二极管轮流亮的效果。实际应用中例如:广告灯箱彩灯、霓虹灯闪烁。 程序实例(LAMP.ASM) ORG 0000H AJMP MAIN ORG 0030H MAIN: 9 MOV A,#00H MOV P1,A ;灭所有的灯 MOV A,#11111110B MAIN1: MOV P1,A ;开最左边的灯 ACALL DELAY ;延时 RL A ;将开的灯向右边移 AJMP MAIN ;循环 DELAY:

MOV 30H,#0FFH D1: MOV 31H,#0FFH D2: DJNZ 31H,D2 DJNZ 30H,D1 RET END 4.2 方波输出 程序介绍:P1.0 口输出高电平,延时后再输出低电 平,循环输出产生方波。实际应用中例如:波形发生器。 程序实例(FAN.ASM): ORG 0000H MAIN: ;直接利用P1.0口产生高低电平地形成方波////////////// ACALL DELAY SETB P1.0 ACALL DELAY 10 CLR P1.0 AJMP MAIN ;////////////////////////////////////////////////// DELAY: MOV R1,#0FFH

DJNZ R1,$ RET END 五、定时器功能实例 5.1 定时1秒报警 程序介绍:定时器1每隔1秒钟将p1.o的输出状态改变1 次,以达到定时报警的目的。实际应用例如:定时报警器。程序实例(DIN1.ASM): ORG 0000H AJMP MAIN ORG 000BH AJMP DIN0 ;定时器0入口 MAIN: TFLA G EQU 34H ;时间秒标志,判是否到50个 0.2秒,即50*0.2=1秒 MOV TMOD,#00000001B;定时器0工作于方式 1 MOV TL0,#0AFH MOV TH0,#3CH ;设定时时间为0.05秒,定时 20次则一秒 11 SETB EA ;开总中断

快速入门单片机大全语言

快速入门单片机汇编语言 简要: 单片机有通用型和专用型之分。专用型是厂家为固定程序的执行专门开发研制的一种单片机,其程序不可更改。通用型单片机是常用的一种供学习或自主编制程序的单片机,其程序需要自己写入,可更改。单片机根据其基本操作处理位数不同可以分为:1位、4位、8位、16、32位单片机。 正文: 在此我们主要讲解美国ATMEL公司的89C51单片机。 一、89C51单片机PDIP(双列直插式)封装引脚图: 其引脚功能如下: P0口(—):为双向三态口,可以作为输入/输出口。但在实际应用中通常作为地址/数据总线口,即为低8位地址/数据总线分时复用。低8位地址在ALE信号的负跳变锁存到外部地址锁存器中,而高8位地址由P2口输出。 P1口(—):其每一位都能作为可编程的输入或输出线。 P2口(—):每一位也都可作为输入或输出线用,当扩展系统外设时,可作为扩展系统的地址总线高8位,与P0口一起组成16位地址总线。对89c51单片机来说,P2口一般只作为地址总线使用,而不作为I/O线直接与外设相连。 P3口(—):其为双功能口,作为第一功能使用时,其功能与P1口相同。当作为第二功能使用时,每一位功能如下表所示。 XTAL1(xtal2):外接晶振一脚,分别接晶振的一端。 Gnd:电源地。 Vcc:电源正级,接+5V。 PROG\ALE:地址锁存控制端 PSEN:片外程序存储器读选通信号输出端,低电平有效。 EA\vpp:访问外部程序储存器控制信号,低电平有效。当EA为高电平时访问片内存储器,若超出范围则自动访问外部程序存储器。当EA为低电平时只访问外部程序存储器。 二、常用指令及其格式介绍: 1、指令格式:

51单片机实现万年历程序文件

51单片机实现万年历 利用AT89S52单片机的P0口来和另外几个口来控制1602液晶的显示和P1口还有其它口来控制ds12887时钟芯片。设置四个按键,1个定义为时间设置功能键,一个定义为闹钟设置功能键,另外两个用来调节时间的增减。 原理图: pcb图:

源程序: #include #define uint unsigned int #define uchar unsigned char sbit beep=P2^0;//蜂鸣器控制口 sbit timeadd=P2^1;//调节时间加 sbit timesub=P2^2;//调节时间减 sbit timeclk=P2^3;//闹钟设定键 sbit timefun=P2^4;//时间设定键 sbit lcdrs=P2^5;//液晶的命令和数据控制口 sbit ledrw=P2^6;//液晶的写数据口 sbit lcden=P2^7;//液晶显示模块的使能端 sbit timeds=P3^3;//时钟芯片地址闸 sbit timerw=P3^4;//时钟芯片读写 sbit timeas=P3^5;//时钟芯片地址闸 sbit timeen=P3^6;//时钟芯片片选 uchar code table[]="20 - - week "; uchar code table1[]=" : : ";//要显示的字符串 char num,shi,fen,miao,nian=2000,yue,ri,week,numfun,anumfun,flag,flag1; uchar leap;

void delay(uint x){ uchar i,j; for(i=x;i>0;i--) for(j=110;j>0;j--); } void didi() { beep=0; delay(1000); beep=1; delay(1000); } void write_(uchar ){ lcdrs=0; P0=; delay(5); lcden=1; delay(20); lcden=0; } void write_date(uchar date){ lcdrs=1; P0=date; delay(5); lcden=1; delay(20); lcden=0; } void write_sfm(uchar add,uchar date){ uchar shi,ge; shi=date/10; ge=date%10; write_(0x80+0x40+add); write_date(0x30+shi); write_date(0x30+ge); } void write_nyr(uchar add,uchar date){ uchar shi,ge; shi=date/10; ge=date%10;

相关文档
最新文档