使用PROTEUS 利用89S51单片机设计一个数字时钟仿真 具体如下: 单片机数字时钟keil与proteus软件仿真程序

\u57fa\u4e8eAT89C51\u5355\u7247\u673a\u7684\u6570\u5b57\u7535\u538b\u8868\u8bbe\u8ba1\u548cproteus\u4eff\u771f

A/D\u8f6c\u6362\u82af\u7247\u662f\u7528ADC0808\u5417\uff1f\u65e2\u7136\u662f\u4eff\u771f\uff0c\u5c31\u4e0d\u7528\u5355\u7247\u673a\u4ea7\u751fADC0808\u7684\u65f6\u949f\u8109\u51b2\uff0c\u53ef\u4ee5\u7528proteus\u7684\u65f6\u949f\u4fe1\u53f7\u3002
\u6570\u7801\u7ba1\u4e00\u76f4\u5728\u4e0d\u505c\u7684\u95ea\u70c1\uff0c\u4f30\u8ba1\u662f\u4f60\u7684\u4eff\u771f\u56fe\u6709\u95ee\u9898\uff0c\u4e0b\u56fe\u662f\u7528\u4f60\u7684\u7a0b\u5e8f\u8fd0\u884c\u7684\u4eff\u771f\u56fe\uff0c\u6570\u7801\u7ba1\u53ef\u4ee5\u6b63\u5e38\u663e\u793a\uff0c\u4e0d\u95ea\u70c1\u3002\u5bf9\u7167\u4e00\u4e0b\u4f60\u7684\u4eff\u771f\u56fe\u3002
\u6700\u540e\u95ee\u4e00\u53e5\uff0c\u5173\u4e8eADC\u8f6c\u6362\u540e\u7684\u8ba1\u7b97\uff0c\u662f\u8981\u8ba1\u7b97\u4ec0\u4e48\u5462\uff0c\u663e\u793a\u51fa\u6765\u7684\u503c\u6ca1\u6709\u4ec0\u4e48\u89c4\u5f8b\u3002

\u672c\u4eba\u8fd9\u5b66\u671f\u8bfe\u8bbe\u67096\u4e2a\u5b9e\u5728\u987e\u4e0d\u8fc7\u6765


\u8bfe\u8bbe\uff1f

\u8bfb\u7684\u4ec0\u4e48\u5b66\u6821\u5440\uff0c\u8981\u5f04\u8fd9\u4e48\u8be6\u7ec6\u7684\u8bfe\u8bbe\uff1f

ORG 0000H
AJMP MAIN
ORG 000BH
AJMP PIT0
ORG 0030H
MAIN:MOV SP,#60H ;设置堆栈区
MOV R0,#79H ;显示缓冲区首地址
MOV R7,#06H ;显示位数
ML1:MOV @R0,#00H ;显示缓冲单元清零
INC R0
DJNZ R7,ML1
MOV TMOD,#01H ;定时器0,工作方式1
MOV TL0,#0DCH ;装载计数器初值
MOV TH0,#0BH
SETB TR0 ;TR0置1,定时开始
SETB EA ;EA置1,中断总允许
SETB ET0 ;ET0置1,定时器0中断允许
MOV 30H,#08H ;要求的计数溢出次数,即循环次数
ML0: LCALL DIS ;调用显示子程序
JNB P3.0,ML0 ;按键1判断
JNB P3.1,ML0
JNB P3.2,ML0
LOOP:JNB P3.0,L0 ;按键0判断
JNB P3.1,L1
JNB P3.2,L2
LCALL DIS ;调用显示子程序
AJMP LOOP
L0: MOV R0,#7AH ;秒加1
ACALL DAAD1
MOV A ,R2
XRL A,#60H
JNZ ML0
ACALL CLR0
AJMP ML0
L1: MOV R0,#7CH ;分加1
ACALL DAAD1
MOV A ,R2
XRL A,#60H
JNZ ML0
ACALL CLR0
AJMP ML0
L2: MOV R0,#7EH ;时加1
ACALL DAAD1
MOV A ,R2
XRL A,#24H
JNZ ML0
ACALL CLR0
SJMP ML0
PIT0:PUSH PSW ;中断服务程序,现场保护
PUSH ACC
SETB PSW.3 ;RS1 RS0=01,选择1组通用寄存器
MOV TL0,#0DCH ;计数器重新加载
MOV TH0,#0BH
DJNZ 30H,RET0 ;不满8次,转向RETO返回
MOV 30H,#08H ;满8次,开始计数时操作
MOV R0,#7AH ;秒显示缓冲单元地址
ACALL DAAD1 ;秒加1
MOV A,R2 ;秒加1后值在R2中
XRL A,#60H ;判断是否到60秒
JNZ RET0 ;不到,转到RET0返回
ACALL CLR0 ;到60秒,显示缓冲单元清零
MOV R0,#7CH ;分显示缓冲单元地址
ACALL DAAD1 ;分加1
MOV A,R2
XRL A,#60H ;判断是否到60分
JNZ RET0
ACALL CLR0 ;到60分,则分显示缓冲单元清零
MOV R0,#7EH ;时显示缓冲单元地址
ACALL DAAD1 ;时加1
MOV A,R2
XRL A,#24H ;判断是否到24时
JNZ RET0
ACALL CLR0 ;到24时,则时显示缓冲单元清零
RET0:POP ACC ;现场恢复
POP PSW
RETI ;中断返回
DAAD1:MOV A,@R0 ;加1子程序,十位书送A
DEC R0
SWAP A ;十位数占高4位
ORL A,@R0 ;个位数占低4位
ADD A,#01H ;加1
DA A ;十进制调整
MOV R2,A ;全值暂存在R2中
ANL A,#0FH ;屏蔽十位数,取出个位数
MOV @R0,A ;个位值送显示缓冲单元
MOV A,R2
INC R0
ANL A,#0F0H ;屏蔽个位数,取出十位数
SWAP A ;十位数占低4位
MOV @R0,A ;十位值送显示缓冲单元
RET ;返回
CLR0:CLR A ;清缓冲单元子程序
MOV @R0,A ;十位显示缓冲单元清零
DEC R0
MOV @R0,A ;个位显示缓冲单元清零
RET ;返回

DIS:MOV R0,#79H ;建立显示缓冲区首地址
MOV R3,#01H ;从右边开始显示
MOV A,R3 ;位控码初值
LD0:MOV DPTR,#0FFDDH ;位控口地址
MOVX @DPTR,A ;输出口控码
MOV DPTR,#0FFDCH ;段控口地址
MOV A,@R0 ;取出显示数据
DIR0:ADD A,#0DH
MOVC A,@A+PC ;查表取字形代码
DIR1:MOVX @DPTR,A ;输出断控码
ACALL DL ;延时
INC R0 ;转向下一缓冲单元
MOV A,R3
JB ACC.5,LD1 ;判断是否到最高位,到则返回
RL A ;不到,向显示器高位移位
MOV R3,A ;位控码送R3保存
AJMP LD0 ;继续扫描
LD1:RET
DSEG0:DB 0C0H ;字形代码表
DB 0F9H
DB 0A4H
DB 0B0H
DB 99H
DB 92H
DB 82H
DB 0F8H
DB 80H
DB 90H
DL: MOV R6,#125 ;设置循环次数
L1: NOP
NOP
DJNZ R6,L1
RET ;返回
END

扩展阅读:proteus 8 professional ... proteus官网下载 ... proteus元器件查找大全 ... proteus pro7.8 ... proteus0.96寸oled ... proteus中stc89c52 ... proteus 8.6汉化 ... proteus8元器件对照表 ... proteus8.9使用入门教程 ...

本站交流只代表网友个人观点,与本站立场无关
欢迎反馈与建议,请联系电邮
2024© 车视网