在上位机上用串行口调试助手发送一个字符

单片机求解:
在上位机上用串行口调试助手发送一个字符A,单片机收到字符后,1.5s后返回给上位机"HELLO”,要求1.5s用定时器实现,串行口波特率设为4800bps,设晶振11.0592MHz。

这个问题需要涉及到单片机的具体型号和开发环境,这里提供一个基于STC89C52单片机和Keil开发环境的示例程序供参考:

#include <reg52.h>
// 定时器初值
#define TIMER_VALUE 65536 - 46080
// 串口波特率
#define BAUDRATE 4800
// 计算定时器初值
#define TIMER_VALUE_Hi (TIMER_VALUE / 256)
#define TIMER_VALUE_Lo (TIMER_VALUE % 256)
// 定义串口发送函数
void uart_send(char ch)
{
    SBUF = ch;
    while(!TI);
    TI = 0;
}
// 定时器计数值
unsigned int timer_count = 0;
// 定时器中断处理函数
void timer_isr() interrupt 1
{
    TH0 = TIMER_VALUE_Hi;
    TL0 = TIMER_VALUE_Lo;
    timer_count++;
}
// 主函数
void main()
{
    // 定时器初始化
    TMOD = 0x01; // 定时器0,模式1
    TH0 = TIMER_VALUE_Hi;
    TL0 = TIMER_VALUE_Lo;
    TR0 = 1; // 启动定时器
    ET0 = 1; // 允许定时器中断
    EA = 1; // 允许总中断
    // 串口初始化
    PCON = 0x80; // 波特率加倍
    SCON = 0x50; // 8位数据,允许接收
    TMOD &= 0x0F; // 定时器1,模式2
    TH1 = 256 - (11059200 / 12 / 16 / BAUDRATE);
    TL1 = TH1;
    TR1 = 1; // 启动定时器1
    while(1)
    {
        // 监听串口接收
        if(RI)
        {
            RI = 0;
            if(SBUF == 'A')
            {
                // 等待1.5s
                timer_count = 0;
                while(timer_count < 3000);
                // 发送"HELLO"
                uart_send('H');
                uart_send('E');
                uart_send('L');
                uart_send('L');
                uart_send('O');
            }
        }
    }
}
这个程序的主要流程是:


定义定时器初值和波特率;

定义串口发送函数;

定义定时器中断处理函数,每当定时器溢出时增加计数器;

初始化定时器和串口,并启动定时器;

不断监听串口接收,如果接收到字符A,则等待1.5s并发送"HELLO"。
需要注意的是,定时器的初值是根据晶振频率和定时器模式计算得到的,本例中使用的是11.0592MHz的晶振和定时器模式1,计算得到的初值为46080。另外,在等待1.5s时需要使用一个计数器来记录定时器溢出的次数,每个溢出时间为50us,因此需要等待3000次溢出才能达到1.5s的时间。