stc单片机串口调试的小程序,但是在串口调试助手里,显示接收不到数据,希望大虾们帮忙解决下,下面是程序

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了stc单片机串口调试的小程序,但是在串口调试助手里,显示接收不到数据,希望大虾们帮忙解决下,下面是程序相关的知识,希望对你有一定的参考价值。

ORG 0000H
LJMP MAIN
ORG 1000H
MAIN: MOV P1,#0FFH
MOV P2,#0FFH
MOV TMOD,#20H ;设置波特率为9600,串口发送方式为1
MOV TH1,#0FBH
MOV TL1,#0FBH
MOV PCON,#00H
MOV SCON,#58H
SETB TR1
SETB EA ;开中断
SETB ES
SEND: MOV A,#0FFH
MOV SBUF,A
JBC TI,SEND
END

你先看看串口线有没问题:

将串口的2、3脚两根针短接,用键盘在串口调试输入字符,如果串口调试接收区能够显示输入的字符,说明串口工作正常
等我再看看程序

我觉得这儿有问题 JBC TI,SEND
JBC在T1为0的时候,会顺序执行,然后就end了 ,这里我觉得应该改为等待发送结束的指令

JNB T1, $追问

我试试···

追答

完事记得采纳我

追问

还是不对,并且我把单片机上的p3.0和p3.1短接后,发现串口调试助手的发送的数据和收到的数据部一样,而且我发送的是一个数据,为何串口调试助手一直在接收单片发来的数据(数据很多)!并且,当我把板子上的电源关掉后,串口线不短接,串口调试助手发送数据,仍然可以收到数据,电源打开就不行了!求解!

参考技术A 大哥,啥年代啦,还用汇编。我汇编看不太懂,你调用send了吗。你如果要C语言的,我能给你写个 参考技术B 用十六进制发送追问

这发的就是十六进制呀?

我用delphi和单片机进行串口通信,在串口调试助手里通过,但实际硬件通讯时,不能接收数据。

procedure TForm1.FormCreate(Sender: TObject);
begin
MSComm1.CommPort:=1;
MSComm1.Settings:='9600,n,8,1';
MSComm1.InBufferCount:=0;
MSComm1.InputLen:=0;
MSComm1.InputMode:=ComInputModeBinary; //ComInputModeText
MSComm1.RThreshold:=1;
// MSComm1.PortOpen:=true;
end;

procedure TForm1.Button4Click(Sender: TObject);
var
send:olevariant;
count,i:integer;
begin
count:=1;
send:=vararraycreate([0,count-1],varbyte);
for i:= 0 to count-1 do
send[i]:=10;
if MSComm1.PortOpen=false then
MSComm1.PortOpen:=true;
MSComm1.Output:=send;
end;

procedure TForm1.MSComm1Comm(Sender: TObject);
var
recstr:Olevariant;

begin
if MSComm1.CommEvent=2 then
begin
recstr:=MSComm1.Input;
end;
edit1.Text:=inttostr(recstr[0]);
//edit2.Text:=inttostr(recstr[1]);
//edit3.Text:=inttostr(recstr[2]);
//edit4.Text:=inttostr(recstr[3]);
end;

单片机得程序如下,用的是atmega16l,晶振是4M
#include <iom16v.h>
#include <macros.h>

unsigned char dat[4]=0,0,255,255;//0,0,0xA,
unsigned char temp;

void port_init(void)

PORTA = 0x00;
DDRA = 0x00;
PORTB = 0x00;
DDRB = 0x00;
PORTC = 0x00; //m103 output only
DDRC = 0x00;
PORTD = 0xFF;
DDRD = 0x02;


//UART0 initialize
// desired baud rate: 9600
// actual: baud rate:9615 (0.2%)
void uart0_init(void)

UCSRB = 0x00; //disable while setting baud rate
UCSRA = 0x02;
UCSRC = BIT(URSEL) | 0x06;
UBRRL = 0x33; //set baud rate lo
UBRRH = 0x00; //set baud rate hi
UCSRB = 0x98;


void uart0_send(unsigned char i)

while(!(UCSRA & (1<<UDRE)));
UDR=i;


void str_send(unsigned char *s)

while(*s)

uart0_send(*s);
s++;



#pragma interrupt_handler uart0_rx_isr:iv_USART0_RXC
void uart0_rx_isr(void)

//uart has received a character in UDR
temp=UDR;


//call this routine to initialize all peripherals
void init_devices(void)

//stop errant interrupts until set up
CLI(); //disable all interrupts
port_init();
uart0_init();

MCUCR = 0x00;
GICR = 0x00;
TIMSK = 0x00; //timer interrupt sources
SEI(); //re-enable interrupts
//all peripherals are now initialized


//
void main(void)

unsigned char i;
init_devices();
//insert your functional code here...
while(1)

if(temp==0x0A)

SREG=0;
for(i=0;i<4;i++)
uart0_send(dat[i]);

temp=0;
SEI();
//while(1);


再调一下单片机的BAUD因子,因为PC的BAUD比较准,单片机不太准,容易误码,再有就是尽量下调波特率,从1200开始试 参考技术A 你的晶振不是接上就可以了,而且还要设置AVR单片机的熔丝位,使单片机支持你的晶振才行,(AVR默认的时钟是内部8M RC振荡电路,而且振荡电路不精确,用于串口会出现错误),硬件的时钟电源和复位电路都要再检查检查

以上是关于stc单片机串口调试的小程序,但是在串口调试助手里,显示接收不到数据,希望大虾们帮忙解决下,下面是程序的主要内容,如果未能解决你的问题,请参考以下文章

我用delphi和单片机进行串口通信,在串口调试助手里通过,但实际硬件通讯时,不能接收数据。

使用RTT代替UART,把你的JLink变成串口调试助手~

用Tkinter实现一个串口调试助手

51系列单片机与PC端串口调试助手进行串口通信

为啥用串口调试助手和pic单片机相连发的指令都没有反应呢。

STC单片机利用scanf和printf串口输入输出调试测试