⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 overtime.c

📁 mifirl卡读卡程序
💻 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 + -