Ⅰ 单片机里串行中断服务函数作用是什么呢
楼主的问题我觉得应该出在这里:该中断函数是将接收的数据加一然后回显,方法简单明了,不错。但是进入了死循环。void serial(void) interrupt 4 using 3{uchar i;if(RI){i=SBUF;SBUF=i+1;}//中断内再出中断,打乱了中断服务程序的返回。if(TI){TI=0;}}修改的如下,希望楼主看完后明白这个是同步互斥的问题。void serial(void) interrupt 4 using 3{uchar i;if(RI){i=SBUF;ES=0;//关串行中断SBUF=i+1;}//中断内再出中断,打乱了中断服务程序的返回。ES=1;//开穿行中断if(TI){TI=0;}}完整而完善的串口服务函数可以给楼主参考:#includeunsigned char UART_RX; //定义串口接收数据变量unsigned char RX_flag; //定义穿行接收标记/*********************************************************************************************函数名:UART串口初始化函数调 用:UART_init();参 数:无返回值:无结 果:启动UART串口接收中断,允许串口接收,启动T/C1产生波特率(占用)备 注:振荡晶体为11.0592MHz,PC串口端设置 [ 2400,8,无,1,无 ]/**********************************************************************************************/void UART_init (void){EA = 1; //允许总中断(如不使用中断,可用//屏蔽)ES = 1; //允许UART串口的中断TMOD = 0x20; //定时器T/C1工作方式2SCON = 0x50; //串口工作方式1,允许串口接收(SCON = 0x40 时禁止串口接收)TH1 = 0xE8; //定时器初值高8位设置TL1 = 0xE8; //定时器初值低8位设置PCON = 0x80; //波特率倍频(屏蔽本句波特率为1200)TR1 = 1; //定时器启动}/**********************************************************************************************//*********************************************************************************************函数名:UART串口接收中断处理函数调 用:[SBUF收到数据后中断处理]参 数:无返回值:无结 果:UART串口接收到数据时产生中断,用户对数据进行处理(并发送回去)备 注:过长的处理程序会影响后面数据的接收/**********************************************************************************************/void UART_R (void) interrupt 4 using 1{ //切换寄存器组到1RI = 0; //令接收中断标志位为0(软件清零)UART_RX = SBUF; //将接收到的数据送入变量 UART_dataRX_flag=1; //标记接收//用户函数内容(用户可使用UART_data做数据处理)//SBUF = UART_data; //将接收的数据发送回去(删除//即生效)//while(TI == 0); //检查发送中断标志位//TI = 0; //令发送中断标志位为0(软件清零)}/**********************************************************************************************//*********************************************************************************************函数名:UART串口发送函数调 用:UART_T (?);参 数:需要UART串口发送的数据(8位/1字节)返回值:无结 果:将参数中的数据发送给UART串口,确认发送完成后退出,采用非中断方式备 注:/**********************************************************************************************/void UART_T (unsigned char UART_data){ //定义串口发送数据变量ES=0; //禁止穿行中断SBUF = UART_data; //将接收的数据发送回去while(TI == 0); //检查发送中断标志位TI = 0; //令发送中断标志位为0(软件清零)ES=1; //打开穿行中断}/*********************************************************************************************函数名:UART串口发送字符串函数调 用:UART_S (?);参 数:需要UART串口发送的数据(8位/1字节)返回值:无结 果:将参数中的数据发送给UART串口,确认发送完成后退出,采用非中断方式备 注:/**********************************************************************************************/void UART_S(unsigned char *str){while(1){if(*str=='\0') break;UART_T(*str++);}}/*********************************************************************************************函数名:主函数调 用:main();参 数:返回值:无结 果:备 注:/**********************************************************************************************/void main(){unsigned char Buf_data[]={" welcome to MCU world. \n\r"};UART_init();UART_S(Buf_data);while(1){if(RX_flag==1){UART_T(UART_RX);RX_flag=0;}}}
Ⅱ 单片机串口中断执行流程
流程是:(主程序中)发送数据―等待中断―发送成功产生中断―进入中断清除TL,再次发送―中断返回―等待中断―发送成功产生中断―进入中断清除TL,再次发送。。。。循环而已。
Ⅲ 8051单片机的串行口控制寄存器中有2个中断标志位 它们是什么和什么
8051单片机的串行口控制寄存器中有2个中断标志位 它们是RI和TI。TI是发送中断标志,RI是接收中断标志。标准51有5个中断向量(不算复位),分别是外部中断0,定时器0,外部中断1,定时器1,串行口;总共有6个中断标志,串行口的发送和接收共享一个中断向量。
(3)单片机的串行中断扩展阅读:
作用:SCON寄存器用来控制串行口的工作方式和状态,可以位寻址在复位时所有位被清零,字节地址98HPCON主要是为CHMOS型单片机的电源控制设置的专用寄存器,单位地址87H,不能位寻址,最高位SMOD,为波特率选择位。
8051单片机是PC 机的CPU 是基于冯诺伊曼的体系结构。单片机的存储器配置:
1、 一个8 位的微处理器(CPU)。
2、 片内数据存储器RAM(128B/256B),用以存放可以读/写的数据,如运算的中间结果、最终结果以及欲显示的数据等,SST89 系列单片机最多提供1K 的RAM。
3、 四个8 位并行I/O 接口P0~P3,每个口既可以用作输入,也可以用作输出。
4、 五个中断源的中断控制系统。新推出的单片机都不只5 个中断源,例如SST89E58RD 就有9 个中断源。
5、 一个全双工UART(通用异步接收发送器)的串行I/O 口,用于实现单片机之间或单机与微机之间的串行通信。
6、 片内振荡器和时钟产生电路,但石英晶体和微调电容需要外接。最高允许振荡频率为12MHz。SST89V58RD 最高允许振荡频率达40MHz,因而大大的提高了指令的执行速度。
参考资料来源:网络_8051单片机
Ⅳ 51单片机在什么情况下会产生串口中断
首先,你要用软件允许中断,即
C语言中
EA = 1; //允许总中断
ES = 1; //允许串口中断
汇编中可用
SETB EA ;允许总中断
SETB ES ;允许串口中断
当单片机接收到一帧数据后,RI会置1,向CPU申请中断,若之前有中断允许,则产生了中断,进入中断服务程序。当然,单片机发送完一帧数据,TI也会置1,同样会产生中断!
一般我们在发送数据时要关中断,因为一般你不用在发送时不用处理数据;接收数据时要开中断,以便你在中断服务程序中将接收到的数据进行存储并处理。
补充:其实,不管你有没有允许中断,上位机(此时即给单片机发送信息的机器)只要给单片机发送数据,单片机就会自动接收数据,并把它放在数据缓冲器SBUF中,如果你之前有允许串行口中断,RI就会置1,向单片机CPU申请中断,并进入中断服务程序,即你问题中的serial()函数,做完这个函数后就会自动返回断点。如果你没有允许中断,便不会产生串行中断。
其实,你的问题有个错误:别的中断都是某个I/O口电平变化产生。这只是外部中断产生条件,不过,你之前也需要用软件允许外部中断。另外,常见的51系列单片机有5个中断源三种中断5:1、外部中断0和1;2、定时器/计数器溢出中断0和1;3、串行口中断。另外,STC51系列还有定时器/计数器T2中断,A/D转换中断,PWM中断,串行中断2等等。你还有什么不懂的可以自己多翻一翻书,学到后面去了你就明白了。
你的问题中那个serial()函数中 P1=SBUF; 是把接收的数据送到并行P1口,然后那条 RI=0;是不可少的,这是用软件清零RI,准备再次接受一帧数据产生中断,如果你没有这条语句,就会进入死循环,出不来了。
有什么问题还可以Q我(1445090023),希望能给我评个最佳答案。
Ⅳ 什么是单片机的中断
不同的计算机其硬件结构和软件指令是不完全相同的,因此,中断系统也是不相同的。
计算机的中断系统能够加强CPU对多任务事件的处理能力。中断机制是现代计算机系统中的基础设施之一,它在系统中起着通信网络作用,以协调系统对各种外部事件的响应和处理。中断是实现多道程序设计的必要条件。 中断是CPU对系统发生的某个事件作出的一种反应。
引起中断的事件称为中断源。中断源向CPU提出处理的请求称为中断请求。发生中断时被打断程序的暂停点称为断点。
CPU暂停现行程序而转为响应中断请求的过程称为中断响应。处理中断源的程序称为中断处理程序。
CPU执行有关的中断处理程序称为中断处理。而返回断点的过程称为中断返回。中断的实现实行软件和硬件综合完成,硬件部分叫做硬件装置,软件部分称为软件处理程序。
响应处理
大多数中断系统都具有如下几方面的操作,这些操作是按照中断的执行先后次序排列的。
1、 接收中断请求。
2、 查看本级中断屏蔽位,若该位为1则本级中断源参加优先权排队。
3、 中断优先权选择。
4、 处理机执行完一条指令后或者这条指令已无法执行完,则立即中止现行程序。接着,中断部件根据中断级去指定相应的主存单元,并把被中断的指令地址和处理机当前的主要状态信息存放在此单元中。
5、 中断部件根据中断级又指定另外的主存单元,从这些单元中取出处理机新的状态信息和该级中断控制程序的起始地址。
6、 执行中断控制程序和相应的中断服务程序。
7、 执行完中断服务程序后,利用专用指令使处理机返回被中断的程序或转向其他程序。
冲突
在一些罕见的情况下,两个ISA设备可以共享相同的 IRQ,只要它们不同时使用即可。为了解决这个问题,后来的PCI 总线允许 IRQ 共享。PCI Express没有物理中断线,并使用消息信号中断(MSI) 到操作系统(如果可用)。
在早期的 IBM 兼容个人计算机中,中断曾经是一种常见的硬件错误,当两个设备尝试使用相同的中断请求(或 中断)向可编程中断控制器(PIC)发出中断信号时会收到该错误。
PIC 期望每条线路仅来自一个设备的中断请求,因此沿同一条线路发送中断信号的多个设备通常会导致 中断 冲突,从而导致计算机死机。
例如,如果在系统中添加调制解调器扩展卡并分配给中断4,传统上分配给串行端口1,则可能会导致中断冲突。最初,中断 7 是使用声卡的常见选择,但后来发现 中断 7 会干扰打印机端口(LPT1)时使用了中断5。该串行端口经常禁用可以用于其他设备的中断线。
中断 2/9 是 MPU-401 MIDI 端口的传统中断线,但这与ACPI系统控制中断(SCI 在 Intel 芯片组上硬连线到 中断9)冲突;
这意味着 ISAMPU-401带有硬连线中断2/9 的卡和带有硬编码 中断 2/9 的 MPU-401 设备驱动程序不能在启用 ACPI 的系统上以中断驱动模式使用。
以上内容参考网络-中断
Ⅵ 单片机串行通信中的中断
置位就是表示要CPU去干什么,只要CPU去干了这个置位就没用了,因为已经在干了。中断只是优先级比较高的程序,程序不是没有写,而是已经包含进去了,只是你自己不用写而已
Ⅶ 单片机串行口中断程序
程序是没有问题的,串口不一定非要使用中断的,程序里面只发送,不接收,中断更没有意义了。值得说明的是 ,一般如果允许接收的话,一般是要开启中断的,这样可以尽可能的保证不丢失数据。
Ⅷ 单片机里串行中断服务函数作用是什么呢
通过串口的中断函数可以实现在串口通信的一帧数据传送完成后实现你想要的功能。比方说你想看看一帧的数据是否完成的传送,可以利用串口通信的中断函数去验证。
Ⅸ 大家说说单片机串口中断是怎么回事
你这说的过于笼统了,得看你想知道的具体串口中断问题。单片机串口主要是用于接收或者发送的。想明白这个,先说一下中断这个概念,举个例子,比如你今天工作需要一直编写程序,可是到中午的时候你肚子饿了,就需要吃饭,这就好比是中断请求,虽然你此时正在编写程序进行工作,但是饥饿需要及时解决,于是你就先去吃饭了,吃饭回来之后你需要继续编程工作,于是又回到正常工作中,这大概就说明了中断的所有概念。单片机串口中断,例如用串口接收GPS模块的数据(这一般都是串口相连的),单片机可能需要一直的工作,不管是干什么,但是你最需要的是接收GPS数据并进行处理,于是当接收到GPS信号时,就会产生串口中断,然后进入中断接收GPS数据,存储在串口寄存器当中,当接收完之后关掉中断,单片机继续其他工作,当又有GPS数据需要接收时,便又产生串口中断进行接收处理。这个大概就是单片机串口中断的过程,不知有所了解没
Ⅹ 8051单片机串口中断怎么进入
方法如下:
(1)使用串口直通线。设计电路时,单片机的RXD连接电路板DB9的TXD,单片机的TXD连接电路板DB9的RXD,具体实现可在232电平转换芯片处反接。
(2)使用串口|交叉线。设计电路时,因为串口线已做交叉,单片机的RXD连接电路板DB9的RXD,单片机的TXD连接电路板DB9的TXD,均直连即可。 单片机与串口设备(如GPRS模块、载波芯片等)通信时,一律将RXD与TXD反接,即单片机的RXD接设备的TXD,单片机的TXD接设备的RXD。(特殊标注其RXD与单片机RXD直连的除外,如华为的EM310)。
首先我们需要明白两个概念,就是DTE和DCE。DTE是指数据终端设备,典型的DTE就是计算机和单片机。DCE是指数据通信设备,典型的DCE就是 MODEM。
RS232串口标准中的RXD和TXD都是站在DTE立场上的,而不是DCE。明白了这一点,再讲下面的接线方法,就很好理解了。 单片机与计算机进行串口通信时,单片机的RXD接计算机的TXD,单片机的TXD接计算机的RXD。