51单片机串口汇编求助;无法通信

51单片机串口汇编求助;无法通信,第1张

ORG 0000H

LJMP START

ORG 0023H

lJMP DISPLAY

ORG 0100H

START:

MOV SCON,#50H //串口方式1,允许接受

MOV TMOD,#21H

MOV TH1, #0FDH //波特率为9600B/s

MOV TL1, #0FDH

SETB EA

SETB ES

SETB TR1

WAIT:

JMP WAIT

DISPLAY:

JNB RI,DISRET

CLR RI

MOV A,SBUF

MOV SBUF, A

JNB TI,$

CLR TI

DISRET:

RETI

END

#include <REG52H>

#define uchar unsigned char

#define uint unsigned int

sbit ring=P3^7;

sbit CASE1=P2^0;

sbit CASE2=P2^1;

sbit CASE3=P2^2;

sbit CASE4=P2^3;

uchar se=0,re=0;

uchar temp=0;

void wait(uint cnt)

{

while(--cnt);

}

//串口发送程序

void send(uchar se)

{

SBUF=se; //发送数据

while(TI == 0);

TI = 0;

}

//串口接收程序

uchar receive(void)

{

re=SBUF; //接收数据

while(RI==0);

RI=0;

return re;

}

//串口初始化

void sinti(void)

{

SCON = 0x50;

TMOD |= 0x20;

TH1 = 0xFD;

TR1 = 1;

EA = 1;

ES = 1;

}

void delay(int cnt)

{

while(--cnt);

}

//主程序

int main (void)

{

int i;

sinti(); //串口初始化程序

ring=1;

while(1)

{

while (1)

{

if(CASE1==0)

{

send('a');

ring=0;

break;

}

if(CASE2==0)

{

send('b');

ring=0;

break;

}

if(CASE3==0)

{

send('c');

ring=0;

break;

}

if(CASE4==0)

{

send('d');

ring=0;

break;

}

}

if(ring==0)

{

wait(60000);

ring=1;

}

for(i=0;i<10000;i++);

}

}

//串口中断程序

void UART_SER (void) interrupt 4 //串行中断服务程序

{

if(RI) //判断是接收中断产生

{

RI=0; //标志位清零

temp=SBUF;

}

if(TI) //如果是发送标志位,清零

TI=0;

}

应该是串口收发导致单片机忙不过来,显示就会闪烁,因为你的延时程序是空 *** 作,也占用CPU,建议你用定时中断做显示程序,中断时间定在5ms就可以了,这个定时器可以通过计数干很多其他事,比如500ms干一次。这样就不用CPU做空 *** 作干等了。

给你贴一个我写的显示程序(在定时中断中调用,这个程序显示两组数据,500ms换一次):

/

函数名称: void Display()

功能描述: 将缓冲区中可显示字符输出到LED

/

#define PIN_SDIN P0_0

#define PIN_ST P0_1

#define PIN_SH P0_2

#define LOC_D1 0x08

void Display(void)

{

unsigned char i,ch,loc;

if(g_disp_location>3) g_disp_location=0; // display one digit every time, total 4 digits

if(g_500ms_count<5) //left or right

ch=G_Disp_Buf1[g_disp_location]; //left

else

ch=G_Disp_Buf2[g_disp_location]; //right

loc=LOC_D1; // D1 position,P0_3-P0_6 located D1-D4

for(i=0;i<g_disp_location;i++) loc <<=1;

P0 &=0x87; // P0_3-6 clear, disable display

PIN_ST=0;

for(i=0;i<=7;i++) // output one character

{

PIN_SH=0;

if((ch&0x80)==0) PIN_SDIN=0;

else PIN_SDIN=1;

ch <<=1;

PIN_SH =1;

}

PIN_ST=1; // character ready

P0 |=loc; // set D1,D2,D3 or D4 ,enable display

g_disp_location++;

}

以上就是关于51单片机串口汇编求助;无法通信全部的内容,包括:51单片机串口汇编求助;无法通信、51单片机串口通信c语言编程、高分:51单片机汇编程序,数码管跳动问题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9314598.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存