c8051f020的串口问题

来源:百度知道 编辑:UC知道 时间:2024/06/03 13:06:25
#include "C8051F020.inc"

ORG 0000H
AJMP START

START:
MOV XBR0,#00000100B
MOV XBR1,#11100000B
MOV XBR2,#11000000B
CLR EA
MOV WDTCN,#0DEH
MOV WDTCN,#0ADH
SETB EA
MOV P0MDOUT,#0FFH

FASONG:
MOV OSCXCN,#67H
LCALL YS
KK:
MOV A,OSCXCN
JNB ACC.7,KK
MOV OSCICN,#08H

MOV SADDR0,#90H
MOV SADEN0,#0FFH
MOV CKCON ,#0010000B; // 定时器用SYSCLK作基准时间
MOV PCON ,#80H
MOV SCON0,#01000000B ;方式1
MOV RCAP2H,#0FFH
MOV RCAP2L,#0B8H
MOV TL2,#0B8H
MOV TH2,#0FFH
MOV T2CON,#00110100B ;

MOV A,#01H
MOV SBUF0,A
JNB TI,$
CLR TI
AJMP $

这是我调试用的一个串口的程序,用PC的串口调试工具接受
可收到的数是不正确的,我个人觉得是波特率或交叉那设置的
不对,但实在不知道是哪出错了,请各位帮我找一下可以吗(我现在就会汇编。。。。。。)

有的时候,发送别的数,调试工作一直在接受00。哪位告诉可以告诉我下阿,特别感谢

还有就是,用的22.1184的晶振.9600的波特率

比较专业啊

完全看不懂呀

汇编不懂 给你一个我的c的参考程序

void serial_int(void) interrupt 4
{
if(RI)
{
RI=0;
switch(SBUF)
{
case 0x01:
P1&=0x7f;
SBUF='t';
break;
case 0x02:
P2&=0xfe;
SBUF='t';
break;
}
}
if(TI)
TI=0;
return;
}
//-------------------------------------------------------------
void main(void)
{
ES=1;
SCON=0x50;
RCAP2H=0xFF;
RCAP2L=0xd9;/*晶振12M 波特率9600*/

T2CON=0x34;
EA=1;
P1=0xff;
P2=0xff;
while(1){};
}

我仔细看了下,程序没问题。(延时的子程序"YS"你应该在别处定义了)
可能存在如下问题:
1。你确信串口的发送和接收是接的P0.0和P0.1吧?
2。单片机串口要经过max232之类的接口转换芯片才可以接电脑的,估计你不会不知道的吧?
3。单片机这边的发送(TX,即P0.0),经过接口转换后,要接电脑的接收(DB9-M)的第2脚,这个没错吧?
4。max232芯片电容都配对了吧?否则容易产生不了正/负高压或者不太够。
5。串口线你应该没有很长吧?9600,传个十几米没问题的,如果接口芯片使用得当,再远也是可以的。
6。最后说最有可能的一点:2