c语言单片机在上位机

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

#include <reg52.h>

#define FOSC 11059200L   // 单片机晶振频率
#define BAUD 4800        // 串口波特率
#define TIMER_TH 0x2C    // 定时器初值,计算方法: (65536-(1.5s*FOSC/12))

void InitUART(void);
void SendByte(unsigned char c);
void InitTimer1(void);

void main()
{
    unsigned char c;
    InitUART();
    InitTimer1();
    while (1) {
        // 接收字符
        while (!RI); // 等待接收完成
        c = SBUF;
        RI = 0; // 清除接收标志位

        // 延时1.5s
        TH1 = TIMER_TH >> 8;
        TL1 = TIMER_TH & 0xFF;
        TR1 = 1;  // 启动定时器1
        while (!TF1); // 等待计时完成
        TR1 = 0;   // 停止定时器1
        TF1 = 0;   // 清除计时器1溢出标志位

        // 发送数据
        SendByte('H');
        SendByte('E');
        SendByte('L');
        SendByte('L');
        SendByte('O');
    }
}

void InitUART(void)
{
    // 配置波特率
    TMOD &= 0x0F;
    TMOD |= 0x20;
    TH1 = 256 - FOSC / 12 / BAUD;
    TL1 = TH1;
    TR1 = 1;

    // 配置中断
    ES = 0;     // 禁止串口中断
    EA = 1;     // 开启总中断使能
    RI = 0;     // 清除接收标志位
    TI = 0;     // 清除发送标志位

    // 配置串口
    SCON = 0x50;    // 模式1,8位数据,可变波特率
}

void SendByte(unsigned char c)
{
    SBUF = c;
    while (!TI); // 等待发送完成
    TI = 0; // 清除标志位
}

void InitTimer1(void)
{
    TMOD &= 0x0F; // 设置为定时器模式
    TMOD |= 0x10;
    ET1 = 0;      // 禁止定时器1中断
}

可以参考 基于STC89C52单片机定时器代码如下


#include <reg52.h>

#define BAUDRATE 4800   // 串口波特率
#define TIMERVAL 4608   // 定时器初值,计算方法为 1.5s / 12us = 125000,125000 - 65536 = 4608

void init_serial() {
    TMOD |= 0x20;   // 定时器1工作在模式2(8位自动重装)下
    TH1 = 256 - (11059200 / 12 / BAUDRATE);   // 设置波特率,计算方法为 11059200 / 12 / 波特率
    TL1 = TH1;
    TR1 = 1;    // 启动定时器1
    SCON = 0x50;    // 串口工作在模式1(8位异步收发,波特率可变)下
    EA = 1;     // 开启总中断
    ES = 1;     // 开启串口中断
}

void send_char(unsigned char ch) {
    SBUF = ch;
    while (!TI);    // 等待发送完成
    TI = 0;     // 清除发送完成标志位
}

void timer1_isr() interrupt 3 {
    static unsigned int count = TIMERVAL;  // 定时器计数器
    if (--count == 0) {
        count = TIMERVAL;   // 重置计数器
        send_char('H');
        send_char('E');
        send_char('L');
        send_char('L');
        send_char('O');
    }
}

void main() {
    init_serial();
    while (1);
}