📄 overtime.c
字号:
/* overtime.c */
/* 在串口通信中使用超时控制 */
/*----------------------------------------- 预编译及变量声明部分 -----------------------------------------*/
#ifndef __OVERTIME_C__
#define __OVERTIME_C__
#include <AT89X51.H>
void led_error();
void led_ok();
bit cancel_tag; // 定义"取消等待"标志位
unsigned char count; // 定时器溢出计数
void main()
{
/*----------------------------------------- 初始化部分 -----------------------------------------*/
cancel_tag = 0; // 初始化"取消等待"标志位
count = 0; // 初始化定时器溢出计数
/* 定时0初始化 */
TMOD = 0x21; // 设置T0为定时模式,工作模式1,无门控位,设置T1为工作方式2,用于串口波特率设定
TH1 = 0x4C; // 为T0填入初值,定时时间50ms
TL1 = 0x1A;
TR1 = 0; // 暂时禁止计时
ET0 = 1; // 允许定时器0中断
/* 串口初始化 */
TH1 = 250; // 设置T1初值
TL1 = 250;
TR1 = 1; // 开始计时
PCON = 0x80; // SMOD = 1
SCON = 0x50; // 工作方式1,波特率9600bps,允许接收
ES = 0; // 查询方式,禁止串口中断
EA = 1; // 开放中断
/*----------------------------------------- 数据处理部分 -----------------------------------------*/
/* 发送握手信号 */
SBUF = 0x05;
while(!TI); // 等待数据发送完成
TI = 0; // 清发送标志位
TR0 = 1; // 定时器0开始计时
/* 接收信号 */
RI = 0;
while(1) // 反复循环
{
while(!RI)
{
if(cancel_tag == 1) // 发生超时错误
{
TR0 = 0; // 定时器T0停止计数
led_error(); // 点亮"超时错误"指示灯
while(1); // 死循环
}
}
/* 接收到数据,进行数据处理 */
if(SBUF == 0x02) // 接收到的数据为应答信号0x02跳出循环
break;
/* 如果接收数据不是握手应答,丢弃当前数据,重新接收下一字节 */
RI = 0;
count = 0; // 在继续接收数据前,重新计时
TH1 = 0x4C;
TL1 = 0x1A;
}
/* 握手成功 */
TR0 = 0; // 定时器T0停止计数
led_ok(); // 点亮"通信成功"指示灯
while(1); // 死循环
}
/*----------------------------------------- 中断服务程序部分 -----------------------------------------*/
/* T0溢出中断处理函数 */
void timer0_int() interrupt 1 using 2 // T0溢出中断,使用工作组2
{
count++; // 溢出计数加1
if(count < 60) // 计时不足3s,重新设置初值后中断返回
{
TH1 = 0x4C; // 为T0填入初值,定时时间50ms
TL1 = 0x1A;
return;
}
/* 进行超时处理 */
cancel_tag = 1; // 设置"取消等待"标志位
count = 0; // 重新计时
TH1 = 0x4C;
TL1 = 0x1A;
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -