高分: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
显示是靠延时来动态扫描的,所以很容易会受到其他程序打干扰,你如果用定时器来控制显示就不会出现类似的情况了。串口也用中断模式较好。追问

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

追答

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

本回答被提问者采纳

高分:51单片机汇编程序,数码管跳动问题
应该是串口收发导致单片机忙不过来,显示就会闪烁,因为你的延时程序是空操作,也占用CPU,建议你用定时中断做显示程序,中断时间定在5ms就可以了,这个定时器可以通过计数干很多其他事,比如500ms干一次。这样就不用CPU做空操作干等了。给你贴一个我写的显示程序(在定时中断中调用,这个程序显示两组数据...

51单片机按键时,数码管会闪烁一下.原因是什么
原因很简单,这是代码和数码管驱动的问题 按键会影响数码管显示,这是单片机直接驱动数码管会出现的问题,而数码管则是工作在动态扫描方式的,若是采用带有锁存器件的数码管驱动,则不会出现此类现象,因为单片机是周期性的扫描工作方式,单片机直接驱动数码管的电路,当单片机扫描到按键的时候,数码管部分...

51单片机数码管显示不停闪烁?
你显示的时候,先显示分,仅仅显示几个毫秒,之后,就显示秒。秒,显示几个毫秒,之后,没有消隐,一直显示到下次调用显示程序。所以,秒,显示稳定,分,一闪就没了。

请教高手,用51单片机独立按键控制数码管数字加减,为什么在按下独立按...
1、改进按键扫描 2、改进数码管显示 3、用嵌入式系统 以上三选一即可解决

51单片机如何让一个数码管闪烁而其他数码管一直保持亮的状态不受影响...
\/\/5种模式4个数码管,所以表格为5*4 \/\/4个0表示4个数码管都可以正常亮 void display(uint m,uchar mode )\/\/4位显示子程序 带某位闪烁功能 \/\/mode=0,都不闪烁 mode=1 千位闪烁 mode=2 百位闪烁 mode=3 十位闪烁 mode=4 个位闪烁 \/\/mode=5 全部闪烁 { uchar a1,a2,a3,a4;staic ia...

51单片机大神来看看,程序很不稳定,尤其是6,A,E,喜欢闪,变成一。是共阴...
如: if(key!=0xf0){ return 1; //返回后下面的代码不可能被执行 delay(20);P3=0xf0;if(key!=0xf0)return 1;else return 0;} case 0xee:return 0;break;case 0xde:return 1;break;有return后break是不用的 像这种程序应该把他们分时扫描,确宝不管程序怎么增加代码,显示的时间都不变...

51单片机如何控制LED数码管循环左移?
51单片机数码管循环左移是指将一个多位数的二进制数据在二进制数码管中进行左移操作,从而实现数字的循环移位。具体来说,可以按照以下几个步骤实现:1定义一个变量存储待移位的数值,并将其转换为二进制数形式。2将二进制数码管的对应端口输出全部清零。3利用位运算符 << 将数值向左移动一位,并将...

单片机数码管闪烁现象
1、你的程序太过复杂,而且没有一点层次感,最起码的编程习惯都没有(缺少注释)2、采用动态扫描的方法,有两个极端要考虑下 如果时间太长,则显示的字符是一个一个的显示 如果时间太短,就会出现你说的那种现象 只有在适当的时间内,利用人眼的视觉滞留效应,才可以感觉到显示“正常”关于此问题,你...

用51单片机做一个键盘,按一下数码管加1,可是无论我怎么消抖动,总是有...
你可以在去抖程序里加入检测松手程序例如 ………if(!key) \/\/检测键盘是否按下 delay():\/\/去抖延时一般是50ms if(!key)\/\/再次检测键盘是否按下 ×××++: \/\/这里写数码管加"1"程序 while(key);\/\/加入写句,目的是等待key变为原来的状态才会执行下一条指令!希望可以帮到你!

用51单片机和ADC0809做电压表如图连接能仿真,为什么焊接出来有错,数码...
根据你的描述,我个人作出如下判断:1、有可能是你的程序写的有误,仿真是一回事,真正运行是另一回事。2、如果你是完全按照图上焊接的,你这个板子其实是不稳定的,为什么呢,因为单片机直接驱动数码管是不够力的,虽然你用的是P0口,但是驱动数码管也很费力,如果你需要帮忙,可以百度Hi联系我 ...

相似回答
大家正在搜