发布网友 发布时间:2022-04-30 05:07
共4个回答
热心网友 时间:2023-10-15 05:12
你的中断服务函数作用是:热心网友 时间:2023-10-15 05:13
楼主的问题我觉得应该出在这里:该中断函数是将接收的数据加一然后回显,方法简单明了,不错。但是进入了死循环。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;}}}热心网友 时间:2023-10-15 05:13
单片机中断服务函数写法1、在开始写中断函数之前,我们来一起回顾一下,单片机的中断系统。(1)中断源:中断请求信号的来源。(8051有3个内部中断源T0,T1,串行口,2个外部中断源INT0,INT1(这两个低电平有效。???? (2)中断响应与返回:CPU采集到中断请求信号,怎样转向特定的中断服务子程序,并在执行完之后返回被中断程序继续执行。期间涉及到CPU响应中断的条件,现场保护,现场恢复。???? (3)优先级控制:中断优先级的控制就形成了中断嵌套(8051允许有两级的中断嵌套,优先权顺序为INT0,T0,INT1,T1,串行口),同一个优先级的中断,还存在优先权的高低。优先级是可以编程的,而优先权是固定的。????? 80C51的原则是①同优先级,先响应高优先权②低优先级能被高优先级中断③正在进行的中断不能被同一级的中断请求或低优先级的中断请求中断。????? 80C51的中断系统涉及到的中断控制有中断请求,中断允许,中断优先级控制???? (1)3个内部中断源T0,T1,串行口,2个外部中断源INT0,INT1???? (2)中断控制寄存器:定时和外中断控制寄存器TCON(包括T0、T1,INT0、INT1),串行控制寄存器SCON,中断允许寄存器IE,中断优先级寄存器IP????? 具体的是什么,包括哪些标志位,在这里不讲了,所有书上面都会讲。?????(4)单片机复位后,TCON,SCON给位清零。????? 为了更好的了解这里意思,你可以看热心网友 时间:2023-10-15 05:14
通过串口的中断函数可以实现在串口通信的一帧数据传送完成后实现你想要的功能。比方说你想看看一帧的数据是否完成的传送,可以利用串口通信的中断函数去验证。热心网友 时间:2023-10-15 05:12
你的中断服务函数作用是:热心网友 时间:2023-10-15 05:13
楼主的问题我觉得应该出在这里:该中断函数是将接收的数据加一然后回显,方法简单明了,不错。但是进入了死循环。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;}}}热心网友 时间:2023-10-15 05:13
单片机中断服务函数写法1、在开始写中断函数之前,我们来一起回顾一下,单片机的中断系统。(1)中断源:中断请求信号的来源。(8051有3个内部中断源T0,T1,串行口,2个外部中断源INT0,INT1(这两个低电平有效。???? (2)中断响应与返回:CPU采集到中断请求信号,怎样转向特定的中断服务子程序,并在执行完之后返回被中断程序继续执行。期间涉及到CPU响应中断的条件,现场保护,现场恢复。???? (3)优先级控制:中断优先级的控制就形成了中断嵌套(8051允许有两级的中断嵌套,优先权顺序为INT0,T0,INT1,T1,串行口),同一个优先级的中断,还存在优先权的高低。优先级是可以编程的,而优先权是固定的。????? 80C51的原则是①同优先级,先响应高优先权②低优先级能被高优先级中断③正在进行的中断不能被同一级的中断请求或低优先级的中断请求中断。????? 80C51的中断系统涉及到的中断控制有中断请求,中断允许,中断优先级控制???? (1)3个内部中断源T0,T1,串行口,2个外部中断源INT0,INT1???? (2)中断控制寄存器:定时和外中断控制寄存器TCON(包括T0、T1,INT0、INT1),串行控制寄存器SCON,中断允许寄存器IE,中断优先级寄存器IP????? 具体的是什么,包括哪些标志位,在这里不讲了,所有书上面都会讲。?????(4)单片机复位后,TCON,SCON给位清零。????? 为了更好的了解这里意思,你可以看热心网友 时间:2023-10-15 05:14
通过串口的中断函数可以实现在串口通信的一帧数据传送完成后实现你想要的功能。比方说你想看看一帧的数据是否完成的传送,可以利用串口通信的中断函数去验证。