使用PROTEUS 利用89S51单片机设计一个数字时钟仿真 具体如下:
作者&投稿:将恒 (若有异议请与网页底部的电邮联系)
A/D转换芯片是用ADC0808吗?既然是仿真,就不用单片机产生ADC0808的时钟脉冲,可以用proteus的时钟信号。
数码管一直在不停的闪烁,估计是你的仿真图有问题,下图是用你的程序运行的仿真图,数码管可以正常显示,不闪烁。对照一下你的仿真图。
最后问一句,关于ADC转换后的计算,是要计算什么呢,显示出来的值没有什么规律。
本人这学期课设有6个实在顾不过来
课设?
读的什么学校呀,要弄这么详细的课设?
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
用具鱼金: 打开软件界面如图,选择P进行元器件的摆放.如何使用Proteus做单片机仿真 在这里可以通过元器件的名字进行检索.电容电阻等元器件只需要其相应的英文缩写即可.如何使用Proteus做单片机仿真89C52是单片机初学者的不错选择,在检索...
桑日县13433055373: proteus的元件库里没有AT89S51怎么添加 - ?
用具鱼金: 可以用AT89C51代替,他们都兼容MCS-51指令.在工作频率上S51比C51的极限频率要高.还有就是S51支持ISP下载,C51不具备此功能,所以你可以代替的.
桑日县13433055373: 做毕业设计,在网上找的资料,用proteus仿真不出来,各位给看看,这个能使吗? - ?
用具鱼金: 图没问题,程序没问题,在proteus中单片机要用89S51吧,然后程序编译下试试,
桑日县13433055373: 汇编语言4X3矩阵键盘程序,在proteus中与AT89C51单片机,共阴极数码管仿真,但是行线不扫描 - ?
用具鱼金: 搜:做而论道 单片机89S51,4*4矩阵键盘,控制16个发光二极管 百度一下,就可以找到用汇编写的扫描4*4矩阵键盘的程序.简单改动,就可以用于楼主的键盘扫描.
桑日县13433055373: 请问在proteus里怎么调用stc89c51单片机,我的proteus里好像没那个型号的单片机,请问我该怎样添加? - ?
用具鱼金: 用AT89C51等兼容51的部件来替代.STC的特有部分目前无法仿真.
桑日县13433055373: proteus中可以用哪款单片机代替STC89C52啊 - ?
用具鱼金: stc89c51,89s52,89s51
桑日县13433055373: Multisim,Protel,Keil和Proteus的区别 - ?
用具鱼金: Multisim有超强板级的模拟/数字电路板的设计工作.它包含了电路原理图的图形输入、电路硬件描述语言输入方式,具有丰富的仿真分析能力.高版本可以进行单片机等MCU的仿真.Multisim有实际元器件和虚拟元器件,它们之间根本差别在于...
桑日县13433055373: 我用单片机89S51程序:MAIN:MOV P3,#0FFH LOOP:P1,P3 LJMP LOOP END 为何将0信号输入P1.0而P3.0不输出0信 - ?
用具鱼金: MAIN: MOV P3,#0FFH LOOP: MOV P1,P3LJMP LOOP END 你这程序,是从P3输入,再由P1输出.《为何将0信号输入P1.0而P3.0不输出0信》因为你弄反了输入、输出的关系.
桑日县13433055373: 89s51怎么接电磁继电器开关? - ?
用具鱼金: 先通过三极管控制一个光耦合元件,在用光耦合元件通过三极管控制电磁继电器.