UART串口通讯中断.ppt
- 格式:ppt
- 大小:289.00 KB
- 文档页数:9
UART串口通信—控制LED灯(中断法)项目说明:1.通过串口来控制LED灯,发送1(十六进制)点亮LED灯(8个LED蓝灯),发送2(十六进制)关闭LED灯(8个LED蓝灯)。
2.通信速率:9600bps(即波特率为9600)3.串口通信采用中断的方法。
此项目练习的目的:(我们应掌握如下知识点)(1)熟悉串口中断相关寄存器的配置。
(2)学会串口中断的使用方法。
完整代码:#include "reg52.h"/*串口初始化:主要涉及寄存器配置*/void UartInit(void) //初始化uart{TMOD = 0X20; //定时器1定时器方式工作模式2,可自动重载的8位计数器常把定时/计数器1 以模式2 作为串行口波特率发生器SCON = 0X50; //串口选择工作模式1使能接收,允许发送,允许接收PCON = 0X00; //8位自动重载,波特率加倍TH1 = 0XFD; //用11.0592MHz波特率9600TL1 = 0XFD;TR1 = 1; //打开中时器/*由于我们采用中断法,所以我们还需要对串口中断相关的寄存器进行配置*/ES = 1;//串口中断EA= 1;//CPU总中断}//写串口中断响应的服务程序:void UartISR(void) interrupt 4{unsigned char TempDat;if (RI)/*查询串口是否接收到一个完整的数据*/{RI = 0;/*清除标志,准备下一次判断*/TempDat = SBUF;/*读取串口数据*/if (1 == TempDat)/*判断串口接收到的数据*/{P1 = 0;/*如果接收到的数据是1,则点亮8个LED蓝灯*/}} else if (2 == TempDat){P1 = 0xff;/*如果接收到的数据是2,则关闭8个LED蓝灯*/}} else{}}}void main(void){UartInit();/*调用串口初始化函数,进行相应的配置,如波特率等*/ while(1)//不用干啥事,一直等待就行。
关于串口0终端服务程序IRQ_UART0()IIR?U0IIR?答:U0IIR是接收器缓存寄存器U0RBR:接收器缓存寄存器访问时,先要设定U0LCR 的除数锁存访问位(DLAB)为0。
因为,U0DLL 与U0RBR/U0THR 在同一地址上。
DLAB = 1 时,选择U0DLL 和U0DLM (U0DLM 和U0IER 在同一个地址上);DLAB = 0 时,选择U0RBR/U0THR 和U0IER。
U0DLL 和U0DLM:构成一个16 位的除数。
VPB时钟(pclk) 是产生波特率的时钟源,波特率时钟源必须是波特率的16倍,于是有:baud_rate = pclk/(16*设定的除数)UART0 的中断:有4 个中断,分别是:RBR 中断;THRE 中断;Rx 线中断;其中RBR 中断里面包含有2个中断:数据可用RDA中断和接收超时CTI 中断。
FAQ一:1、什么是RDA 中断?当接收的有效数据到达接收FIFO设置寄存器(U0FCR) 中设置的触发点时,RDA中断被激活。
U0FCR[7:6]=00 触发点0(1字节);U0FCR[7:6]=01 触发点1(4字节);U0FCR[7:6]=01 触发点2(8字节);U0FCR[7:6]=01 触发点1(14字节);发生中断后,U0IIR[3:0] 内容为:0100。
如果发生中断后,读一下U0RAR 寄存器,那么就会得到最早到达的数据。
这时,FIFO 中的有效数据小于预定触发点,清零RDA 中断。
该中断的优先级为 2 。
2、什么是CTI 中断?在接收FIFO 中,有效的数据少于触发个数时,但至少有一个时,如果长时间没有数据到达,将触发CTI 中断。
这里所说的“长时间”是指在接收 3.5~4.5 个字节所需要的时间。
发生中断,则U0IIR[3:0] 内容为:1100。
在中断后,若从U0RBR 中读取接收FIFO中的数据,或者有新的数据送入接收FIFO中,这都将清零CTI 中断。