如何用8051单片机设计倒计时牌

作者&投稿:莘荷 (若有异议请与网页底部的电邮联系)
如何用8051单片机设计倒计时牌 急急急~

你买一本单片机使用教程或案例教程上面都有例子呀!若不行你把你的程序和电路图按word格式给我发过来,我给你改吧!ysgrl@sohu.com
假设:有一个开始按钮接到中断上,再写一个中断服务程序,若倒计时的时间是固定就不用键盘了,若不固定就在硬件上设计电路中有键盘,显示用led 12个就行了,加译码电路。
我近期我不用protel了,就是说不怎么搞电路设计了,不过你有什么问题我还是能帮你的,互相学习吧!

;************* 电子定时器的设计******************;
;*MCU: AT892051 ;
;*MCU-crystal: 12M ;
;*Version: 01 ;
;*Last Updata: 2007-6-14 ;
;*Author: zhaojun ;
;*Description: ;
;定时器T0、T1溢出周期为50MS,T0为秒计数用 ;
;S2为功能键、S3为方式选择键 ;
;P1口为字符输出口,采用共阳显示管 ;
;P3.2~P3.5为位选,P1.7为报警发音,P3.7为被控继电器 ;
;************************************************;

;******************
; 伪定义 ;
;******************
SL EQU 30H ; SL存放秒的个位数
SH EQU 31H ; SH存放秒的十位数
ML EQU 32H ; ML存放分的个位数
MH EQU 33H ; MH存放分的十位数
HL EQU 34H ; HL存放时的个位数
HH EQU 35H ; HH存放时的十位数
;
L0 EQU 36H ; L0~L3:显示数据存储器
L1 EQU 37H
L2 EQU 38H
L3 EQU 39H
DSPLYP EQU 3AH ; 显示数据指针(DISPLAY-POINT)
PLYTS EQU 3BH ; 显示次数计数器(DISPLAY-TIMES)
;
LPLMOD BIT 39H ; 低两位显示方式(LOW-PLAY-MOD)
HPLMOD BIT 3AH ; 高两位显示方式(HIGH-PLAY-MOD)
BRIGHT BIT 3BH ; DISPLAY子程序参数:亮灭指示位
;
TCOUNT EQU 3CH ; 时间计数器(TIME-COUNT)
;
ADDRES EQU 3DH ; 加1子程序参数
MAX EQU 3EH ; 加1子程序参数
IFDEC BIT 20H ; BCD加法子程序参数
;
R_MOD EQU 3FH ; 响铃方式参数
;
LED4 BIT 30H ; 发光管状态位
BELL BIT P1.7 ; 蜂鸣器
SWITCH BIT P3.7 ; 继电器
FKEY BIT P3.0 ; 功能键 (S1)
MKEY BIT P3.1 ; 修改键 (S2)
;
WORKIN BIT 38H ; 工作状态指示位
;

;******************
; 中断入口 ;
;******************
ORG 0000H
START: LJMP MAIN ; 0000H 引向主程序
LJMP ERR ; 0003H
NOP
NOP
LJMP ERR ; 引向出错处理程序
LJMP PGT0 ; 000BH 引向中断处理程序PGT0
NOP
NOP
LJMP ERR ; 引向出错处理程序
LJMP ERR ; 0013H INT1
NOP
NOP
LJMP ERR
LJMP ERR ; 001BH T1
NOP
NOP
LJMP ERR
LJMP ERR ; 0023H
NOP
NOP
LJMP ERR
LJMP ERR ; 002BH
NOP
NOP
;
;************
; 主程序 ;
;************
MAIN: MOV IE,#00H ; 关中断
MOV SP,#57H ; 设置堆栈指针
MOV PSW,#00H ; 选用寄存器组0
MOV TMOD,#11H ; 设定中断工作方式为T0和T1
;
MOV A,56H
CJNE A,#0AAH,CSTART ; 判上电复位标志,无标志转冷启动
MOV A,57H
CJNE A,#55H,CSTART ; 无标志转冷启动
AJMP HSTART ; 有上电复位标志转热启动
NOP
NOP
LJMP ERR ; 软件陷阱,引向出错处理程序
CSTART: MOV P1,#0FFH ; 冷启动,全面初始化
MOV P3,#0FFH
MOV TCON,#00H ; 计时停止
MOV TL0,#0B0H ; 赋中断T0初值
MOV TH0,#3CH
MOV TCOUNT,#0AH ; 赋定时器初值
MOV R5,#00H ; R5为一空单元(备用)
MOV R4,#00H ; R4 为工作模式选择寄存器
MOV SL,#00H ; 定时单元清零
MOV SH,#00H ; 秒
MOV ML,#00H ;
MOV MH,#00H ; 分
MOV HL,#00H ;
MOV HH,#00H ; 时
MOV PLYTS,#64H ; 赋显示次数初值为100次
MOV DSPLYP,#L0 ; 显示指针指向显存单元
MOV L0,#0AH ; 送显示数据"-----"
MOV L1,#0AH
MOV L2,#0AH
MOV L3,#04H
SETB LED4 ; LED4为数码管之间的发光二极管
SETB LPLMOD ; 设定显示方式为闪烁
SETB HPLMOD ;
SETB BRIGHT ; 允许显示
CLR WORKIN ; 清工作标志 , 待命
AJMP SETUP ; 转开始工作
NOP
NOP
LJMP ERR ; 软件陷阱
HSTART: MOV SCON,#00H ; 有上电标志,热启动,清串行口控制寄存器
MOV IP,#00H ; 清中断优先控制寄存器
SETB FKEY ; 重设按键
SETB MKEY
SETB EA ; 开中断
AJMP BEGIN ; 转向继续工作
NOP
NOP
LJMP ERR ; 软件陷阱
SETUP: SETB EA ; 开中断
;
MAIN1: ACALL DISPLY ; 调用显示
JB FKEY,JUDGE ; 按键扫描
ACALL KEYDLY ; 延时消抖动
JB FKEY,JUDGE ; 无键按下转向判断是否到点
CLR ET0 ; 功能键被按下,则
CLR TR0 ; 暂停计时
ACALL MENU ; 调用菜单设置程序
BEGIN: SETB WORKIN ; 置工作标志位,开始工作
SETB ET0 ; 开中断
SETB TR0 ; 开始计时
MOV A,R4 ; 移入工作模式选择
RL A ; 指针放大
MOV DPTR,#M_TAB
JMP @A+DPTR ; 根据工作模式跳转到相应程序段
M_TAB: AJMP WORK1
AJMP WORK2
AJMP WORK3
AJMP WORK4
NOP
NOP
LJMP ERR ; 软件陷阱
WORK1: ;
WORK2: CLR SWITCH ; 工作方式1和2:开继电器
AJMP MAIN2
NOP
NOP
LJMP ERR ; 软件陷阱
WORK3: ;
WORK4: SETB SWITCH ; 工作方式3和4:不开继电器
MAIN2: CLR BELL ; 蜂鸣器短鸣一声,以示开始工作
ACALL DL05S
SETB BELL
JUDGE: JNB WORKIN,MAIN1 ; 判断是否在定时之中
MOV A,SL ; 判断秒是否为零
JNZ MAIN1
MOV A,SH ; 判断秒是否为零
JNZ MAIN1
MOV A,ML ; 判断分是否为零
JNZ MAIN1
MOV A,MH ; 判断分是否为零
JNZ MAIN1
MOV A,HL ; 判断时是否为零
JNZ MAIN1
MOV A,HH ; 判断时是否为零
JNZ MAIN1 ; 若时分秒全为零则
CLR ET0 ; 停止计时
CLR TR0 ;
ACALL ACTION ; 调用到点工作子程序
AJMP MAIN ; 返回
NOP
NOP
LJMP ERR ; 软件陷阱
;
;******************
; 倒计时程序 ;
;******************
PGT0: CLR EA ; 关中断
PUSH ACC ; 保护现场
PUSH PSW
PUSH DPL
PUSH DPH
MOV PSW,#08H ; 选用寄存器组1
CLR TR0 ; 暂停计时
MOV A,#0B7H ; 中断同步修正
ADD A,TL0
MOV TL0,A
MOV A,#3CH
ADD A,TH0
MOV TH0,A
SETB TR0 ; 恢复计时
DEC TCOUNT ; 定时器T0每50 000毫秒溢出一次,则
MOV A,TCOUNT ; 溢出10次为0.5秒
JNZ OUTT0 ; 判断是否到半秒
MOV TCOUNT,#0AH ;
CPL LED4 ; 若到半秒LED取反
JNB LED4,OUTT0 ; LED每闪烁一次是一秒
MOV R0,#SH ; 移入秒位的地址
SETB IFDEC ; BCD子程序参数,使其做减法
ACALL ADDBCD ; 调用BCD子程序, 秒减1
CJNE R3,#99H,OUTT0 ; 判断秒要否借位
MOV SH,#05H ; 要借位则
MOV SL,#09H ; 送数据59(否则显示99)
MOV R0,#MH ; 移入分位的地址
ACALL ADDBCD ; 分减1
CJNE R3,#99H,OUTT0 ; 判断分要否借位
MOV MH,#05H
MOV ML,#09H
MOV R0,#HH
ACALL ADDBCD
OUTT0: POP DPH ; 恢复现场
POP DPL
POP PSW
POP ACC
SETB EA
RETI ; 中断返回
NOP
NOP
LJMP ERR ; 软件陷阱
;
;
;**************************
; BCD子程序(加1或减1 ) ;
;**************************
ADDBCD: MOV A,@R0 ; 移入被操作数的高位
DEC R0 ; 指针减一
SWAP A
ORL A,@R0 ; 移入被操作数的低位
MOV B,#01H ; B寄存器送立即数#01H
MOV C,IFDEC ; 若减法标志位为1,则
MOV B.3,C ;
MOV B.4,C ; B寄存器的值被改为#99H
MOV B.7,C ;
ADD A,B ; 对一个压缩的BCD码加#99H等于对其减一
DA A ; BCD码调整
MOV R3,A ; 暂存结果
ANL A,#0FH ; 取低位码
MOV @R0,A ; 存数
MOV A,R3 ; 取回结果
INC R0 ; 指针加一
SWAP A ; 交换
ANL A,#0FH ; 取结果数的高位
MOV @R0,A ; 存数
RET
NOP
NOP
LJMP ERR ; 软件陷阱
;
;**************
; 加1程序 ;
;**************
ADDONE: MOV R0,ADDRES ; 移入被加数单元的地址
CLR IFDEC ; 设定BCD子程序做加法
ACALL ADDBCD ; 调用BCD子程序
CLR C ; 判断被加数是否大于
MOV A,R3 ; 最大值"MAX"
CJNE A,MAX,JGOVER
JGOVER: JC ENDADO
CLR A ; 若大于"MAX",则清零
MOV @R0,A
DEC R0
MOV @R0,A
ENDADO: RET
NOP
NOP
LJMP ERR ; 软件陷阱
;
;******************
; 调时快进程序 ;
;******************
QUICK: CLR LPLMOD ; 设定显示方式不闪烁
CLR HPLMOD
ACALL ADDONE ; 调用加1子程序
MOV L0,R4 ; 将工作模式选择数移入显存
INC L0 ; 加1转化成显示值
ACALL KEYDLY ; 延时
ACALL DL100
JNB MKEY,QUICK ; 判断键是否松开
SETB LPLMOD ; 若松开则恢复闪烁显示方式
CJNE R6,#02H,ENDQUK
SETB HPLMOD
CLR LPLMOD
ENDQUK: RET
NOP
NOP
LJMP ERR ; 软件陷阱
;
;
;******************
; 功能菜单程序 ;
;******************
MENU: MOV R6,#00H ; 初始化; R6 计功能键按键次数
MOV ADDRES,#05H ; 将 R5 的地址送入,以便于改变 R4 的值
MOV MAX, #04H ; 定义工作模式选择寄存器R4 的最大值
MOV DSPLYP,#L0 ; 定义显示指针指向显存
SETB LPLMOD ; 设定低两位数闪烁
CLR HPLMOD
MOV L0,R4 ; 送显示数据"F-0X"
INC L0
MOV L1,#00H
MOV L2,#0BH
MOV L3,#00H
SETB LED4
;
WAITFK: ACALL DISPLY ; 等待F键释放
JNB FKEY,WAITFK
MENU1: ACALL DISPLY
JB MKEY,JGFKEY ; M键扫描
ACALL KEYDLY ; 延时消抖动
JB MKEY,JGFKEY ; 未按下则转F键扫描
CJNE R6,#00H,NEXT1 ;
MOV SL,#00H ; 若中途改变定时方式,则清除原计时数据
MOV SH,#00H
MOV ML,#00H
MOV MH,#00H
MOV HL,#00H
MOV HH,#00H
NEXT1: MOV R2,#00H ; R2用于判断按键时间是否超过0.5秒
NEXT2: ACALL ADDONE ; 调用加1程序
MOV L0,R4 ; 移入工作方式选择数
INC L0
;
WAITMK: ACALL DISPLY ; 等待M键释放
INC R2 ; R2自增一
CLR C
CJNE R2,#0C8H,JGQUIC ; 若R2大于等于200则调用快进子程序
JGQUIC: JC WATMK1
ACALL QUICK
WATMK1: JNB MKEY,WAITMK ; R2小于200则等待M键释放
;
JGFKEY: JB FKEY,MENU1 ; 功能(F)键扫描
ACALL KEYDLY ; 延时消抖动
JB FKEY,MENU1 ; 键未按下则转修改(M)键扫描
INC R6 ; F键按键次数加1
MOV A,R6 ; 移入按键次数
RL A ; 指针放大
MOV DPTR,#FUNTAB
JMP @A+DPTR ; 根据按键次数跳转到相应的程序段
FUNTAB: AJMP WAITFK
AJMP SETLOW
AJMP SETHI
AJMP ENDMEN
NOP
NOP
AJMP ENDMEN
;STWKMD: ; 工作模式设定,不需另外改变菜单
;
SETLOW: MOV MAX,#60H ; 设置低位(秒位或分位)
MOV A,R4 ; 移入工作模式选择数
RL A ; 指针放大
MOV DPTR,#FTAB1
JMP @A+DPTR ; 根据工作模式选择数跳转到相应的程序段
FTAB1: AJMP SETSS
AJMP SETM60
AJMP SETSS
AJMP SETM60
NOP
NOP
AJMP WAITFK
SETSS: MOV DSPLYP,#SL ; 设定显示区域为MM:SS
MOV ADDRES,#SH
AJMP WAITFK
SETM60: MOV DSPLYP,#ML ; 设定显示区域为HH:MM
MOV ADDRES,#MH
AJMP WAITFK
;
SETHI: CLR LPLMOD ; 设置高位(分位或时位)
SETB HPLMOD ; 高两位数码管闪烁
MOV MAX,#31H ; 最大数为30
MOV A,R4 ; 移入工作模式选择数
RL A ; 指针放大
MOV DPTR,#FTAB2 ; 移入表首地址
JMP @A+DPTR ; 根据工作模式选择数跳转到相应的程序段
FTAB2: AJMP SETM30
AJMP SETHH
AJMP SETM30
AJMP SETHH
NOP
NOP
AJMP WAITFK ; 返回等待键释放
SETM30: MOV ADDRES,#MH ; 移入分位的地址
AJMP WAITFK ; 转向等待键释放
SETHH: MOV ADDRES,#HH ; 移入时位的地址
AJMP WAITFK ; 转向等待键释放
;
ENDMEN: CLR HPLMOD ; 恢复不闪烁显示方式
RET
NOP
NOP
LJMP ERR ; 软件陷阱
;
;****************
; 到点工作程序 ;
;****************
ACTION: MOV L0,R4 ; 移入工作模式选择数
INC L0 ; 送显示数"F-0X"
MOV L1,#00H
MOV L2,#0BH
MOV L3,#00H
SETB LED4
MOV DSPLYP,#L0 ; 指针指向显存
SETB LPLMOD ; 设定显示方式不闪烁
SETB HPLMOD
MOV A,R4 ; 移入工作模式选择数
RL A ;
MOV DPTR,#A_TAB
JMP @A+DPTR ; 根据工作模式选择数跳转
A_TAB: AJMP ACTF1 ; 工作模式一
AJMP ACTF1 ; 工作模式二
AJMP ACTF3 ; 工作模式三
AJMP ACTF3 ; 工作模式四
NOP
NOP
LJMP ERR ; 软件陷阱
ACTF1: SETB SWITCH ; 工作模式一(或二): 关继电器
MOV R_MOD,#82H ; 响铃模式参数#82H
MOV R2,#96H ; 响铃次数参数#96H
ACTF11: ACALL RING ; 调用响铃子程序
JNB MKEY,ENDACT ; 等待键按下
JNB FKEY,ENDACT ; 有键按下则结束响铃
DJNZ R2, ACTF11 ; 次数未满继续响铃
MOV R_MOD,#0FFH ; 参数#0FF使响铃无效
AJMP ACTF11 ; 无键按下返回
NOP
NOP
LJMP ERR ; 软件陷阱
ACTF3: CLR SWITCH ; 工作模式三(或四): 开继电器
CLR BELL ; 蜂鸣器短鸣一声
ACALL DL1S
SETB BELL
MOV R_MOD,#0FFH ; 响铃模式参数#0FFH
MOV R2,#96H ; 响铃时间参数#96H
ACTF31: ACALL RING ; 调用响铃子程序
JNB MKEY,ENDACT ; 等待键按下
JNB FKEY,ENDACT ; 有键按下则结束
DJNZ R2,ACTF31 ; 次数未满继续
MOV R2,#96H ; 重新赋值
CLR BELL ; 短鸣一声(说明: 响铃模式参数#0FFH使
ACALL DL100 ; 响铃程序无效,仅起延时作用,
SETB BELL ; 每延时一段时间短鸣一声,以
AJMP ACTF31 ; 提醒使用者继电器仍在工作)
NOP
NOP
LJMP ERR ; 软件陷阱
ENDACT: SETB SWITCH ; 关继电器
AWAITF: ACALL DISPLY ; 调用显示
JNB FKEY,AWAITF ; 等待键释放
AWAITM: ACALL DISPLY ; 调用显示
JNB MKEY,AWAITM ; 等待键释放
RET
NOP
NOP
LJMP ERR ; 软件陷阱
;
;**************
; 响铃程序 ;
;**************
RING: MOV R5,#18H ; R5为循环控制变量
RING1: JNB MKEY,R_EXIT ; 键扫描
JNB FKEY,R_EXIT ; 有键按下则退出
MOV A,R_MOD ; 移入响铃模式参数
MOV C,ACC.7 ; 根据响铃模式参数改变响铃
MOV BELL,C
RL A
MOV R_MOD,A
ACALL DL100 ; 延时
DJNZ R5,RING1 ; 循环次数控制
R_EXIT: SETB BELL ; 关闭响铃
RET
NOP
NOP
LJMP ERR ; 软件陷阱
;
;**************
; 显示程序 ;
;**************
DISPLY: PUSH ACC ; 数据压栈保护
PUSH PSW
MOV PSW,#10H ; 选用寄存器组2
MOV R0,DSPLYP ; 移入显示指针
MOV R2,#0FDH ; R2寄存的是数码管选通数
MOV A,PLYTS ; 移入显示循环控制量
JNZ PLAY ; 不为0则转PLAY
MOV PLYTS,#64H ; 否则从新赋值
CPL BRIGHT ; 亮灭指示位取反
PLAY: DEC PLYTS ; 显示循环控制量减1
JNB LPLMOD,PLAYL ; 低两位数码管不闪则"PLAYL"
JB BRIGHT,PLAYL ; 亮灭指示为1也"PLAYL"
ACALL NOPLAY ; 否则灭灯延时
AJMP PLAY1 ; 转显示高位数码管
NOP
NOP
LJMP ERR ; 软件陷阱
;用来显示低位
PLAYL: ORL P1,#7FH ; 清原显示数据
ORL P3,#3CH ; 清原选通数据
MOV A,R2 ; 移入数码管位选数
RL A ; 换一位
ANL P3,A ; 选通低位的个位数码管
MOV R2,A ; 暂存位选数
MOV A,@R0 ; 移入显示数值
MOV DPTR,#TABLE1 ; 移入表首地址
MOVC A,@A+DPTR ; 查表
ANL P1,A ; 送显示数据
ACALL DL1MS ; 延时
INC R0 ; 指向低位的十位数
JB P3.3,PLAYL ; 显示低位的十位数
;
PLAY1: JNB HPLMOD,PLAYH ; 高两位数码管不闪则"PLAYH"
JB BRIGHT,PLAYH ; 亮灭指示为1也"PLAYH"
ACALL NOPLAY ; 否则灭灯延时
AJMP OUTPLY ; 转结束
NOP
NOP
LJMP ERR ; 软件陷阱
;
;用来显示高位
PLAYH: ORL P1,#7FH ; 清原显示数据
ORL P3,#3CH ; 清原选通数据
ANL P3,#0EFH ; 选通高位的个位数数码管
MOV A,@R0 ; 移入显示数值
MOV DPTR,#TABLE1 ; 移入表首地址
MOVC A,@A+DPTR ; 查表
ANL P1,A ; 送显示数据
ACALL DL1MS ; 延时
INC R0 ; 指向高位的十位数
; ; 显示高位的十位数
ORL P1,#7FH ; 清原显示数据
ORL P3,#3CH ; 清原选通数据
ANL P3,#0DFH ; 选通高位的十位数
MOV A,@R0 ; 移入显示数值
MOV C,LED4 ; 指针放大+小灯状态
RLC A ;
MOV DPTR,#TABLE2 ; 移入表首地址
MOVC A,@A+DPTR ; 查表
ANL P1,A ; 送显示数据
ACALL DL1MS ; 延时
;
OUTPLY: POP PSW ; 恢复数据
POP ACC
RET
NOP
NOP
LJMP ERR ; 软件陷阱
;
TABLE1: DB 0C0H,0F9H,0A4H,0B0H, 99H, 92H, 82H,0F8H, 80H, 90H,0BFH, 8EH,0FFH
; "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "-", "F", " "
;
TABLE2: DB 0FFH, 0DFH, 0F9H, 0D9H, 0A4H, 84H, 0B0H, 90H, 0BFH, 09FH
; " ", " :", "1 ", "1:", "2 ", "2:", "3 ", "3:", "- ", "-:"
;
;
;
;**********************
; 无显示(灭灯)程序 ;
;**********************
NOPLAY: ORL P1,#7FH ; 清显示数据
ORL P3,#3CH ; 清选通数据
INC R0 ; 指针自增2
INC R0
ACALL DL1MS ; 延时
RET
NOP
NOP
LJMP ERR ; 软件陷阱
;
;******************
; 延时程序 ;
;******************
DL1MS: MOV R3,#0F9H ; 延时 1250US 只为DISPLY所调用
DL1MS1: NOP
NOP
NOP
DJNZ R3,DL1MS1
RET
NOP
NOP
LJMP ERR ; 软件陷阱
;
KEYDLY: CLR BELL ; 按键消抖动专用延时程序,
ACALL DISPLY ; 在消除抖动的同时发出按键提示音
SETB BELL
RET
NOP
NOP
LJMP ERR ; 软件陷阱
;
DL50MS: MOV R7,#0AH ; 50毫秒延时程序
DL50M1: ACALL DISPLY ; 每调用一次显示程序5MS
DJNZ R7,DL50M1 ; 调用10次
RET
NOP
NOP
LJMP ERR ; 软件陷阱
;
DL100: ACALL DL50MS ; 延时100毫秒
ACALL DL50MS
RET
NOP
NOP
LJMP ERR ; 软件陷阱
;
DL05S: ACALL DL100 ; 延时0.5秒
ACALL DL100
ACALL DL100
ACALL DL100
ACALL DL100
RET
NOP
NOP
LJMP ERR ; 软件陷阱
;
DL1S: ACALL DL05S ; 延时1秒
ACALL DL05S
RET
NOP
NOP
LJMP ERR ; 软件陷阱
;
;****************************
; ERR(出错处理) 程序 ;
;****************************
ERR: CLR EA ; 关中断
MOV DPTR,#ERR1 ; 准备返回地址
PUSH DPL ; 压栈
PUSH DPH ;
RETI ; 中断返回
ERR1: MOV 56H,#0AAH ; 建立上电标志(出错标志)
MOV 57H,#55H
MOV A,#00H ; 准备返回地址
PUSH ACC ; 压栈
PUSH ACC
RETI ; 中断返回
NOP
NOP
LJMP ERR ; 软件陷阱
;
ORG 07FAH
NOP
NOP
NOP
LJMP ERR ; 软件陷阱

END ; 程序结束

;************* 电子定时器的设计******************;
;*MCU: AT892051 ;
;*MCU-crystal: 12M ;
;*Version: 01 ;
;*Last Updata: 2007-6-14 ;
;*Author: zhaojun ;
;*Description: ;
;定时器T0、T1溢出周期为50MS,T0为秒计数用 ;
;S2为功能键、S3为方式选择键 ;
;P1口为字符输出口,采用共阳显示管 ;
;P3.2~P3.5为位选,P1.7为报警发音,P3.7为被控继电器 ;
;************************************************;

;******************
; 伪定义 ;
;******************
SL EQU 30H ; SL存放秒的个位数
SH EQU 31H ; SH存放秒的十位数
ML EQU 32H ; ML存放分的个位数
MH EQU 33H ; MH存放分的十位数
HL EQU 34H ; HL存放时的个位数
HH EQU 35H ; HH存放时的十位数
;
L0 EQU 36H ; L0~L3:显示数据存储器
L1 EQU 37H
L2 EQU 38H
L3 EQU 39H
DSPLYP EQU 3AH ; 显示数据指针(DISPLAY-POINT)
PLYTS EQU 3BH ; 显示次数计数器(DISPLAY-TIMES)
;
LPLMOD BIT 39H ; 低两位显示方式(LOW-PLAY-MOD)
HPLMOD BIT 3AH ; 高两位显示方式(HIGH-PLAY-MOD)
BRIGHT BIT 3BH ; DISPLAY子程序参数:亮灭指示位
;
TCOUNT EQU 3CH ; 时间计数器(TIME-COUNT)
;
ADDRES EQU 3DH ; 加1子程序参数
MAX EQU 3EH ; 加1子程序参数
IFDEC BIT 20H ; BCD加法子程序参数
;
R_MOD EQU 3FH ; 响铃方式参数
;
LED4 BIT 30H ; 发光管状态位
BELL BIT P1.7 ; 蜂鸣器
SWITCH BIT P3.7 ; 继电器
FKEY BIT P3.0 ; 功能键 (S1)
MKEY BIT P3.1 ; 修改键 (S2)
;
WORKIN BIT 38H ; 工作状态指示位
;

;******************
; 中断入口 ;
;******************
ORG 0000H
START: LJMP MAIN ; 0000H 引向主程序
LJMP ERR ; 0003H
NOP
NOP
LJMP ERR ; 引向出错处理程序
LJMP PGT0 ; 000BH 引向中断处理程序PGT0
NOP
NOP
LJMP ERR ; 引向出错处理程序
LJMP ERR ; 0013H INT1
NOP
NOP
LJMP ERR
LJMP ERR ; 001BH T1
NOP
NOP
LJMP ERR
LJMP ERR ; 0023H
NOP
NOP
LJMP ERR
LJMP ERR ; 002BH
NOP
NOP
;
;************
; 主程序 ;
;************
MAIN: MOV IE,#00H ; 关中断
MOV SP,#57H ; 设置堆栈指针
MOV PSW,#00H ; 选用寄存器组0
MOV TMOD,#11H ; 设定中断工作方式为T0和T1
;
MOV A,56H
CJNE A,#0AAH,CSTART ; 判上电复位标志,无标志转冷启动
MOV A,57H
CJNE A,#55H,CSTART ; 无标志转冷启动
AJMP HSTART ; 有上电复位标志转热启动
NOP
NOP
LJMP ERR ; 软件陷阱,引向出错处理程序
CSTART: MOV P1,#0FFH ; 冷启动,全面初始化
MOV P3,#0FFH
MOV TCON,#00H ; 计时停止
MOV TL0,#0B0H ; 赋中断T0初值
MOV TH0,#3CH
MOV TCOUNT,#0AH ; 赋定时器初值
MOV R5,#00H ; R5为一空单元(备用)
MOV R4,#00H ; R4 为工作模式选择寄存器
MOV SL,#00H ; 定时单元清零
MOV SH,#00H ; 秒
MOV ML,#00H ;
MOV MH,#00H ; 分
MOV HL,#00H ;
MOV HH,#00H ; 时
MOV PLYTS,#64H ; 赋显示次数初值为100次
MOV DSPLYP,#L0 ; 显示指针指向显存单元
MOV L0,#0AH ; 送显示数据"-----"
MOV L1,#0AH
MOV L2,#0AH
MOV L3,#04H
SETB LED4 ; LED4为数码管之间的发光二极管
SETB LPLMOD ; 设定显示方式为闪烁
SETB HPLMOD ;
SETB BRIGHT ; 允许显示
CLR WORKIN ; 清工作标志 , 待命
AJMP SETUP ; 转开始工作
NOP
NOP
LJMP ERR ; 软件陷阱
HSTART: MOV SCON,#00H ; 有上电标志,热启动,清串行口控制寄存器
MOV IP,#00H ; 清中断优先控制寄存器
SETB FKEY ; 重设按键
SETB MKEY
SETB EA ; 开中断
AJMP BEGIN ; 转向继续工作
NOP
NOP
LJMP ERR ; 软件陷阱
SETUP: SETB EA ; 开中断
;
MAIN1: ACALL DISPLY ; 调用显示
JB FKEY,JUDGE ; 按键扫描
ACALL KEYDLY ; 延时消抖动
JB FKEY,JUDGE ; 无键按下转向判断是否到点
CLR ET0 ; 功能键被按下,则
CLR TR0 ; 暂停计时
ACALL MENU ; 调用菜单设置程序
BEGIN: SETB WORKIN ; 置工作标志位,开始工作
SETB ET0 ; 开中断
SETB TR0 ; 开始计时
MOV A,R4 ; 移入工作模式选择
RL A ; 指针放大
MOV DPTR,#M_TAB
JMP @A+DPTR ; 根据工作模式跳转到相应程序段
M_TAB: AJMP WORK1
AJMP WORK2
AJMP WORK3
AJMP WORK4
NOP
NOP
LJMP ERR ; 软件陷阱
WORK1: ;
WORK2: CLR SWITCH ; 工作方式1和2:开继电器
AJMP MAIN2
NOP
NOP
LJMP ERR ; 软件陷阱
WORK3: ;
WORK4: SETB SWITCH ; 工作方式3和4:不开继电器
MAIN2: CLR BELL ; 蜂鸣器短鸣一声,以示开始工作
ACALL DL05S
SETB BELL
JUDGE: JNB WORKIN,MAIN1 ; 判断是否在定时之中
MOV A,SL ; 判断秒是否为零
JNZ MAIN1
MOV A,SH ; 判断秒是否为零
JNZ MAIN1
MOV A,ML ; 判断分是否为零
JNZ MAIN1
MOV A,MH ; 判断分是否为零
JNZ MAIN1
MOV A,HL ; 判断时是否为零
JNZ MAIN1
MOV A,HH ; 判断时是否为零
JNZ MAIN1 ; 若时分秒全为零则
CLR ET0 ; 停止计时
CLR TR0 ;
ACALL ACTION ; 调用到点工作子程序
AJMP MAIN ; 返回
NOP
NOP
LJMP ERR ; 软件陷阱
;
;******************
; 倒计时程序 ;
;******************
PGT0: CLR EA ; 关中断
PUSH ACC ; 保护现场
PUSH PSW
PUSH DPL
PUSH DPH
MOV PSW,#08H ; 选用寄存器组1
CLR TR0 ; 暂停计时
MOV A,#0B7H ; 中断同步修正
ADD A,TL0
MOV TL0,A
MOV A,#3CH
ADD A,TH0
MOV TH0,A
SETB TR0 ; 恢复计时
DEC TCOUNT ; 定时器T0每50 000毫秒溢出一次,则
MOV A,TCOUNT ; 溢出10次为0.5秒
JNZ OUTT0 ; 判断是否到半秒
MOV TCOUNT,#0AH ;
CPL LED4 ; 若到半秒LED取反
JNB LED4,OUTT0 ; LED每闪烁一次是一秒
MOV R0,#SH ; 移入秒位的地址
SETB IFDEC ; BCD子程序参数,使其做减法
ACALL ADDBCD ; 调用BCD子程序, 秒减1
CJNE R3,#99H,OUTT0 ; 判断秒要否借位
MOV SH,#05H ; 要借位则
MOV SL,#09H ; 送数据59(否则显示99)
MOV R0,#MH ; 移入分位的地址
ACALL ADDBCD ; 分减1
CJNE R3,#99H,OUTT0 ; 判断分要否借位
MOV MH,#05H
MOV ML,#09H
MOV R0,#HH
ACALL ADDBCD
OUTT0: POP DPH ; 恢复现场
POP DPL
POP PSW
POP ACC
SETB EA
RETI ; 中断返回
NOP
NOP
LJMP ERR ; 软件陷阱
;
;
;**************************
; BCD子程序(加1或减1 ) ;
;**************************
ADDBCD: MOV A,@R0 ; 移入被操作数的高位
DEC R0 ; 指针减一
SWAP A
ORL A,@R0 ; 移入被操作数的低位
MOV B,#01H ; B寄存器送立即数#01H
MOV C,IFDEC ; 若减法标志位为1,则
MOV B.3,C ;
MOV B.4,C ; B寄存器的值被改为#99H
MOV B.7,C ;
ADD A,B ; 对一个压缩的BCD码加#99H等于对其减一
DA A ; BCD码调整
MOV R3,A ; 暂存结果
ANL A,#0FH ; 取低位码
MOV @R0,A ; 存数
MOV A,R3 ; 取回结果
INC R0 ; 指针加一
SWAP A ; 交换
ANL A,#0FH ; 取结果数的高位
MOV @R0,A ; 存数
RET
NOP
NOP
LJMP ERR ; 软件陷阱
;
;**************
; 加1程序 ;
;**************
ADDONE: MOV R0,ADDRES ; 移入被加数单元的地址
CLR IFDEC ; 设定BCD子程序做加法
ACALL ADDBCD ; 调用BCD子程序
CLR C ; 判断被加数是否大于
MOV A,R3 ; 最大值"MAX"
CJNE A,MAX,JGOVER
JGOVER: JC ENDADO
CLR A ; 若大于"MAX",则清零
MOV @R0,A
DEC R0
MOV @R0,A
ENDADO: RET
NOP
NOP
LJMP ERR ; 软件陷阱
;
;******************
; 调时快进程序 ;
;******************
QUICK: CLR LPLMOD ; 设定显示方式不闪烁
CLR HPLMOD
ACALL ADDONE ; 调用加1子程序
MOV L0,R4 ; 将工作模式选择数移入显存
INC L0 ; 加1转化成显示值
ACALL KEYDLY ; 延时
ACALL DL100
JNB MKEY,QUICK ; 判断键是否松开
SETB LPLMOD ; 若松开则恢复闪烁显示方式
CJNE R6,#02H,ENDQUK
SETB HPLMOD
CLR LPLMOD
ENDQUK: RET
NOP
NOP
LJMP ERR ; 软件陷阱
;
;
;******************
; 功能菜单程序 ;
;******************
MENU: MOV R6,#00H ; 初始化; R6 计功能键按键次数
MOV ADDRES,#05H ; 将 R5 的地址送入,以便于改变 R4 的值
MOV MAX, #04H ; 定义工作模式选择寄存器R4 的最大值
MOV DSPLYP,#L0 ; 定义显示指针指向显存
SETB LPLMOD ; 设定低两位数闪烁
CLR HPLMOD
MOV L0,R4 ; 送显示数据"F-0X"
INC L0
MOV L1,#00H
MOV L2,#0BH
MOV L3,#00H
SETB LED4
;
WAITFK: ACALL DISPLY ; 等待F键释放
JNB FKEY,WAITFK
MENU1: ACALL DISPLY
JB MKEY,JGFKEY ; M键扫描
ACALL KEYDLY ; 延时消抖动
JB MKEY,JGFKEY ; 未按下则转F键扫描
CJNE R6,#00H,NEXT1 ;
MOV SL,#00H ; 若中途改变定时方式,则清除原计时数据
MOV SH,#00H
MOV ML,#00H
MOV MH,#00H
MOV HL,#00H
MOV HH,#00H
NEXT1: MOV R2,#00H ; R2用于判断按键时间是否超过0.5秒
NEXT2: ACALL ADDONE ; 调用加1程序
MOV L0,R4 ; 移入工作方式选择数
INC L0
;
WAITMK: ACALL DISPLY ; 等待M键释放
INC R2 ; R2自增一
CLR C
CJNE R2,#0C8H,JGQUIC ; 若R2大于等于200则调用快进子程序
JGQUIC: JC WATMK1
ACALL QUICK
WATMK1: JNB MKEY,WAITMK ; R2小于200则等待M键释放
;
JGFKEY: JB FKEY,MENU1 ; 功能(F)键扫描
ACALL KEYDLY ; 延时消抖动
JB FKEY,MENU1 ; 键未按下则转修改(M)键扫描
INC R6 ; F键按键次数加1
MOV A,R6 ; 移入按键次数
RL A ; 指针放大
MOV DPTR,#FUNTAB
JMP @A+DPTR ; 根据按键次数跳转到相应的程序段
FUNTAB: AJMP WAITFK
AJMP SETLOW
AJMP SETHI
AJMP ENDMEN
NOP
NOP
AJMP ENDMEN
;STWKMD: ; 工作模式设定,不需另外改变菜单
;
SETLOW: MOV MAX,#60H ; 设置低位(秒位或分位)
MOV A,R4 ; 移入工作模式选择数
RL A ; 指针放大
MOV DPTR,#FTAB1
JMP @A+DPTR ; 根据工作模式选择数跳转到相应的程序段
FTAB1: AJMP SETSS
AJMP SETM60
AJMP SETSS
AJMP SETM60
NOP
NOP
AJMP WAITFK
SETSS: MOV DSPLYP,#SL ; 设定显示区域为MM:SS
MOV ADDRES,#SH
AJMP WAITFK
SETM60: MOV DSPLYP,#ML ; 设定显示区域为HH:MM
MOV ADDRES,#MH
AJMP WAITFK
;
SETHI: CLR LPLMOD ; 设置高位(分位或时位)
SETB HPLMOD ; 高两位数码管闪烁
MOV MAX,#31H ; 最大数为30
MOV A,R4 ; 移入工作模式选择数
RL A ; 指针放大
MOV DPTR,#FTAB2 ; 移入表首地址
JMP @A+DPTR ; 根据工作模式选择数跳转到相应的程序段
FTAB2: AJMP SETM30
AJMP SETHH
AJMP SETM30
AJMP SETHH
NOP
NOP
AJMP WAITFK ; 返回等待键释放
SETM30: MOV ADDRES,#MH ; 移入分位的地址
AJMP WAITFK ; 转向等待键释放
SETHH: MOV ADDRES,#HH ; 移入时位的地址
AJMP WAITFK ; 转向等待键释放
;
ENDMEN: CLR HPLMOD ; 恢复不闪烁显示方式
RET
NOP
NOP
LJMP ERR ; 软件陷阱
;
;****************
; 到点工作程序 ;
;****************
ACTION: MOV L0,R4 ; 移入工作模式选择数
INC L0 ; 送显示数"F-0X"
MOV L1,#00H
MOV L2,#0BH
MOV L3,#00H
SETB LED4
MOV DSPLYP,#L0 ; 指针指向显存
SETB LPLMOD ; 设定显示方式不闪烁
SETB HPLMOD
MOV A,R4 ; 移入工作模式选择数
RL A ;
MOV DPTR,#A_TAB
JMP @A+DPTR ; 根据工作模式选择数跳转
A_TAB: AJMP ACTF1 ; 工作模式一
AJMP ACTF1 ; 工作模式二
AJMP ACTF3 ; 工作模式三
AJMP ACTF3 ; 工作模式四
NOP
NOP
LJMP ERR ; 软件陷阱
ACTF1: SETB SWITCH ; 工作模式一(或二): 关继电器
MOV R_MOD,#82H ; 响铃模式参数#82H
MOV R2,#96H ; 响铃次数参数#96H
ACTF11: ACALL RING ; 调用响铃子程序
JNB MKEY,ENDACT ; 等待键按下
JNB FKEY,ENDACT ; 有键按下则结束响铃
DJNZ R2, ACTF11 ; 次数未满继续响铃
MOV R_MOD,#0FFH ; 参数#0FF使响铃无效
AJMP ACTF11 ; 无键按下返回
NOP
NOP
LJMP ERR ; 软件陷阱
ACTF3: CLR SWITCH ; 工作模式三(或四): 开继电器
CLR BELL ; 蜂鸣器短鸣一声
ACALL DL1S
SETB BELL
MOV R_MOD,#0FFH ; 响铃模式参数#0FFH
MOV R2,#96H ; 响铃时间参数#96H
ACTF31: ACALL RING ; 调用响铃子程序
JNB MKEY,ENDACT ; 等待键按下
JNB FKEY,ENDACT ; 有键按下则结束
DJNZ R2,ACTF31 ; 次数未满继续
MOV R2,#96H ; 重新赋值
CLR BELL ; 短鸣一声(说明: 响铃模式参数#0FFH使
ACALL DL100 ; 响铃程序无效,仅起延时作用,
SETB BELL ; 每延时一段时间短鸣一声,以
AJMP ACTF31 ; 提醒使用者继电器仍在工作)
NOP
NOP
LJMP ERR ; 软件陷阱
ENDACT: SETB SWITCH ; 关继电器
AWAITF: ACALL DISPLY ; 调用显示
JNB FKEY,AWAITF ; 等待键释放
AWAITM: ACALL DISPLY ; 调用显示
JNB MKEY,AWAITM ; 等待键释放
RET
NOP
NOP
LJMP ERR ; 软件陷阱
;
;**************
; 响铃程序 ;
;**************
RING: MOV R5,#18H ; R5为循环控制变量
RING1: JNB MKEY,R_EXIT ; 键扫描
JNB FKEY,R_EXIT ; 有键按下则退出
MOV A,R_MOD ; 移入响铃模式参数
MOV C,ACC.7 ; 根据响铃模式参数改变响铃
MOV BELL,C
RL A
MOV R_MOD,A
ACALL DL100 ; 延时
DJNZ R5,RING1 ; 循环次数控制
R_EXIT: SETB BELL ; 关闭响铃
RET
NOP
NOP
LJMP ERR ; 软件陷阱
;
;**************
; 显示程序 ;
;**************
DISPLY: PUSH ACC ; 数据压栈保护
PUSH PSW
MOV PSW,#10H ; 选用寄存器组2
MOV R0,DSPLYP ; 移入显示指针
MOV R2,#0FDH ; R2寄存的是数码管选通数
MOV A,PLYTS ; 移入显示循环控制量
JNZ PLAY ; 不为0则转PLAY
MOV PLYTS,#64H ; 否则从新赋值
CPL BRIGHT ; 亮灭指示位取反
PLAY: DEC PLYTS ; 显示循环控制量减1
JNB LPLMOD,PLAYL ; 低两位数码管不闪则"PLAYL"
JB BRIGHT,PLAYL ; 亮灭指示为1也"PLAYL"
ACALL NOPLAY ; 否则灭灯延时
AJMP PLAY1 ; 转显示高位数码管
NOP
NOP
LJMP ERR ; 软件陷阱
;用来显示低位
PLAYL: ORL P1,#7FH ; 清原显示数据
ORL P3,#3CH ; 清原选通数据
MOV A,R2 ; 移入数码管位选数
RL A ; 换一位
ANL P3,A ; 选通低位的个位数码管
MOV R2,A ; 暂存位选数
MOV A,@R0 ; 移入显示数值
MOV DPTR,#TABLE1 ; 移入表首地址
MOVC A,@A+DPTR ; 查表
ANL P1,A ; 送显示数据
ACALL DL1MS ; 延时
INC R0 ; 指向低位的十位数
JB P3.3,PLAYL ; 显示低位的十位数
;
PLAY1: JNB HPLMOD,PLAYH ; 高两位数码管不闪则"PLAYH"
JB BRIGHT,PLAYH ; 亮灭指示为1也"PLAYH"
ACALL NOPLAY ; 否则灭灯延时
AJMP OUTPLY ; 转结束
NOP
NOP
LJMP ERR ; 软件陷阱
;
;用来显示高位
PLAYH: ORL P1,#7FH ; 清原显示数据
ORL P3,#3CH ; 清原选通数据
ANL P3,#0EFH ; 选通高位的个位数数码管
MOV A,@R0 ; 移入显示数值
MOV DPTR,#TABLE1 ; 移入表首地址
MOVC A,@A+DPTR ; 查表
ANL P1,A ; 送显示数据
ACALL DL1MS ; 延时
INC R0 ; 指向高位的十位数
; ; 显示高位的十位数
ORL P1,#7FH ; 清原显示数据
ORL P3,#3CH ; 清原选通数据
ANL P3,#0DFH ; 选通高位的十位数
MOV A,@R0 ; 移入显示数值
MOV C,LED4 ; 指针放大+小灯状态
RLC A ;
MOV DPTR,#TABLE2 ; 移入表首地址
MOVC A,@A+DPTR ; 查表
ANL P1,A ; 送显示数据
ACALL DL1MS ; 延时
;
OUTPLY: POP PSW ; 恢复数据
POP ACC
RET
NOP
NOP
LJMP ERR ; 软件陷阱
;
TABLE1: DB 0C0H,0F9H,0A4H,0B0H, 99H, 92H, 82H,0F8H, 80H, 90H,0BFH, 8EH,0FFH
; "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "-", "F", " "
;
TABLE2: DB 0FFH, 0DFH, 0F9H, 0D9H, 0A4H, 84H, 0B0H, 90H, 0BFH, 09FH
; " ", " :", "1 ", "1:", "2 ", "2:", "3 ", "3:", "- ", "-:"
;
;
;
;**********************
; 无显示(灭灯)程序 ;
;**********************
NOPLAY: ORL P1,#7FH ; 清显示数据
ORL P3,#3CH ; 清选通数据
INC R0 ; 指针自增2
INC R0
ACALL DL1MS ; 延时
RET
NOP
NOP
LJMP ERR ; 软件陷阱
;
;******************
; 延时程序 ;
;******************
DL1MS: MOV R3,#0F9H ; 延时 1250US 只为DISPLY所调用
DL1MS1: NOP
NOP
NOP
DJNZ R3,DL1MS1
RET
NOP
NOP
LJMP ERR ; 软件陷阱
;
KEYDLY: CLR BELL ; 按键消抖动专用延时程序,
ACALL DISPLY ; 在消除抖动的同时发出按键提示音
SETB BELL
RET
NOP
NOP
LJMP ERR ; 软件陷阱
;
DL50MS: MOV R7,#0AH ; 50毫秒延时程序
DL50M1: ACALL DISPLY ; 每调用一次显示程序5MS
DJNZ R7,DL50M1 ; 调用10次
RET
NOP
NOP
LJMP ERR ; 软件陷阱
;
DL100: ACALL DL50MS ; 延时100毫秒
ACALL DL50MS
RET
NOP
NOP
LJMP ERR ; 软件陷阱
;
DL05S: ACALL DL100 ; 延时0.5秒
ACALL DL100
ACALL DL100
ACALL DL100
ACALL DL100
RET
NOP
NOP
LJMP ERR ; 软件陷阱
;
DL1S: ACALL DL05S ; 延时1秒
ACALL DL05S
RET
NOP
NOP
LJMP ERR ; 软件陷阱
;
;****************************
; ERR(出错处理) 程序 ;
;****************************
ERR: CLR EA ; 关中断
MOV DPTR,#ERR1 ; 准备返回地址
PUSH DPL ; 压栈
PUSH DPH ;
RETI ; 中断返回
ERR1: MOV 56H,#0AAH ; 建立上电标志(出错标志)
MOV 57H,#55H
MOV A,#00H ; 准备返回地址
PUSH ACC ; 压栈
PUSH ACC
RETI ; 中断返回
NOP
NOP
LJMP ERR ; 软件陷阱
;
ORG 07FAH
NOP
NOP
NOP
LJMP ERR ; 软件陷阱

END ; 程序结束


8051单片机功能简介
8051单片机是一种典型的微控制器,广泛应用于各种嵌入式系统中。其主要功能包括以下几点:一、中央处理单元 8051单片机集成了CPU,能够进行各种算术和逻辑运算。CPU作为单片机的核心部分,负责执行指令、控制各种操作以及处理数据。它能够实现数据的传输、存储和处理,从而完成各种复杂的控制任务。二、内存和存储...

详解:8051单片机的结构与原理
8051单片机的引脚设计多样,如DIP和PLCC封装,包含了电源、时钟、控制信号等,如EA、RST、ALE、PSEN等。其中,P0、P1、P2口作为并行输入\/输出接口,各有其独特的作用。P0口特殊在于可以复用为地址\/数据总线,而P1和P2口则主要用于通用I\/O操作。在嵌入式物联网的学习过程中,深入理解这些接口的工作原理...

8051单片机实际应用时数据总线和地址总线如何形成?
回答:只有需要在外部扩展程序存储器或数据存储器时,才需要数据总线和地址总线的,而现在的51单片机几乎都不需要扩展外部的存储器了。 如果就是为了要接出来数据总线和地址总线的话,P0口的8条线直接接出来就是8条数据线,再用一片74LS373作低8位地址锁存器,输入端接到P0口,8条输出端就是低8位地址总线...

8051单片机有哪些应用
各行各业都有应用,可以实现很多自动控制和简单的数据处理功能。

51单片机原理是什么,有哪些应用?
8051单片机在一块芯片上集成了一个微型计算机的主要部件,它包括以下几部分:1个8位微处理器(CPU)。1个时钟电路。4KB程序存储器。256B数据存储器。2个16位定时\/计数器。64KB扩展总线控制电路。4个8位并行I\/O接口P0~P3。1个全双工串行I\/O接口。5个中断源,其中包括2个优先级嵌套中断。将微处理器...

怎样用单片机控制数码管的显示?
控制数码管显示通常涉及到驱动数码管的硬件连接和编写相应的软件代码。数码管可以是共阳极或共阴极的,这决定了你需要如何驱动它们。以下是一个基本的例子,展示了如何使用8051单片机控制一个共阴极数码管显示数字。首先,假设你有一个共阴极数码管,并且它连接到单片机的P0口。每个数码管的段(a, b, c, ...

8051单片机功能简介
在前面的学习中我们已知道,8031单片机内部是没有ROM的,那么在应用8031单片机时,这个脚是一直接低电平的。 3、8751烧写内部EPROM时,利用此脚输入21V的烧写电压。 RST 复位信号:当输入的信号连续2个机器周期以上高电平时即为有效,用以完成单片机的复位初始化操作,当复位后程序计数器PC=0000H,即复...

1.8051单片机应用系统中,EA端有何用途?在使用8031单片机时,EA信号引 ...
EA#用于选择单片机的程序读取方式。当EA#生效(拉低电平)时,将会访问外部程序存储器;否则优先访问内部程序存储器。对于8031这样的 Romless 无家可归老前辈,必须要配备程序ROM并与单片机接好,同时把EA#拉低。

8051单片机的4个I\/O口在使用上有哪些分工和特点
8051单片机的4个I\/O口主要有P0、P1、P2、P3。P0口下拉能力较强;P3口有较多的复用功能;P0、P1口当访问外部存储器时可做为DB和AB口,P2口一般做为通用IO口使用。P1,P2,P3具有内部上拉双向输出IO口,P0口无内部上拉电阻为开漏输出,如果做为普通IO口使用,除P0口需要外加上拉电阻,其功能一致。

8051是什么单片机?
8051单片机是PC 机的CPU 是基于冯诺伊曼的体系结构。8051单片机供应商:拍明芯城元器件商城 基本结构 51 单片机最初是由Intel 公司开发设计的,但后来Intel 公司把51 核的设计方案卖给了几家大的电子设计生产商,譬如 SST、Philip、Atmel 等大公司。如是市面上出现了各式各样的但均以51 为内核的...

日喀则市19273829916: 如何用8051单片机设计倒计时牌
庾利神曲: 你这个东西要不要断电保护的? 如果没有的话 那到是可以用8051单片机开发 ,如果有的话 虽然可以 但是比较麻烦,要加外围6264什么的 还要加电池保存他的内容 显示当前时间的程序有很多 你可以先百度下 你还是先调试出当前时间再调试倒计时吧 就是 多1个按键控制 倒计时的修改而已 也很简单

日喀则市19273829916: 如何用8051单片机设计倒计时牌 -
庾利神曲: ;************* 电子定时器的设计******************; ;*MCU: AT892051 ; ;*MCU-crystal: 12M ; ;*Version: 01 ; ;*Last Updata: 2007-6-14 ; ;*Author: zhaojun ; ;*Description: ; ;定时器T0、T1溢出周期为50MS,T0为秒计数用 ; ;S2为功能键、S3...

日喀则市19273829916: 8051单片机倒计时牌设计的完整程序
庾利神曲: ;************* 电子定时器的设计******************; ;*MCU: AT892051 ; ;*MCU-crystal: 12M ; ;*Version: 01 ; ;*Last Updata: 2009-5-4 ; ;*Author: HaiZhiZi ; ;*Description: ; ;定时器T0、T1溢出周期为50MS,T0为秒计数用 ; ;S2为功能键、S3为...

日喀则市19273829916: 8051单片机30秒倒计时程序用汇编语言编写 -
庾利神曲: 用STC串口助手吧 里面有例程,你这个是倒计时. DELAY30000US: ;@11.0592MHzPUSH 30HPUSH 31HMOV 30H,#54MOV 31H,#194 NEXT:DJNZ 31H,NEXTDJNZ 30H,NEXTPOP 31HPOP 30HRET

日喀则市19273829916: 单片机控制倒计时定时器 怎么编啊急 -
庾利神曲: 1. 设置两个按键K1为开始按钮, K2为停止按钮. 2 预置7种的倒计时时间.分别为5/15/20/30/35/45/50分钟倒计时 3. P1.0口外接一发光二极管为状态LED,定时未开始时LED常亮,定时过程中 LED闪烁. 4. 设置两位LED显示器,显示即时时间. 5. 画出硬件接口电路,并说明相关的工作过程. 6. 编写相关的控制程序.

日喀则市19273829916: 如何用单片机制作倒数计时器 -
庾利神曲: 也就是百倒计时30秒吗? 用内部定时器就可以, 以51为例度 60ms*500=30s(每次定时60毫秒 循环500次) 60ms初值 TC=版2^16-60000=5536=15A0(H) ORG 0000HLJMP MAINORG 000BHLJMP TO_INT ;ORG 0100H MAIN: MOV IE ,#...

日喀则市19273829916: 单片机计算器C语言程序 还可以实现时钟和倒计时 实在不会编程.... -
庾利神曲: 利用单片机的定时器,8051单片机如:void time0() interrupt 1 { TH0=(65536-50000)/256; TL0=(65536-50000)%256;//TMOD=0x01,定时器工作方式,每50ms产生一次中断 num++; if(num>=20) //到一秒 { num=0; miao++; //秒 } } 倒计时函数,基于对秒变量的处理.你可以由一个轻触按键设定初值,如2分钟,并确定开始倒计时.

日喀则市19273829916: 单片机设计倒计时器,求程序 -
庾利神曲: 可以用定时器产生1ms中断 1000次后就是一秒 用一个标志位来控制是否进行倒计时 灯和数码管倒计时写在同一个地方 这里程序写不下 只能写一些C语言的思路了

日喀则市19273829916: 用单片机设计一个倒计时器,计时初值为100,请设计一个倒计时器,计时初值为100,按下某按键后计时开始,每秒钟减一,数字显示当前计数值,减到0... -
庾利神曲:[答案] 你好! 显示是用数码管还是液晶?是采用仿真的形式实现吗? 原理图确定了没有,程序可以协助完成.

日喀则市19273829916: 如何用单片机和数码管制作倒计时表 -
庾利神曲: 这是我自己写的代码,修改了我前段时间写的电子钟,在跟老师借的板子上调试成功,你看看参考一下.(还是我第一次写的编程规范化程序,有注释哦) //****************************************************************** //作者:cheungman //日期:...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网