- ;
- ;
- 主循环结构:
- void main (void)
{
McuInitial ();
while(1)
{
UartSendByteData(0xFF,20);
}
} - 外部中断0结构:
- void Ext0Interrupt (void) interrupt 0
{
EX0 = 0;
SBUF = 0x55;
while(!TI);
TI = 0;
EX0 = 1;
} - McuInitial ()的定义:
- void McuInitial (void)
{
TMOD = 0x21; //0010 0001 GATE C1/T1 M1 M0 GATE C0/T0 M1 M0
TH1 = BAUD9600;
TL1 = BAUD9600;
PCON = 0x80; //SMOD1 SMOD0 BOF POF GF1 GF0 PD IDL SMOD1 = 1 9600bps
SCON = 0x58;//0x50; //0101 0000 SM0 SM1 SM2 REN TB8 RB8 TI RI SM2 = 0
TR1 = 1;
TH0 = 0x00;
TL0 = 0x00;
ET0 = 1;
TR0 = 1;
IT0 = 1;//下降沿触发
EX0 = 1;//enable
EA = 1;
} - UartSendByteData()的定义:
- void UartSendByteData (uchar DataByte,uchar GapTimeMs)
{
SBUF = DataByte;
while(!TI);
TI = 0;
DebugDlyMs = GapTimeMs; //DebugDlyMs 在T0中减1至0
while(DebugDlyMs);
} - 计数器0的操作:
- void timer0 (void) interrupt 1
{
TH0 = TIMER_1MS_H; //定时时间1ms,计数值重装.
TL0 = TIMER_1MS_L;
if(DebugDlyMs)
{
DebugDlyMs--;
}
} - 上面出现的问题是:
- 在进入外部中断0中的串口操作后,发现主循环的中断操作不能进行了,程序会停在上面的红色处.此时只有中断0的串口操作才行.
- 通过进入反汇编观察,原来原因是这样的:
- 当主循环通过串口正在发送数据时,如果此时发生外部中断0,也会发生串口发送数据的操作,操作完成后,会将SBUF清空,在程序从外部中断0返回后,由于SBUF没有数据,串口不再发送,TI也不再会变1,从而在上面的红色处一直等待.
- 正确的做法是:
- void UartSendByteData (uchar DataByte,uchar GapTimeMs)
{
EA = 0;
SBUF = DataByte;
while(!TI);
TI = 0;
EA = 1;
DebugDlyMs = GapTimeMs;
while(DebugDlyMs);
}
串口操作中的一个错误
最新推荐文章于 2024-09-05 10:35:04 发布