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单片机汇编程序,数码管跳动问题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)