在中断处理子程序中,为什么要判断是由TI还是RI引发的中断

在中断处理子程序中,为什么要判断是由TI还是RI引发的中断,第1张

TI:发送中断标志位。

可寻址标志位。方式0时,发送完第8位数据后,该位由硬件置位;其它方式下,在发送停止位之前由硬件置位,因此,TI=1表示帧发送结束,可由软件查询TI位标志,也可以请求中断。TI必须由软件清0。

RI:接收中断标志位。

可寻址标志位。方式0时,接收完第8位数据后,该位由硬件置位;在其他工作方式下,当接收到停止位时,该位由硬件置位,RI=1表示帧接收完成,可由软件查询RI位标志,也可以请求中断。RI必须由软件清0。

AVR的串口与51寄存器完全不一样,做不到简单替换,我只能跟你说AVR的UDR就是51的SBUF,至于51的TI/RI什么的,AVR的UART寄存器大部分不支持位 *** 作,就算查手册都对应出来了,也没用!

贴一个标准的AVR官方程序:

#include<iom16vh>

#include<macrosh>

#define MCLK (8E6)

#define uchar unsigned char

#define uint unsigned int

#pragma interrupt_handler UARTRX:12 //接收中断

//#pragma interrupt_handler UARTTX:14 //发送中断

int baud=9600; //8M下1200bps算是比较精确的,41701

void init_UART()//初始化,自己看,没有51的TMOD什么的,取而代之的是更加复杂的设置

{

UCSRB=0x00;

UCSRA=0x00; //控制寄存器清零

UCSRC=(1<<URSEL)|(0<<UPM0)|(3<<UCSZ0);

// UCSRC|=(1<<UPM1)|(1<<UPM0); //选择UCSRC,异步模式,禁止

//校验,1位停止位,8位数据位

baud=MCLK/16/(baud-1); //波特率最大为65K

UBRRL=baud;

UBRRH=0; //设置波特率

UCSRB|=(1<<TXEN)|(1<<RXEN)|(1<<RXCIE);

//接收、发送使能,接收中断使能

SREG=BIT(7); //全局中断开放

DDRD|=BIT(1); //PD1输出

DDRD&=~BIT(0); //PD0输入

}

void sendUART_dat(uchar dat) //发送函数

{

while(!(UCSRA&BIT(UDRE)));//等待发送缓冲器空

UDR=dat;//把数据写入UDR,就像你在51里写SBUF一样

}

void UARTRX(void)//接收中断服务

{

SREG&=~BIT(7); //数据寄存器UDR

UCSRB&=~BIT(RXCIE);

a=UDR;//读取数据到你自己的变量,例如a

UCSRB|=BIT(RXCIE);

SREG|=BIT(7);

}

这是最简单的应用,应该能看懂吧

中断标志位不清零的话,则会在退出中断服务程序后,又会马上进入中断

硬件不清零的设计原因是这样:让你在中断服务程序中用来判断中断源,这是为了降低芯片的成本,很多中断源都是共用一个中断信号编码,所以在你判断中断标志位后,并准备执行相应的动作时,需要软件清零

收、发中断条件,同时满足,TI、RI,会在同一个机器周期置一。

无论发生哪一个,单片机都会进入同一个中断入口。

其实,楼主就不要钻这个牛角尖了。

这种事情,是极小概率,你就当它永远不会发生,即可。

if(RI==1)

{

RI=0;

for(i=0;i<14;i++)

{

serial_ram[i]=SBUF;

while(!RI);RI=0;

}

ES0=0;

serial_check();

if(err_flag==0)

{

show_temp();

}

ES0=1;

}

不好用 for(i=0;i<14;i++) 的

每次接收到1个字节就中断的,中断内循环没意义的

每次接收到数据并存入接收缓冲区数组后记录下当前数组下标,下次有新的数据到来时,数组下标加1,将数据存入

Ri质粒即根诱导质粒(rootinducingplasmid),是发根土壤杆菌(Agrobacteriumrhizogenes)染色体外的遗传物质。根据其诱导的冠瘿碱的不同,Ri质粒可分为3种类型:农杆碱型(agropine)、甘露碱型(mannopine)和黄瓜碱型(cucumopine)。Ri质粒具有3个功能区域,即致病区(Vir区)、转移进入植物细胞核的T-DNA区和复制起点(ori)。Ri质粒的T-DNA区上的基因不影响植株再生,野生型Ri质粒可直接用作转化载体。Ri质粒基因转化载体构建程序包括中间载体构建、中间表达载体构建和Ri质粒基因转化载体构建。

Ri质粒基因转化载体的构建也有两种策略,共整合载体策略和双元载体策略。

以上就是关于在中断处理子程序中,为什么要判断是由TI还是RI引发的中断全部的内容,包括:在中断处理子程序中,为什么要判断是由TI还是RI引发的中断、求高手将下面51程序改成AVR程序,TI、RI、SBUF、OLEN、ILEN还有serial_init()里面的都怎么改、CPU响应串行口中断后,TI和RI为什么需要在中断服务程序中用软件清零等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/9715129.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-01
下一篇 2023-05-01

发表评论

登录后才能评论

评论列表(0条)

保存