51单片机通信问题
请各位前辈大侠高手帮忙解有关问题 感激不尽 !
本人是单片机初学者 本来想做多机通信的 但实验多次失败 后来把通信程序简化 就是直接一对一把资料传送 但还是不成功.
以下是所写的程序 发送用STC12C6508AD单片机 接收用STC11F32XE 这两单片机都是8051兼容的 晶振是用11.0592MHZ的.
两边都有用到232 IC RXD TXD 有交叉连接, 先进入接收资料的子程序 再到发送资料的子程序 用串口工作方式3
RXD---TXD
TXD---RXD
;发送资料的子程序 STC12C6508AD 兼容51单片机 :
SLV: MOV TMOD,#20H ;TIMER 1 MODE2 8 BIT AUTO LOAD
MOV TL1,#0FDH ;9600
MOV TH1,#0FDH
SETB TR1 ;START TIMER 1
MOV SCON,#0C0H ;1100 0000B MODE 3, REN=0
;send data -------------------------------------------------
CLR TB8
MOV R0,#030H ;33 32 31 30H
MOV R7,#04D
MASLOOP: MOV A,@R0
MOV SBUF,A
MASWA: JBC TI,MASCOM
SJMP MASWA
MASCOM: INC R0
DJNZ R7,MASLOOP
RET
____________________________________________________________________
;接收资料的子程序 STC11F32XE 兼容51单片机 :
MAS: MOV TMOD,#20H ;TIMER 1 MODE2 8 bit auto load
MOV TL1,#0FDH ;9600
MOV TH1,#0FDH
SETB TR1 ;START TIMER 1
MASCON: MOV SCON,#0D0H ;1101 0000B MODE 3, REN=1
;RECEIVE --------------------------------
RDATA:
MOV R0,030H ;RECEIVE DATA STORE TO 33 32 31 30H
MOV R7,04D
CLR SM2
SLVSR3: JBC RI,SLVSR4 ;IF RI SET JMP TO SLVSR4
SJMP SLVSR3
SLVSR4:
SLVRIG: MOV A,SBUF
MOV @R0,A
INC R0
DJNZ R7,SLVSR3
RET
51单片机通信问题
全部回复(5)
正序查看
倒序查看
现在还没有回复呢,说说你的想法
@ppeter
问题找到,接收资料的子程序忘了加上“#”谢谢!MOVR0,#030H;33323130HMOVR7,#04D
STC12C5410AD 和 STC11F32AD 是8051的兼容单片机 我再做了查询方式和中断方式的实验 发现很奇怪的现象 STC11F32AD在中断方式时是正确的其他都不行 到底是怎么回事?以下是查询方式和中断方式的程序 请大家帮帮忙 非常感谢!
STC12C5410AD:
98 80 98 80 9E 80 80 80 86 80 F8 80 FE 80 E0 80 E6 80 18 00 1E 00
STC11F32AD:
0A 0B 0A 0B 08 09 0E 0F 0C 0D 02 03
JMP MAIN
ORG 30H
MAIN:
MOV SP,#070H
MOV SCON,#050H ;控制状态字
MOV TMOD,#020H ;T1作波特率发生器
MOV TH1,#0FDH ;选定波特率 9600
MOV TL1,#0FDH
SETB TR1
SETB EA ;开串行口中断
SETB ES
CLR TI
;1. 查询方式:
MOV R0,#00
TRAM: MOV A,R0 ;取数据
XRL A,#10D
JZ ENDD
MOV SBUF,A ;发送一个字符
WAIT: JBC TI,NEXT ;等待发送结束
SJMP WAIT
NEXT: INC R0 ;准备下一次发送
SJMP TRAM
ENDD: NOP
NOP
SJMP ENDD
END
----------------------------------------------------------
STC12C5410AD:
00 06 00 18 00 1E 00 60 00 66 00 78 00 7E 00 80 80 86 80 98 80
STC11F32AD:
00 01 02 03 04 05 06 07 08 09 0A ( 这个是正确的 )
JMP MAIN
ORG 0023H ;串行口中断入口
AJMP SINT
ORG 30H
MAIN:
MOV SP,#070H
MOV SCON,#050H ;控制状态字
MOV TMOD,#020H ;T1作波特率发生器
MOV TH1,#0FDH ;选定波特率 9600
MOV TL1,#0FDH
SETB TR1
SETB EA ;开串行口中断
SETB ES
CLR TI
;2.中断方式:
TRAM: MOV R0,#00
MOV A,R0 ;取数据
MOV SBUF,A ;发送第一个字符
H:
SJMP H ;其它工作
SINT: CLR TI ;中断服务程序
XRL A,#10D
JZ HH
INC R0
MOV A,R0 ;取数据
MOV SBUF,A ;发送下一个字符
HH:
RETI
END
STC12C5410AD:
98 80 98 80 9E 80 80 80 86 80 F8 80 FE 80 E0 80 E6 80 18 00 1E 00
STC11F32AD:
0A 0B 0A 0B 08 09 0E 0F 0C 0D 02 03
JMP MAIN
ORG 30H
MAIN:
MOV SP,#070H
MOV SCON,#050H ;控制状态字
MOV TMOD,#020H ;T1作波特率发生器
MOV TH1,#0FDH ;选定波特率 9600
MOV TL1,#0FDH
SETB TR1
SETB EA ;开串行口中断
SETB ES
CLR TI
;1. 查询方式:
MOV R0,#00
TRAM: MOV A,R0 ;取数据
XRL A,#10D
JZ ENDD
MOV SBUF,A ;发送一个字符
WAIT: JBC TI,NEXT ;等待发送结束
SJMP WAIT
NEXT: INC R0 ;准备下一次发送
SJMP TRAM
ENDD: NOP
NOP
SJMP ENDD
END
----------------------------------------------------------
STC12C5410AD:
00 06 00 18 00 1E 00 60 00 66 00 78 00 7E 00 80 80 86 80 98 80
STC11F32AD:
00 01 02 03 04 05 06 07 08 09 0A ( 这个是正确的 )
JMP MAIN
ORG 0023H ;串行口中断入口
AJMP SINT
ORG 30H
MAIN:
MOV SP,#070H
MOV SCON,#050H ;控制状态字
MOV TMOD,#020H ;T1作波特率发生器
MOV TH1,#0FDH ;选定波特率 9600
MOV TL1,#0FDH
SETB TR1
SETB EA ;开串行口中断
SETB ES
CLR TI
;2.中断方式:
TRAM: MOV R0,#00
MOV A,R0 ;取数据
MOV SBUF,A ;发送第一个字符
H:
SJMP H ;其它工作
SINT: CLR TI ;中断服务程序
XRL A,#10D
JZ HH
INC R0
MOV A,R0 ;取数据
MOV SBUF,A ;发送下一个字符
HH:
RETI
END
0
回复
提示
@ppeter
STC12C5410AD和STC11F32AD是8051的兼容单片机我再做了查询方式和中断方式的实验发现很奇怪的现象STC11F32AD在中断方式时是正确的其他都不行到底是怎么回事?以下是查询方式和中断方式的程序请大家帮帮忙非常感谢!STC12C5410AD:988098809E8080808680F880FE80E080E68018001E00STC11F32AD:0A0B0A0B08090E0F0C0D0203 JMPMAIN ORG30HMAIN: MOVSP,#070HMOV SCON,#050H;控制状态字 MOVTMOD,#020H;T1作波特率发生器MOV TH1,#0FDH ;选定波特率9600MOV TL1,#0FDHSETB TR1SETB EA ;开串行口中断SETB ESCLRTI;1.查询方式:MOVR0,#00TRAM:MOVA,R0 ;取数据XRLA,#10DJZENDD MOVSBUF,A ;发送一个字符WAIT:JBCTI,NEXT;等待发送结束SJMPWAITNEXT:INCR0 ;准备下一次发送SJMPTRAMENDD:NOPNOPSJMPENDDEND----------------------------------------------------------STC12C5410AD:00060018001E006000660078007E00808086809880STC11F32AD:000102030405060708090A (这个是正确的)JMPMAINORG0023H;串行口中断入口AJMP SINT ORG30HMAIN: MOVSP,#070HMOV SCON,#050H;控制状态字 MOVTMOD,#020H;T1作波特率发生器MOV TH1,#0FDH ;选定波特率9600MOV TL1,#0FDHSETB TR1SETB EA ;开串行口中断SETB ESCLRTI;2.中断方式:TRAM:MOVR0,#00MOVA,R0 ;取数据MOVSBUF,A ;发送第一个字符H:SJMPH ;其它工作SINT:CLR TI ;中断服务程序XRLA,#10DJZHHINCR0MOVA,R0 ;取数据MOVSBUF,A ;发送下一个字符HH:RETIEND
问题已解决 是晶振用错频率了
0
回复
提示
@ppeter
STC12C5410AD和STC11F32AD是8051的兼容单片机我再做了查询方式和中断方式的实验发现很奇怪的现象STC11F32AD在中断方式时是正确的其他都不行到底是怎么回事?以下是查询方式和中断方式的程序请大家帮帮忙非常感谢!STC12C5410AD:988098809E8080808680F880FE80E080E68018001E00STC11F32AD:0A0B0A0B08090E0F0C0D0203 JMPMAIN ORG30HMAIN: MOVSP,#070HMOV SCON,#050H;控制状态字 MOVTMOD,#020H;T1作波特率发生器MOV TH1,#0FDH ;选定波特率9600MOV TL1,#0FDHSETB TR1SETB EA ;开串行口中断SETB ESCLRTI;1.查询方式:MOVR0,#00TRAM:MOVA,R0 ;取数据XRLA,#10DJZENDD MOVSBUF,A ;发送一个字符WAIT:JBCTI,NEXT;等待发送结束SJMPWAITNEXT:INCR0 ;准备下一次发送SJMPTRAMENDD:NOPNOPSJMPENDDEND----------------------------------------------------------STC12C5410AD:00060018001E006000660078007E00808086809880STC11F32AD:000102030405060708090A (这个是正确的)JMPMAINORG0023H;串行口中断入口AJMP SINT ORG30HMAIN: MOVSP,#070HMOV SCON,#050H;控制状态字 MOVTMOD,#020H;T1作波特率发生器MOV TH1,#0FDH ;选定波特率9600MOV TL1,#0FDHSETB TR1SETB EA ;开串行口中断SETB ESCLRTI;2.中断方式:TRAM:MOVR0,#00MOVA,R0 ;取数据MOVSBUF,A ;发送第一个字符H:SJMPH ;其它工作SINT:CLR TI ;中断服务程序XRLA,#10DJZHHINCR0MOVA,R0 ;取数据MOVSBUF,A ;发送下一个字符HH:RETIEND
问题已解决 是晶振用错频率了
0
回复
提示