高分:51单片机汇编程序,数码管跳动问题

AUXR EQU 8EH
;---------------------------------------------------------------
;定义管脚
;---------------------------------------------------------------
defin:
HC595_SCK BIT P0.4;sbit HC595_SCK = P0^4;
HC595_RCK BIT P0^5;sbit HC595_RCK = P0^5;
HC595_RST BIT P0^6;sbit HC595_RST = P0^6;
HC595_DAT BIT P0^7;sbit HC595_DAT = P0^7;

ORG 0000H
AJMP INIT
ORG 000BH ;定时器0的中断向量地址
AJMP TIME0 ;跳转到真正的定时器程序处
ORG 0030H
;---------------------------------------------------------------
;初始化
;---------------------------------------------------------------
INIT:;MOV P0 ,#0FH;初始化低四位为高电平,使能四位数码管
CLR HC595_RST;HC595的复位端,不能让他复位
ANL PCON,#7FH //波特率不倍速 SMOD=0
MOV SCON,#50H //方式1,8位数据,可变波特率,接收允许
ORL AUXR,#40H
ANL AUXR,#0FEH //定时器1时钟为Fosc,即1T
ANL TMOD,#0FH //定时器1:模式2,8位自动重装模式,用于产生波特率 9600
ORL TMOD,#20H
MOV TL1,#0B2H
MOV TH1,#0B2H
CLR ET1
SETB TR1
CLR ES //关串行中断
CLR PS
; SETB EA
MOV 32H,#2H
MOV 33H,#9H
MOV 34H,#4H
MOV 35H,#0H
MOV R1,#32H
MOV A,@R1
MOV 31H,#00H ;软件计数器预清0
MOV TMOD,#00000001B ;定时/计数器0工作于方式1
MOV TH0,#3CH
MOV TL0,#0B0H ;即数15536
SETB EA ;开总中断允许
SETB ET0 ;开定时/计数器0允许
SETB TR0 ;定时/计数器0开始运行
SETB PT0
;---------------------------------------------------------------
;主函数
;---------------------------------------------------------------
MAIN: ;MOV R2,#250 ;循环250次
SHOW1:
LCALL SENDASC
LCALL RECEIVE
LCALL SHOW1234
;DJNZ R2,SHOW1

JMP MAIN

我想用串口自发自收,每秒更新一次的数据送入串口发送并接收显示,本来没有串口直接显示时,四位数码管显示正常四位常亮,但是,只是加了串口后,数码管前面三位开始跳动闪烁,只有第四位是常亮的,为什么呢
我试了试,也不是数码管显示函数中的延迟的问题,改长改短都会闪烁

第1个回答  2013-06-08
应该是串口收发导致单片机忙不过来,显示就会闪烁,因为你的延时程序是空操作,也占用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++;
}
第2个回答  2013-06-08
串口自发自收,应该直接把 RXD, TXD 相连。

如果,在 RXD TXD 之间,又加入了几个 595,那么,串行的信息,就被 595 截留了。

比如,加上了 2 片 595,
那么,你发送了 3 字节,仅仅能收到一个,其余两个,被 595 中存住了。
第3个回答  2013-06-08
显示是靠延时来动态扫描的,所以很容易会受到其他程序打干扰,你如果用定时器来控制显示就不会出现类似的情况了。串口也用中断模式较好。追问

但是我不用串口直接把数据送到数码管时是正常显示的啊

追答

那是当然,不用串口的时候显示是没有干扰的,但有串行通讯时,要占用时间的,影响到了显示。

本回答被提问者采纳
相似回答