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为什么需要在中断服务程序中用软件清零等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)