什么叫做单片机中的“溢出标志”?
0V——溢出标志,对于单字节的有符号数,若用最高位(b7)表示正、负号,则只有7位有效数位(b6~b0),能表示-128~+127之间的数。
运算结果超出了这个数值范围,就会发生溢出,此时0V=1,否则0V=0。此外,在执行乘法指令时,0V=1表示乘积超过255;在执行除法指令时,0V=1表示除数为0。
扩展资料
定时器中断由单片机中的定时器溢出而申请的中断。51单片机中有两个定时器T0和T1:TF0:定时器T0溢出中断请求。当定时器TO产生溢出时,TO中断请求标志TF0置1,请求中断处理。TF1:定时器T1溢出中断请求。当定时器Tl产生溢出时,T1中断请求标志TF1置1,请求中断处理。
F0,用户标志位:该位可由用户置1或清0,用于实现某些测控功能。?
AC,半进位标志位:当CPU进行加法(或减法)运算时,如果低半字节(b3~b0)向高半字节(b7~b4)有进位(或借位),即b3向b4进位(或借位)时,AC置1,否则清0。AC可用于BCD码加法时的调整判别位。
CY,进位标志位: 当CPU进行加法(或减法)运算时,如果运算结果的最高位(b7)有进位(或借位),CY则置1,否则清0。
参考资料来源:百度百科-定时器中断
参考资料来源:百度百科-PSW
基于单片机多功能数字钟
带万年历的LCD显示多功能数字钟
程序清单:
;????????????????????SMC1602接口程序(MCS51模拟口线方式)
;***************************************************************************
;连线图:?*LCM---8031*?*LCM---8031*?*LCM------------8031*
;????????*DB0---P0.0*?*DB4---P0.4*?*RS-------------P2.0*
;????????*DB1---P0.1*?*DB5---P0.5*?*RW-------------P2.1*
;????????*DB2---P0.2*?*DB6---P0.6*?*E--------------P2.2*??
;????????*DB3---P0.3*?*DB7---P0.7*?*VLCD接10K可调电阻到GND*
;注:8051的晶振频率为11.0592MHz?R0设置数据存放?S8为设置键?S7为加键?S4为确认键
;**************************************************************************
;P0口液晶显示
;?P2.4位选键P2.3加一键P2.2返回键及报时功能键闹钟设置P2.0控制显示键
;寄存器?clr?rs0?setb?rs1?R0?R4?R5在按键中用到??延时中用到?SETB?RS0???SETB?RS1的R0?R1?R2???????
;SETB?RS0??CLR?RS1显示中用到??CLR??RS0??CLR??RS1?在闹钟调整子程序中用到R1
?
;*********************************************************************
;
;报时功能P2.6????和闹钟功能P2.5??闹钟调整时间功能已经可以设置?????显示的切换方式变了???再关闭的情况下一切正常运行
;*****************************
?RSPIN???BIT?????P1.2
?RWPIN???BIT?????P1.1
?EPIN????BIT?????P1.0
?
?WEIXUAN?BIT?P2.4?;位选键设置键
?JIAJIAN?BIT?P2.3?;加一键
?JIANJIAN?BIT?P2.2?;减一键
?FANHUI?BIT?P2.1?;返回键
?NZKG?BIT?P2.0?;闹钟设置键
?
?
?
?SECONTL?EQU?30H?;秒
?SECONTH?EQU?31H?;秒
?MAOHAOL?EQU?32H?;:
?MINIUTL?EQU?33H?;分
?MINIUTH?EQU?34H?;分
?MAOHAOH?EQU?35H?;:
?HOURL?EQU?36H?;时
?HOURH?EQU?37H?;时
;*****************************日期部分***************************
?DAYL?EQU?40H?;日个
?DAYH?EQU?41H?;日十?
?HENL?EQU?42H?;-
?MONTHL?EQU?43H?;yue
?MONTHH?EQU?44H?;yue
?HENH?EQU?45H?;-
?YEARO?EQU?46H?;年
?YEART?EQU?47H
?YEARS?EQU?48H
?YEARF?EQU?49H
?TEMP?EQU?50H???;用做存储单元显示子程序(DISPLAY)里用到
?BIJIAO?EQU?51H?;加一子程序(JIAYI)中用到
?ZDRQO?EQU?55H?;中断加一程序中用到?
?ZDRQT?EQU?56H?;中断加一程序中用到
?ZDRQS?EQU?57H?;中断加一程序中用到
?ZDRQF?EQU?58H?;中断加一程序中用到
?DIZHI?EQU?59H?;键盘(JIANPAN)子程序里用到
?NZBZ?BIT?60H?;定时标志位在(闹钟开关部分)
?
?
?;38H到3FH没用到
?
?BSCSBZ?BIT?39H?;报时次数转换标志????(BSCS)里用到
?BSCSCC?EQU?3AH?;报时次数存储??(BSCS)里用到
?ZDBSBZ?BIT?3BH?;整点报时标志??(SSBS)里用到
?ZMBSBZ?BIT?3CH?;整秒闪烁标志??(SSBS)里用到
?BSKGBZ?BIT?3DH?;报时开启标志??(BSKG)里用到
?XKQHBZ?BIT?3EH?;显示开启关闭标志?(XIANKONG)里用到
?
?
?ORG?0000H
?AJMP?MAIN
?ORG?000BH
?AJMP?ZD
?ORG?0030H
MAIN:??MOV?SP,#60H??;给堆栈指针赋初值
?MOV?30H,#05H?;秒
?MOV?31H,#05H?;秒
?MOV?32H,#3AH?;:
?MOV?33H,#09H?;分
?MOV?34H,#05H?;分
?MOV?35H,#3AH?;:
?MOV?36H,#03H?;时
?MOV?37H,#01H?;时
;*****************************日期部分***************************
?MOV?40H,#09H?;日个
?MOV?41H,#02H?;日十?
?MOV?42H,#2DH?;-
?MOV?43H,#09H?;yue
?MOV?44H,#00H?;yue
?MOV?45H,#2DH?;-
?MOV?46H,#09H?;年
?MOV?47H,#09H
?MOV?48H,#09H
?MOV?49H,#02H
?CLR??P2.5??;闹钟
?CLR?P2.6??;整点报时
?
?MOV?03H,#00H??;闹钟分个位
?MOV?04H,#00H??;闹钟分十位
?MOV?06H,#04H??;闹钟时个位
?MOV?07H,#01H??;闹钟时十位
?
?;CLR??P1.5
?;CLR?P1.4
?
???????MOV????B,#20
?MOV????TMOD,#01H?????;定时器工作方式1
?MOV?TH0,#4CH
???MOV?TL0,#08H
??SETB?ET0?????????????????;允许T0中断
???SETB?EA??????????????????;总中断开放
?LCALL????LCDRESET????;初始化LCD
????????LCALL?DISPSTART?;调用显示初始状态
????????SETB?TR0???;开启定时器
????????
????????CLR?NZBZ??;闹钟开启关闭标志
????????CLR?BSKGBZ??;报时开启关闭标志
???????CLR?XKQHBZ??;显示开启关闭标志
?????????
LOOP:?LCALL?JIANPAN??;按键子程序
?LCALL?DISPLAY??;显示子程序
?LCALL?NZBF??;NAOZHONG??BUFENG?
?LCALL?NZBJ??;NAOZHONG?BIJIAO
?LCALL?BSKG??;BAOSHIKAIGUAN
?LCALL?BSCS??;BAOSHICISHU
?LCALL?SSBS??;闪烁报时
?SJMP?LOOP
;==============================中断加一程序===================================
ZD:?PUSH?ACC
?MOV?TH0,#4CH
???MOV?TL0,#08H
???DJNZ?B,ZDEND
???MOV????B,#20
???
?INC?SECONTL
?SETB?ZMBSBZ
?MOV?A,SECONTL
?CJNE?A,#0AH,ZDEND
?MOV?SECONTL,#00H
?INC??SECONTH
?MOV?A,SECONTH
?CJNE?A,#06H,ZDEND
?MOV?SECONTH,#00H
?INC?MINIUTL
?MOV?A,MINIUTL
?CJNE?A,#0AH,ZDEND
?MOV?MINIUTL,#00H
?INC??MINIUTH
?MOV?A,MINIUTH
?CJNE?A,#06H,ZDEND
?MOV?MINIUTH,#00H
?INC??HOURL
?SETB?BSCSBZ
?SETB?ZDBSBZ
?MOV?A,HOURL???;24小时的判断
?CJNE?A,#04H,ZDF
?MOV?A,HOURH
?CJNE?A,#02H,ZDEND
?MOV?HOURL,#00H
?MOV?HOURH,#00H
?LCALL?ZDRQ
?SJMP?ZDEND
ZDF:?CJNE?A,#0AH,ZDEND
?MOV?HOURL,#00H
?INC??HOURH
ZDEND:?POP?ACC
?RETI?
?
?;日期部分
ZDRQ:?PUSH?ACC
?INC?DAYL
?;判断天数28,30,31部分
?MOV?A,MONTHH??;用于判断月份时为31天30天28天
?CJNE?A,#01H,LL
?MOV?55H,#0AH??;存放月份的十位转化为个位是0AH
?MOV?A,MONTHL
?ADD?A,55H???;月分高低相加用于查表
?SJMP?LL3
LL:?MOV?A,MONTHL
?ADD?A,MONTHH
LL3:?MOV?56H,A???;存放相加后的月份数据
?MOV?DPTR,#TAB5
?MOVC?A,@A+DPTR??;查十位和天数的十位比较
?MOV?57H,A
?MOV?A,56H
?MOV?DPTR,#TAB6??;查个位和天数的个位比较
?MOVC?A,@A+DPTR
?MOV?58H,A
?MOV?A,DAYH
?CJNE?A,57H,LL2
?MOV?A,DAYL
?CJNE?A,58H,LL2
?MOV?DAYH,#00H
?MOV?DAYL,#01H
?SJMP?LL4
LL2:?MOV?A,DAYL
?CJNE?A,#0AH,ZDRQEND
?MOV?DAYL,#00H
?INC?DAYH
?MOV?A,DAYH???;比较天数是否要进位
?CJNE?A,57H,ZDRQEND
?MOV?A,DAYL
?CJNE?A,58H,ZDRQEND
?MOV?DAYH,#00H
?MOV?DAYL,#01H
?
?;月份和年份
?
LL4:?INC?MONTHL
?MOV?A,MONTHL
?CJNE?A,#03H,ZDRQ1??;用于判断月份时为12月时进位
?MOV?A,MONTHH
?CJNE?A,#01H,ZDRQ1
?MOV?MONTHL,#01H??;天数符合要求
?MOV?MONTHH,#00H
?SJMP?ZDRQ2
?
ZDRQ1:?CJNE?A,#0AH,ZDRQEND
?MOV?MONTHL,#00H
?INC?MONTHH
?SJMP?ZDRQEND
ZDRQ2:?INC?YEARO???;年的加一
?MOV?A,YEARO
?CJNE?A,#0AH,ZDRQEND
?MOV?YEARO,#00H
?INC?YEART???;年的进位
?MOV?A,YEART
?CJNE?A,#0AH,ZDRQEND
?MOV?YEART,#00H
?INC?YEARS
?MOV?A,YEARS
?CJNE?A,#0AH,ZDRQEND
?MOV?YEARS,#00H
?INC?YEARF
?MOV?A,YEARF
?CJNE?A,#0AH,ZDRQEND
?MOV?YEARF,#00H
??
ZDRQEND:?
?POP?ACC
?RET
;液晶初始化
;========================初始化程序=======================================
LCDRESET:???????????????????????;初始化程序
????????LCALL????DELAY5MS????????;延时15MS
????????LCALL????DELAY5MS
????????LCALL????DELAY5MS
????????MOV?A,#38H??????????;显示模式设置(不检测忙信号)
????????LCALL????LCDWCN??????????;共三次
????????LCALL????DELAY5MS
????????MOV?????A,#38H
????????LCALL????LCDWCN
????????LCALL????DELAY5MS
????????MOV?????A,#38H???????????????
????????LCALL????LCDWCN
????????MOV?????A,#38H??????????;显示模式设置(以后均检测忙信号)
????????LCALL????LCDWC
????????MOV?????A,#08H??????????;显示关闭
????????LCALL????LCDWC
????????MOV?????A,#01H??????????;显示清屏
????????LCALL????LCDWC
????????MOV?????A,#06H??????????;显示光标移动设置
????????LCALL????LCDWC
????????MOV?????A,#0CH??????????;显示开及光标设置
????????LCALL????LCDWC
????????RET
;==============================写指令===================================
LCDWC:??????????????????????????;送控制字子程序(检测忙信号)
????????LCALL????WAITIDLE????????
????????;******写指令*******;送控制字子程序(不检测忙信号)
LCDWCN:?CLR?????RSPIN???????????;RS=0?RW=0?E=高脉冲
????????CLR?????RWPIN
????????MOV?????P0,A
????????SETB????EPIN??;(
????????NOP???;给高电平脉冲
????????CLR?????EPIN??;)
????????RET???????
;==========================写数据=======================================????????
LCDWD:??????????????????????????????;写字符子程序
????????LCALL????WAITIDLE
????????SETB????RSPIN???????????????;RS=1?RW=0?E=高脉冲
????????CLR?????RWPIN
????????MOV?????P0,A
????????SETB????EPIN
????????NOP
????????CLR?????EPIN
????????RET
;===============================等待控制器空闲==================================
WAITIDLE:
????????PUSH????ACC?????????????????;正常读写操作之前必须检测LCD控制器状态
????????MOV?????P0,#0FFH
???????lcall?DELAY5MS??;4566666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666
????????CLR?????RSPIN???????????????;RS=0?RW=1?E=高电平
????????SETB????RWPIN
????????SETB????EPIN
????????lcall?DELAY5MS??;465555546465464654648791313848946113134849845461313579641613131354649498
WTD_PA:?NOP?????????????????????????;DB7:????0??LCD控制器空闲
????????JB??????P0.7,WTD_PA?????????;????????1??LCD控制器忙
????????CLR?????EPIN
????????POP?????ACC
????????RET?????????
;***********************初始状态子程序*******************************?
DISPSTART:???;显示初始状态子程序
?PUSH?ACC
?MOV?A,#80H
????????LCALL?LCDWC
?MOV?????DPTR,#TAB?;显示字符
DISP1:?CLR?A
?MOVC?A,@A+DPTR
?JZ?DISP2
?LCALL?LCDWD
?INC?DPTR
?SJMP?DISP1
DISP2:?MOV?A,#0C0H
?LCALL?LCDWC
?MOV?DPTR,#TAB1
DISP3:?CLR?A
?MOVC?A,@A+DPTR
?JZ?DISP_END
?LCALL?LCDWD
?INC?DPTR
?SJMP?DISP3
DISP_END:
?POP?ACC
?RET???
;==========================显示子程序=======================================???????
DISPLAY:PUSH?PSW
?PUSH?ACC
?SETB?RS0
?CLR?RS1
?MOV?A,#85H
?LCALL?LCDWC
?MOV?R1,#38H???;第一行显示数据存储单元的启始地址
?MOV?TEMP,#30H??;第一行显示数据存储单元的结束地址
?MOV?R6,#2
?
PLAY:?DEC?R1???
?CJNE?R1,#32H,PLY??;判断是否为冒号位
?MOV?A,MAOHAOL??;是者送冒号的ACSI码
?SJMP?PLAY1
PLY:?CJNE?R1,#35H,PLY1
?MOV?A,MAOHAOH
?SJMP?PLAY1
PLY1:?CJNE?R1,#42H,PLY2??;判断是否为横杠的位置
?MOV?A,HENL???;是者送横杠的ACSI码
?SJMP?PLAY1
PLY2:?CJNE?R1,#45H,PLY3
?MOV?A,HENH
?SJMP?PLAY1
?
?
PLY3:?MOV?A,@R1???;用查表法送要显示的数据
?MOV?DPTR,#TAB2
?MOVC?A,@A+DPTR
PLAY1:?LCALL?LCDWD
?MOV?A,R1
?CJNE?A,TEMP,PLAY??;判断第一行是否显示好了
?MOV?A,#0C5H
?LCALL?LCDWC
?MOV?R1,#4AH???;第二行显示数据存储单元的启始地址
?MOV?TEMP,#40H??;第二行的结束地址
?DJNZ?R6,PLAY???;R6为0时两行显示结束
?
?POP?ACC
?POP?PSW
?RET?
;************************按键子程序************************?
?
JIANPAN:clr?rs0??????;键盘子程序
?setb?rs1??;键盘子程序?
?JB?WEIXUAN,JIAN_ZEND?;设置键的判断
?LCALL?DELAY5MS
?JB?WEIXUAN,JIAN_ZEND
?PUSH?ACC
?JNB?WEIXUAN,$
?;MOV?A,#0FH??;开启光标闪烁设置
?;LCALL?LCDWCN
fah:?JNB?NZBZ,JPNZSJ?;为“1”闹钟???为“0”时钟
?LCALL?JPXS
?MOV?R4,#86H??;闹钟设定时间R4存放显示位地址
?MOV?R5,#2??;闹钟设定时间第一行第二行?????位置改变次数
?MOV?DIZHI,#8CH?;闹钟设定时间第一行结束地址
?MOV?R0,#06H
?SJMP?GIVED
JPNZSJ:?CLR?TR0
?MOV?R4,#86H??;R4存放显示位地址
?MOV?R5,#2??;第一行第二行?????位置改变次数
?MOV?DIZHI,#8DH?;第一行结束地址
?MOV?R0,#36H?
GIVED:?MOV?A,#0FH??;开启光标闪烁设置555555555555555555555555555555555555555555555
?LCALL?LCDWCN
?MOV?A,R4??
?LCALL?LCDWC?
UPONE:?JB?FANHUI,UPtwo?;返回键的判断
?LCALL?DELAY5MS
?JB?FANHUI,UPtwo
?JNB?FANHUI,$
?SJMP?GOBACK
JIAN_ZEND:SJMP?JIAN_END?;中继跳转6666666666666666666666666666666666666666666666666666666666666666
UPtwo:?JB?JIAJIAN,IAM?;加一键的判断
?LCALL?DELAY5MS
?JB?JIAJIAN,IAM
?JNB?JIAJIAN,$
?LCALL?JIAYI??;调用按键加一子程序
?
?;MOV?A,#0FH??;开启光标闪烁设置555555555555555555555555555555555555555555555
?;LCALL?LCDWCN
IAM:?JB?JIANJIAN,IAM22?;减一键的判断
?LCALL?DELAY5MS
?JB?JIANJIAN,IAM22
?JNB?JIANJIAN,$
?LCALL?JIANYI?;调用按键减一子程序
??
?AJMP?GIVED
IAM22:??JB?WEIXUAN,UPONE?;位选键的判断
?LCALL???DELAY5MS
?JB?WEIXUAN,UPONE
?JNB?WEIXUAN,$
?DEC?R0
?INC?R4?
?LCALL?JIAN??;调用位选比较程序
?CJNE?r4,#88H,JJ11
?DEC?R0
?INC?R4
?SJMP????JJ22
JJ11:?CJNE?r4,#8BH,JJ22
?DEC?R0
?INC?R4
JJ22:?MOV?A,R4
?CJNE?A,DIZHI,GIVED
?JB?NZBZ,fah??;为“1”闹钟???为“0”时钟
?MOV?R4,#0C5H
?MOV?DIZHI,#0CFH
?MOV?R0,#49H
?DJNZ?R5,GIVED
?LJMP?fah
GOBACK:?MOV?A,#0CH??;关闭光标闪烁设置
?LCALL?LCDWCN?
?POP?ACC
JIAN_END:
?SETB?TR0?
?RET?
;1111111111111111111111111111111111111111111111111111111111111111111111111111
?;11111111111111111111111111111111111111111111111111111111111111111111111111
JPXS:?MOV?A,#85H
?LCALL?LCDWC
?MOV?R1,#08H???;第一行显示数据存储单元的启始地址
JPXS_LL:DEC?R1
?CJNE?R1,#05H,JPXS_LP
?MOV?A,#3AH
?SJMP?JPXS_LY
JPXS_LP:MOV?A,@R1???;用查表法送要显示的数据
?MOV?DPTR,#TAB2
?MOVC?A,@A+DPTR
JPXS_LY:LCALL?LCDWD
?CJNE?R1,#03H,JPXS_LL
?RET
?;111111111111111111111111111111111111111111111111111111111111111111111
?;111111111111111111111111111111111111111111111111111111111111111111111
;************************位选比较控制程序************************?
;?在调整时间时这几位是符号冒号和横杠的数据
;在这几位时跳过到下一位
JIAN:?CJNE?R4,#87H,JIAN5??
?DEC?R0
?INC?R4
?SJMP?JIANEND
JIAN5:?CJNE?R4,#8AH,JIAN1
?DEC?R0
?INC?R4
?SJMP?JIANEND
JIAN1:?CJNE?R4,#0C9H,JIAN2
?DEC?R0
?INC?R4
?SJMP?JIANEND
JIAN2:?CJNE?R4,#0CCH,JIANEND
?DEC?R0
?INC?R4
JIANEND:RET?
;************************按键加一子程序********************
JIAYI:?INC?@R0
?CJNE?@R0,#0AH,JIAYI_END
?MOV?@R0,#0
?CJNE?R4,#86H,JIAYI55
?SJMP?JIAYI33
JIAYI55:CJNE?r4,#89H,JIAYI11
?SJMP?JIAYI33
JIAYI11:CJNE?r4,#8CH,JIAYI22
?SJMP?JIAYI33
JIAYI22:CJNE?R0,#30H,JIAYI_END
JIAYI33:INC?R0
?INC?@R0
?CJNE?@R0,#06H,JIAYI44
?MOV?@R0,#0
JIAYI44:DEC?R0
??
JIAYI_END:MOV?A,#0CH??;开启光标闪烁设置
?LCALL?LCDWCN
?JNB?NZBZ,JIAYI88?;为“1”闹钟???为“0”时钟
?LCALL?JPXS
?SJMP?JIAYI99
JIAYI88:LCALL?DISPLAY??;显示子程序?
JIAYI99:?RET
?
;%%%%%%%%%%%%%%%%%%减一%%%%%%%%%%%%%%%%%%%%%%%%
JIANYI:?DEC?@R0
?CJNE?@R0,#00H,JIANYI_END
?MOV?@R0,#9
?CJNE?R4,#86H,JIANYI55
?SJMP?JIANYI33
JIANYI55:CJNE?r4,#89H,JIANYI11
?SJMP?JIANYI33
JIANYI11:CJNE?r4,#8CH,JIANYI22
?SJMP?JIANYI33
JIANYI22:CJNE?R0,#30H,JIANYI_END
JIANYI33:INC?R0
?DEC?@R0
?CJNE?@R0,#0FFH,JIANYI44
?MOV?@R0,#5
JIANYI44:DEC?R0
??
JIANYI_END:MOV?A,#0CH??;开启光标闪烁设置
?LCALL?LCDWCN
?JNB?NZBZ,JIANYI88?;为“1”闹钟???为“0”时钟
?LCALL?JPXS
?SJMP?JIANYI99
JIANYI88:?LCALL?DISPLAY??;显示子程序?
JIANYI99:?RET
?
;******************************闹钟开关部分************************?
NZBF:?JB?NZKG,NZBF_END
?LCALL?DELAY5MS
?JB?NZKG,NZBF_END
?JNB?NZKG,$
?CPL?NZBZ
?JB?NZBZ,NZBF_LL
?MOV?????A,#01H??????????;显示清屏
????????LCALL???LCDWC
????????CLR?P2.5
????????LCALL?DISPSTART?;调用显示初始状态
????????LCALL?DISPLAY??;调用显示初始状态
????????
????????JB?BSKGBZ,NZBF_LP????;?|
????????SJMP?NZBF_END????;?|
NZBF_LP:MOV?????A,#8FH??????????;报时标志显示位置?;??|
????????LCALL???LCDWC?????;??|保护报时标志在清屏是不被误清
?MOV?A,#25H??;显示报时标志??;??|
?LCALL?LCDWD??????????;?|
???????SJMP?NZBF_END????;?|
???????
???????
NZBF_LL:MOV?????A,#8EH??????????;闹钟标志显示位置
????????LCALL???LCDWC
?MOV?A,#26H??;显示闹钟标志?
?LCALL?LCDWD
?
NZBF_END:RET?
;******************************闹钟比较部分************************
NZBJ:?JB?NZBZ,NZBJ_LL
?SJMP?NZBJ_END
NZBJ_LL:MOV?A,07H
?CJNE?A,37H,NZBJ_END
?MOV?A,06H
?CJNE?A,36H,NZBJ_END
?MOV?A,04H
?CJNE?A,34H,NZBJ_END
?MOV?A,03H
?CJNE?A,33H,NZBJ_END
?SETB?P2.5
NZBJ_END:RET
;***************报时开关********************
BSKG:?JB?FANHUI,BSKG_END
?LCALL?DELAY5MS
?JB?FANHUI,BSKG_END
?JNB?FANHUI,$
?CPL?BSKGBZ
?
?
?JB?BSKGBZ,BSKG_LL
?MOV?????A,#01H??????????;显示清屏
????????LCALL???LCDWC
????????CLR?P2.6
????????LCALL?DISPSTART?;调用显示初始状态
????????LCALL?DISPLAY??;调用显示
????????
????????JB?NZBZ,BSKG_LP?;?|
????????SJMP?BSKG_END?;?|
BSKG_LP:MOV?????A,#8EH??????????;??|
????????LCALL???LCDWC??;??|保护闹钟标志在清屏是不被误清
?MOV?A,#26H??;??|
?LCALL?LCDWD??;?|?????
?SJMP?BSKG_END?;?|?
?
BSKG_LL:MOV?????A,#8FH??????????;报时标志显示位置
????????LCALL???LCDWC
?MOV?A,#25H??;显示报时标志
?LCALL?LCDWD
BSKG_END:RET
;*********************报时次数********************
BSCS:?JNB?BSKGBZ,BSCS_END
?JNB?BSCSBZ,BSCS_END
?MOV?A,37H
?CJNE?A,#01H,BSCS_LL
?MOV?A,#0AH
?SJMP?BSCS_LP
BSCS_LL:CJNE?A,#02H,BSCS_LP
?MOV?A,#14H
BSCS_LP:ADD?A,36H
?RL?A
?MOV?BSCSCC,A
?CLR?BSCSBZ
BSCS_END:?RET
;**********************闪烁报时********************************?
SSBS:?JNB?BSKGBZ,SSBS_END
?JNB?ZDBSBZ,SSBS_END
?JNB?ZMBSBZ,SSBS_END
?CPL?P2.6
?CPL?????P2.7
?CLR?ZMBSBZ
?DJNZ?BSCSCC,SSBS_END
?CLR?ZDBSBZ
?CLR?P2.6
SSBS_END:RET
;************************延时子程序(5MS)************************
DELAY5MS:
?PUSH?PSW
?SETB?RS0
?SETB?RS1
?MOV?????R1,#25??????????????;延时子程序(5MS)
DL5_PA:?MOV?????R2,#100
????????DJNZ????R2,$
????????DJNZ????R1,DL5_PA???????
????????POP?PSW
????????RET
TAB:?DB?"TIME:",00h
TAB1:?DB?"DATE:",00h
TAB2:?DB?"01234567891"
TAB3:?DB?0AH,06H,00H,0AH,06H,00H,0AH,03H?;用于比较调整时间时的比较
TAB4:?DB?0AH,04H,00H,0AH,02H,00H,0AH,0AH,0AH,0AH;用于调整日期时的比较
TAB5:?DB?00H,03H,02H,03H,03H,03H,03H,03H,03H,03H,03H,03H,03H;用于天数十位比较
TAB6:?DB?00H,02H,09H,02H,01H,02H,01H,02H,02H,01H,02H,01H,02H;用于天数个位比较
????????END
51单片机有哪几个专用寄存器?
1、ACC---是累加器,通常用A表示。
这是个什么东西,可不能从名字上理解,它是一个寄存器,而不是一个做加法的东西,为什么给它这么一个名字呢?或许是因为在运算器做运算时其中一个数一定是在ACC中的缘故吧。它的名字特殊,身份也特殊,稍后在中篇中我们将学到指令,可以发现,所有的运算类指令都离不开它。自身带有全零标志Z,若A=0则Z=1;若A≠0则z=0。该标志常用作程序分枝转移的判断条件。
2、B--一个寄存器。
在做乘、除法时放乘数或除数,不做乘除法时,随你怎么用。3、PSW-----程序状态字。
这是一个很重要的东西,里面放了CPU工作时的很多状态,借此,我们可以了解CPU的当前状态,并作出相应的处理。它的各位功能请看下表:
CY:进位标志。8051中的运算器是一种8位的运算器,我们知道,8位运算器只能表示到0-255,如果做加法的话,两数相加可能会超过255,这样最高位就会丢失,造成运算的错误,怎么办?最高位就进到这里来。这样就没事了。有进、借位,CY=1;无进、借位,CY=0
例:78H+97H(01111000+10010111)
AC:辅助进、借位(高半字节与低半字节间的进、借位)。
例:57H+3AH(01010111+00111010) 下面我们逐一介绍各位的用途F0:用户标志位,由用户(编程人员)决定什么时候用,什么时候不用。
RS1、RS0:工作寄存器组选择位。这个我们已知了。
0V:溢出标志位。运算结果按补码运算理解。有溢出,OV=1;无溢出,OV=0。什么是溢出我们后面的章节会讲到。
P:奇偶校验位:它用来表示ALU运算结果中二进制数位“1”的个数的奇偶性。若为奇数,则P=1,否则为0。 运算结果有奇数个1,P=1;运算结果有偶数个1,P=0。
例:某运算结果是78H(01111000),显然1的个数为偶数,所以P=0。4、P0、P1、P2、P3------这个我们已经知道,是四个并行输入/输出口的寄存器。它里面的内容对应着管脚的输出。5、IE-----中断充许寄存器
按位寻址,地址:A8H中断禁止(即不产生中断)
EA=1时,各中断的产生由个别的允许位决定
- (IE.6):保留
ET2(IE.5):定时2溢出中断充许(8052用)
ES (IE.4):串行口中断充许(ES=1充许,ES=0禁止)
ET1(IE.3):定时1中断充许
EX1(IE.2):外中断INT1中断充许
ET0(IE.1):定时器0中断充许
EX0(IE.0):外部中断INT0的中断允许
7、IP-----中断优先级控制寄存器
按位寻址,地址位B8HEA (IE.7):EA=0时,所有中断禁止(即不产生中断)
EA=1时,各中断的产生由个别的允许位决定
- (IE.6):保留
ET2(IE.5):定时2溢出中断充许(8052用)
ES (IE.4):串行口中断充许(ES=1充许,ES=0禁止)
ET1(IE.3):定时1中断充许
EX1(IE.2):外中断INT1中断充许
ET0(IE.1):定时器0中断充许
EX0(IE.0):外部中断INT0的中断允许
7、IP-----中断优先级控制寄存器
按位寻址,地址位B8H6、指针寄存器
(1)程序计数器PC
指明即将执行的下一条指令的地址,16位,寻址64KB范围,
复位时PC = 0000H
(2)堆栈指针SP
指明栈顶元素的地址,8位,可软件设置初值,复位时SP = 07H
(3)数据指针DPTR
@R0、@R1、@DPTR;指明访问的数据存储器的单元地址,16位,寻址范围64KB。 DPTR = DPH + DPL。可以用它来访问外部数据存储器中的任一单元,如果不用,也可以作为通用寄存器来用,由我们自已决定如何使用。 分成DPL(低8位)和DPH(高8位)两个寄存器。用来存放16位地址值,以便用间接寻址或变址寻址的方式对片外数据RAM或程序存储器作64K字节范围内的数据操作。7、定时/计数器
(1) 定时器方式寄存器:TMOD
(2) 定时器控制寄存器:TCON
(3) 计数寄存器:TH0、TL0;TH1、TL1。可用于设定计数初值。8052/8032增设专用寄存器
(1) 定时器2控制寄存器T2CON;控制、设置工作方式。
(2) 计数寄存器:TH2、TL2
(3) 定时器2捕获/重装载寄存器:RCAP2H、RCAP2L
存放自动重装载到TH2、TL2的数据。
与中断有关特殊功能寄存器有哪些?
单片机内部有一个CPU用来运算、控制,有四个并行I/O口,分别是P0、P1、P2、P3,有ROM,用来存放程序,有 RAM,用来存放中间结果,此外还有定时/计数器,串行I/O口,中断系统,以及一个内部的时钟电路。在一个51单片机的内部包含了这么多的东西。
对图进行进一步的分析,我们已知,对并行I/O口的读写只要将数据送入到相应I/O口的锁存器就可以了,那么对于定时/计数器,串行I/O口等怎么用呢? 在单片机中有一些独立的存储单元是用来控制这些器件的,被称之为特殊功能寄存器(SFR)。 1、ACC---是累加器,通常用A表示。
这是个什么东西,可不能从名字上理解,它是一个寄存器,而不是一个做加法的东西,为什么给它这么一个名字呢?或许是因为在运算器做运算时其中一个数一定是 在ACC中的缘故吧。它的名字特殊,身份也特殊,稍后在中篇中我们将学到指令,可以发现,所有的运算类指令都离不开它。自身带有全零标志Z,若A=0则 Z=1;若A≠0则z=0。该标志常用作程序分枝转移的判断条件。
2、B--一个寄存器。
在做乘、除法时放乘数或除数,不做乘除法时,随你怎么用。3、PSW-----程序状态字。
这是一个很重要的东西,里面放了CPU工作时的很多状态,借此,我们可以了解CPU的当前状态,并作出相应的处理。CY:进位标志。8051中的运算器是一种8位的运算器,我们知道,8位运算器只能表示到0-255,如果做加法的话,两数相加可能会超过255,这样最高位就会丢失,造成运算的错误,怎么办?最高位就进到这里来。这样就没事了。有进、借位,CY=1;无进、借位,CY=0
例:78H+97H(01111000+10010111)
AC:辅助进、借位(高半字节与低半字节间的进、借位)。
例:57H+3AH(01010111+00111010)F0:用户标志位,由用户(编程人员)决定什么时候用,什么时候不用。
RS1、RS0:工作寄存器组选择位。这个我们已知了。
0V:溢出标志位。运算结果按补码运算理解。有溢出,OV=1;无溢出,OV=0。什么是溢出我们后面的章节会讲到。
P:奇偶校验位:它用来表示ALU运算结果中二进制数位“1”的个数的奇偶性。若为奇数,则P=1,否则为0。 运算结果有奇数个1,P=1;运算结果有偶数个1,P=0。
例:某运算结果是78H(01111000),显然1的个数为偶数,所以P=0。 EA (IE.7):EA=0时,所有中断禁止(即不产生中断)
EA=1时,各中断的产生由个别的允许位决定
- (IE.6):保留
ET2(IE.5):定时2溢出中断充许(8052用)
ES (IE.4):串行口中断充许(ES=1充许,ES=0禁止)
ET1(IE.3):定时1中断充许
EX1(IE.2):外中断INT1中断充许
ET0(IE.1):定时器0中断充许
EX0(IE.0):外部中断INT0的中断允许
7、IP-----中断优先级控制寄存器
按位寻址,地址位B8H6、指针寄存器
(1)程序计数器PC
指明即将执行的下一条指令的地址,16位,寻址64KB范围,
复位时PC = 0000H
(2)堆栈指针SP
指明栈顶元素的地址,8位,可软件设置初值,复位时SP = 07H
(3)数据指针DPTR
@R0、 @R1、@DPTR;指明访问的数据存储器的单元地址,16位,寻址范围64KB。 DPTR = DPH + DPL。可以用它来访问外部数据存储器中的任一单元,如果不用,也可以作为通用寄存器来用,由我们自已决定如何使用。 分成DPL(低8位)和DPH(高8位)两个寄存器。用来存放16位地址值,以便用间接寻址或变址寻址的方式对片外数据RAM或程序存储器作64K字节范 围内的数据操作。7、定时/计数器
(1) 定时器方式寄存器:TMOD
(2) 定时器控制寄存器:TCON
(3) 计数寄存器:TH0、TL0;TH1、TL1。可用于设定计数初值。8052/8032增设专用寄存器
(1) 定时器2控制寄存器T2CON;控制、设置工作方式。
(2) 计数寄存器:TH2、TL2
(3) 定时器2捕获/重装载寄存器:RCAP2H、RCAP2L
存放自动重装载到TH2、TL2的数据
电动车充电器3A和3AH有什么区别?
输出3A指的是充电器额定输出电流,3AH指的是电池容量。
电动车充电器是专门为电动自行车的电瓶配置的一个充电设备!充电器的分类: 用有、无工频(50赫兹)变压器区分,可分为两大类。货运三轮充电器一般使用带工频变压器的充电机,体积大、重量大、费电,但是可靠,便宜;电动自行车和电摩则使用所谓开关电源式充电器,省电,效率高,但是易坏。
开关电源式充电器的正确操作是:充电时,先插电池,后加市电;充足后,先切断市电,后拔电池插头。如果在充电时先拔电池插头,特别是充电电流大(红灯)时,非常容易损坏充电器。
常用的开关电源式充电器又分半桥式和单激式两大类,单激类又分为正激式和反激式两类。半桥式成本高,性能好,常用于带负脉冲的充电器;单激式成本低,市场占有率高。
220v交流电经T0双向滤波抑制干扰,D1整流为脉动直流,再经C11滤波形成稳定的300V左右的直流电。U1 为TL3842脉宽调制集成电路。其5脚为电源负极,7脚为电源正极,6脚为脉冲输出直接驱动场效应管Q1(K1358) 3脚为最大电流限制,调整R25(2.5欧姆)的阻值可以调整充电器的最大电流。 2脚为电压反馈,可以调节充电器的输出电压。4脚外接振荡电阻R1,和振荡电容C1。T1为高频脉冲变压器,其作用有三个。
第一是把高压脉冲降压为低压脉冲。
第二是起到隔离高压的作用,以防触电。
第三是为uc3842提供工作电源。D4为高频整流管(16A60V)C10为低压滤波电容,D5为12V稳压二极管, U3(TL431)为精密基准电压源,配合U2(光耦合器4N35) 起到自动调节充电器电压的作用。调整w2(微调电阻)可以细调充电器的电压。D10是电源指示灯。D6为充电指示灯。
R27是电流取样电阻(0.1欧姆,5w)改变W1的阻值可以调整充电器转浮充的拐点电流
(200-300 mA)通电开始时,C11上有300v左右电压。此电压一路经T1加载到Q1。
第二路经R5,C8,C3, 达到U1的第7脚。强迫U1启动。U1的6脚输出方波脉冲,Q1工作,电流经R25到地。同时T1副线圈产生感应电压,经D3,R12给U1提供可靠电源。T1输出线圈的电压经D4,C10整流滤波得到稳定的电压。此电压一路经D7(D7起到防止电池的电流倒灌给充电器的作用)给电池充电。
第二路经R14,D5,C9, 为LM358(双运算放大器,1脚为电源地,8脚为电源正)及其外围电路提供12V工作电源。D9为LM358提供基准电压,经R26,R4分压达到LM358的第二脚和第5脚。正常充电时,R27上端有0.15-0.18V左右电压,此电压经R17加到LM358第三脚,从1脚送出高电压。此电压一路经R18,强迫Q2导通,D6(红灯)点亮,第二路注入LM358的6脚,7脚输出低电压,迫使Q3关断,D10(绿灯)熄灭,充电器进入恒流充电阶段。当电池电压上升到44.2V左右时,充电器进入恒压充电阶段,输出电压维持在44.2V左右,充电器进入恒压充电阶段,电流逐渐减小。当充电电流减小到200mA—300mA时,R27上端的电压下降,LM358的3脚电压低于2脚,1脚输出低电压,Q2关断,D6熄灭。同时7脚输出高电压,此电压一路使Q3导通,D10点亮。另一路经D8,W1到达反馈电路,使电压降低。充电器进入涓流充电阶段。1-2小时后充电结束。