请教单片机的定时器0和串口的问题只有20多行代码

来源:百度知道 编辑:UC知道 时间:2024/09/23 10:27:28
#include "Atmel/AT89X51.h"
#define unchar unsigned char
unchar num;

void time0interrupt(void) interrupt TF0_VECTOR
{
TH0 = 0x00;
TL0 = 0x00;
num++;
}

main()
{
SCON =0x50; // UART工作于模式1, REN=1
TMOD =0x21 ; // Timer1 工作于模式2, Timer0 工作于模式1

TH1 = 0xFE; // 波特率9600 Bds at 7.3728MMHz
TL1 = 0xFE; // 波特率9600 Bds at 7.3728MMHz
TH0 = 0x00;
TL0 = 0x00;

EA=1; // 全局中断使能
ET0=1; // T0中断允许
ES=1; // 串口中断使能
TR0=1; // 启动Timer0
TR1=1; // 启动Timer1

num=0;
while(1)
{
if(num==10)
{
SBUF=num;
while(TI==0);
TI=0;
num=0;
}
}
}

为什么以上代码不能使得单片机从串口发出数据(发送一个就不发了)

而以下的代码却可以每秒种从串口发出一字节数据?

#include "Atmel/AT89X51.h"
#define unchar unsigned char
unchar num;

void time0inter

看起来确实没什么问题。
但有一个小问题:你的程序并没有用到串口中断(你没有写串口中断服务程序),为什么要“ES=1; // 串口中断使能”?很有可能发送了一个以后的“串口中断”使程序跑飞了。

我对单片机是个外行,但据两段程序的区别可以知道下面一段是发送数据的代码。
if(num==10)
{
SBUF=num;
while(TI==0);
TI=0;
num=0;
}

在外面的大循环中,如果num++没有执行,则该if语句的条件永远不会成立,所以发不了数据,即num一直等于0。

随感:现在单片机的底层封装做得很好嘛,写代码也比较简单移动哈!

第二个程序 在 定时器中断 里面 发送了数据
也就是每隔一段时间 单片机定时器中断一次 就发送了一次数据

if(num==10)
{
SBUF=num;
while(TI==0);
TI=0;
num=0;
}