#include <reg52.h>
#include <intrins.h>
void main(void)
{
SCON = 0x40;
TMOD = 0x20; // 定时器1 的8位自动重载模式
TH1 = TL1 = 0xfe; // 9600
TR1 = 1;
SBUF = 'A';
while(TI==0);
TI = 0;
// while(1);
}
问一下这个程序 为什么会重复执行?
这个是keil反汇编
C:0x0000 02001A LJMP C:001A
4: void main(void)
5: {
6: SCON = 0x40;
C:0x0003 759840 MOV SCON(0x98),#0x40
7: TMOD = 0x20; // 定时器1 的8位自动重载模式
C:0x0006 758920 MOV TMOD(0x89),#0x20
8: TH1 = TL1 = 0xfe; // 9600
C:0x0009 758BFE MOV TL1(0x8B),#0xFE
C:0x000C 758DFE MOV TH1(0x8D),#0xFE
9: TR1 = 1;
C:0x000F D28E SETB TR1(0x88.6)
10: SBUF = 'A';
C:0x0011 759941 MOV SBUF(0x99),#0x41
11: while(TI==0);
C:0x0014 3099FD JNB TI(0x98.1),C:0014
12: TI = 0;
13: // while(1);
C:0x0017 C299 CLR TI(0x98.1)
14: }
C:0x0019 22 RET // 问题就是这个为什么会 给main 也弄了一个ret 因为没有压栈 那么出来的就是0000H ??????这个就是问题!!!!和用户程序设计的想法不一致啊!
C:0x001A 787F MOV R0,#0x7F
C:0x001C E4 CLR A
C:0x001D F6 MOV @R0,A
C:0x001E D8FD DJNZ R0,C:001D
C:0x0020 758107 MOV SP(0x81),#0x07
C:0x0023 020003 LJMP main(C:0003)
在线求解! |