很少看到有资料写如何以中断的方式发送一帧数据,如果以等待的发送数据帧,对高速运行的单片机来说是很浪费时间的,下面就介绍一种使用中断方式发送数据帧,操作平台采用51 mcu
首先定义一个数据帧的结构体,该结构体可以做为一个全局变量,所有的发送都要经过这个结构体:
//结构体
struct {
char busy_falg;//忙标志,若在发送数据时置位1,即在开始发送置位1,发送结束置位0
int index;//索引,指向需要发送数组的位置
int length;//整个数据帧的长度
char *buf;//指向需要发送的数据帧,建议为全局变量,否则一旦开始发送,必须等到发送结束,即判断busy_falg为0
} send_buf;
发送数据的函数,这里有个缺点,就是还是要使用while来检测串口是否忙碌,不过这样比占用系统时间来发送要好的多了:
//发送一帧
void SendBuf(char *buf,int length)
{
while(busy_falg);//查询发送是否忙,否则循环等待
send_buf.length = length;
send_buf.index = 0;
send_buf.buf = buf;
send_buf.busy_falg = 1;
SBUF = send_buf.buf[0];//写入SBUF,开始发送,后面就自动进入中断发送
}
串口中断发送函数,注意设置空闲标志位,避免多任务时多个发送帧调用了同一个结构体:
void SerialInt() interrupt 4 //串口中断
{
if(RI == 1) //串口接收
{
RI = 0;
}
else if(TI == 1)//串口发送
{
TI = 0;
send_buf.index++;
if(send_buf.index == send_buf.length)
{
send_buf.busy_falg = 0;//发送结束
return;
}
SBUF = send_buf.buf[send_buf.index];//继续发送下一个
}
}
串口中断发送就是这样简单,注意busy_falg和index的使用。
关键字:51单片机 串口中断 发送数据帧
引用地址:
基于51单片机的串口中断发送数据帧
推荐阅读最新更新时间:2024-11-11 14:40
51单片机实现智能泊车系统的设计方法
本文主要讲述用51单片机实现智能泊车系统,该智能泊车系统可以在实验室内实现小车的自动驶入指定停车位的功能。将小车停在停车场入口处,然后车主可以离开小车,此时小车就可以根据停车场内的车辆诱导信号(光源引导信号)将车引入停车场,从而实现自动泊车过程。 随着我国汽车数量逐年急剧增多,泊车位、停车场的数量却跟不上其增长的步伐,越来越多的人为如何泊车而发愁。日益拥挤的泊车环境要求人们对汽车的泊车技术更加地娴熟,这就更加重了人们工作之外的紧张情绪,降低了人们的生活质量。因此,如何解决泊车过程中的不便利,消除安全隐患,迅速、准确、安全地将汽车停靠到合适的位置,逐渐引起了人们的关注。 一、系统的工作原理及功能 智能泊车系统可分为控制部
[单片机]
51单片机之寄存器-3.3单片机串口通信之发送与接收
本节主要讲解单片机的通信。通信主要是指单片机与外界设备交流,也就是通过导线传送或者接收信息。举个例子来说明,你想把仓库A中的货物通过货车配送到仓库B,一共有8个箱子,每辆货车一次只能运送1个箱子。显然,如果只用一辆货车,那么需要8次运送完毕,如果使用8辆货车,那么一次就运送完了。同样,在单片机通信中也是如此。这个货车就是信息传输通道。货车数量越多,传输越快。如果只有一辆货车那么就是串行通信,如果是八辆货车就是并行通信。很明显,货车数量越多,运送的速度越快,但是成本越高。因此根据CPU与外设之间连线结构和数据传送方式的不同,可将通信分为并行通信和串行通信两种基本方式。很容易可以看出并行通信的特点是数据同时传送,速度快,效率高,但成本也
[单片机]
《8051单片机C语言创新教程》笔记 03
GPIO 定时器、计数器与中断 定时器的定义与配置: 计数寄存器由TH 高8位和TL低8位构成 -----------》T/C0 为TH0和TL0--------------》T/C1 为TH1和TL1 M1 M0 工作方式 功能说明 0 0 方式0 13位定时器/计数器 0 1 方式1 16位定时器/计数器 1 0 方式2 自动重载8位定时器/计数器 1 1 方式3 T0分为2个8位独立计数器,T1无方式3 定时器计算初值: 串口:
[单片机]
51单片机的基本功能
单片机的发展先后经历了4位、8位、16位和32位等阶段。8位单片机由于功能强,被广泛用于工业控制、智能接口、仪器仪表等各个领域,8位单片机在中、小规模应用场合仍占主流地位,代表了单片机的发展方向,在单片机应用领域发挥着越来越大的作用。80年代初,Intel公司推出了8位的MCS-51系列的单片机。 51单片机的部件 MCS-51单片机的逻辑部件,包括一个8位CPU及片内振荡器、 80514B掩膜ROM、87514KBEPROM、8031无ROM、特殊功能寄存 器SFR128BRAM、定时器/计数器T0及T1、并行I/O接口:P0、P1、P2、P3;串行接口:TXD、RXD;中断系统:INT0,INT1。 基本功能 1.8位
[单片机]
8051单片机(STC89C52)以轮询方式实现串口通信(51接收数据后发送回PC端)
#include STC89C5xRC.H int main() { char buf; TMOD = 0x21; //设定timer1的工作模式 SCON = 0x50; //设置串行通信格式 TH1 = 0xE6; //设定timer1的初始值 TL1 = 0xE6; TR1 = 1; //开启timer1 while(1) { if(RI == 1) { //如果收到数据 buf = SBUF; RI = 0; SBUF = buf;//将收到的数据发回去 while(TI == 0); //等待数据发送完毕 TI = 0;
[单片机]
MCS-51单片机实用子程序库5
(5) 标号: FDIV 功能:浮点数除法 入口条件:被除数在 中,除数在 中。 出口信息:OV=0时,商仍在 中,OV=1时,溢出。 影响资源:PSW、A、B、R2~R7、位1EH、1FH 堆栈需求: 5字节 FDIV: INC R0 MOV A,@R0 INC R0 ORL A,@R0 DEC R0 DEC R0 JNZ DIV1 MOV @R0,#41H;被除数为零,不必运算 CLR OV RET DIV1: INC R1 MOV A,@R1 INC R1 ORL A,@R1 DEC R1 DEC R1 JNZ DIV2 SETB OV ;除数为零,溢出 RET DIV2: LCALL MVR0 ;将 传送到第一工作区中 MO
[单片机]
51单片机的看门狗是什么
看门狗是用来防止万一单片机程序出错造成重大损失的。 防错的原理很简单,它在硬件上就是一个定时器,当它溢出的时候就会让单片机强制复位使程序重新开始执行。 正常的情况下是不能让它溢出的,所以在程序上每隔一段时间要给他置一次值(俗称喂狗),只要程序中正常给它喂他就不会溢出。 一旦程序跑飞了,有干扰或者进入死循环之类的情况时,不能正常 执行程序 了,那么就永远执行不到喂狗的指令了,但此时定时器是硬件控制的,仍然会走,所以溢出了,单片机就复位了。 一般安全性要求比较高的,系统跑飞了会造成重大事故的都会加一个“狗”保安全。 通常,看门狗的溢出时间越短越灵敏,跑飞之后复位的时间越短,也就越安全,但是,你喂狗的操作也要更频繁。
[单片机]
分时复用程序范本51单片机程序框架
由于经常涉及到单片机开发,所以需要一个能够跑多任务的程序框架,用操作系统有点儿浪费资源,用普通线程方式又不能执行多任务,所以采取分时复用的方式,来跑多任务。 写一个范本为以后开发服务。 单片机源程序如下: #include common.h /************************************************************************************** * Variable definition ***********************************************************************
[单片机]