标题:
单片机汇编语言的直流电机三极管放大调速数码管不亮
[打印本页]
作者:
256202
时间:
2019-1-10 09:23
标题:
单片机汇编语言的直流电机三极管放大调速数码管不亮
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
0.png
(21.72 KB, 下载次数: 11)
下载附件
2019-1-10 17:46 上传
单片机源程序如下:
;AD转换的数据在20H-25H,读出的数据在24H
ACK BIT 20H.0 ;应答标志位ACK=0表示无应答
SCL BIT P2.0 ;时钟线
SDA BIT P2.1 ;数据线
WADD EQU 21H ;器件地址(从地址)
SUBD EQU 22H ;器件内部地址(子地址)
NUMBR EQU 23H ;需读取的字节数
RDATA EQU 25H ;读出数据的存放首地址
QJCSH: MOV 20H,#00H
MOV 21H,#00H
MOV 22H,#00H
MOV 23H,#00H
MOV 24H,#00H
MOV 25H,#00H
MOV 30H,#00H
MOV 31H,#00H
MOV 32H,#00H
MOV 33H,#00H
MOV TMOD,#51H
MOV TL0,#00H
MOV TH0,#4CH
MOV TL1,#00H
MOV TH1,#00H
SETB EA
SETB ET0
SETB ET1
RET
LJMP START
ORG 000BH
LJMP IT0P
ORG 001BH
LJMP IT1P
ORG 0100H
START: MOV SP,#60H
MOV SCON,#00H
LCALL QJCSH;???
;ad转换子程序
DQAD: MOV WADD,#90H ;写入PCF8591的地址
MOV SUBD,#40H ;写入PCF8591的控制字
MOV NUMBR,#1 ;写入需读取的字节数
MOV RDATA,#24H ;送入首地址
LCALL READI2C ;读PCF8591子程序
MOV A,24H
;从I2C总线读取N个字节数据子程序
READI2C:LCALL STARTI2C ;启动I2C总线
MOV A,WADD ;送入器件地址
LCALL WI2C ;向I2C总线发送一个字节数据子程序
LCALL RACK ;读取从机应答子程序
JNB ACK,ROUT ;判断从机有无应答ACK=0则无应答
MOV A,SUBD ;?送入器件内部地址
LCALL WI2C
LCALL RACK
LCALL STARTI2C
MOV A,WADD
INC A
LCALL WI2C
LCALL RACK
JNB ACK,READI2C
MOV R0,RDATA
RI2C2: LCALL RI2C
MOV @R0,A
DJNZ NUMBR,RI2C1
LCALL NMACK
ROUT: LCALL STOPI2C
MOV RDATA,#24H
RET
RI2C1: LCALL MACK
INC R0
SJMP RI2C2
;I2C?总线启动子程序
STARTI2C:SETB SDA
SETB SCL
NOP
NOP
NOP
NOP
NOP
CLR SDA
NOP
NOP
NOP
NOP
NOP
CLR SCL
RET
;I2C总线停止子程序
STOPI2C:CLR SDA
SETB SCL
NOP
NOP
NOP
NOP
NOP
SETB SDA
RET
;主机应答子程序
MACK: CLR SDA
SETB SCL
NOP
NOP
NOP
NOP
NOP
CLR SCL
RET
;主机非应答子程序
NMACK: SETB SDA
SETB SCL
NOP
NOP
NOP
NOP
NOP
CLR SCL
RET
;向I2C总线发送一个字节数据子程序
WI2C: MOV R7,#8
WLP: RLC A
MOV SDA,C
NOP
SETB SCL
NOP
NOP
NOP
NOP
NOP
CLR SCL
DJNZ R7,WLP
RET
;从I2C总线读取一个字节数据子程序
RI2C: MOV R7,#8
CLR A
SETB SDA
NOP
RLP: SETB SCL
NOP
NOP
MOV C,SDA
NOP
CLR SCL
RLC A
NOP
NOP
NOP
NOP
DJNZ R7,RLP
NOP
RET
;读取从机应答子程序
RACK: SETB SDA
NOP
NOP
SETB SCL
CLR ACK
NOP
NOP
MOV C,SDA
JC ACKEND
SETB ACK
ACKEND: NOP
CLR SCL
NOP
RET
;DA转换程序
ORG 1000H ;000000000000000000000
DAZH: CLR P2.4
SETB P2.5
CLR P2.6
MOV R0,#0FEH
MOVX @R0,A
RET
;测速程序
ORG 0000H
RESET: LJMP CESU
CESU: MOV SP,#60H
MOV B,#14H
MOV R0,#00H
MOV R1,#70H
MOV TMOD,#51H
MOV TL0,#00H
MOV TH0,#4CH
MOV TL1,#00H
MOV TH1,#00H
SETB ET0
SETB ET1
SETB EA
SETB TR0
SETB TR1
HERE: SJMP HERE
IT0P: MOV TL0,#00H
MOV TH0,#4CH
DJNZ B,RTURN
CLR TR0
SETB F0
IT1P: MOV R1,TH1
MOV R0,TL1
MOV B,3CH ;60的16进制
MOV A,R0
MUL AB ;1s转速转换成1min转速
MOV R1,B
MOV R0,A
MOV A,R0
ANL A,#0FH
MOV 30H,A
MOV A,R0
SWAP A
ANL A,#0FH
MOV 31H,A
MOV A,R1
ANL A,#0FH
MOV 32H,A
MOV A,R1
SWAP A
ANL A,#0FH
MOV 33H,A
CLR TR1
SETB F0
RTURN: RETI
;显示程序
XS: CLR TI
MOV R0,#30
MOV R1,#4
SEND: MOV A,@R0
MOV DPTR,#TAB
MOVC A,@A+DPTR
CPL A
MOV SBUF,A
JNB TI,$
CLR TI
INC R0
DJNZ R1,SEND
RET
TAB: DB 0C0H,0F9H,0A4H,0B0H,99H
DB 92H,82H,0F8H,80H,90H
END
复制代码
全部资料51hei下载地址:
1.rar
(141.45 KB, 下载次数: 13)
2019-1-10 09:22 上传
点击文件名下载附件
作者:
256202
时间:
2019-1-10 09:24
请大家帮帮忙,压缩包里是图和程序,麻烦大家了
作者:
ahshmj
时间:
2019-1-10 14:34
本帖最后由 ahshmj 于 2019-1-10 17:24 编辑
你的程序写的问题较多。最严重的是,"QJCSH"怎么放到了最前面?又没有指定程序在程序存储器的位置,自然就从0000H开始写入。
以下的程序就没地方写了:
LJMP START
ORG 000BH
LJMP IT0P
ORG 001BH
LJMP IT1P
ORG 0100H
另外: LJMP START 这一句的前面应该有: ORG 0000H (意思是第一个字节就是跳转到 START)单片机上电或启动以后是从这里开始执行程序。
你好像还需要继续打牢基本功。
作者:
Y_G_G
时间:
2019-1-10 18:53
看样子应该是从C过来学汇编的
汇编代码的位置和硬件是有很大关系的
首先:
ORG 00H
JMP START
ORG 003H ;声明INT0中断向量,也就是中断地址
JMP XXXX ;去中断处理程序
ORG 00BH ;声明INT1中断向量
JMP XXXX _1 ;去中断处理程序
ORG 100H
START: STARTD在这里相当于一个地址,在JMP START到ORG 100H之间不能有其它代码
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1