在上位机上用串行口调试助手发送一个字符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);
}