单片机里串行中断服务函数作用是什么呢?

单片机里串行中断服务函数作用是什么呢?,第1张

你的中断服务函数作用是:

串口设备每接收一个字节数据(8位)便产生一次中断,并检测是否收到的是字符【,不是则放弃数据,是则保存到数组 jsbuf 里去,然后把随后接收到的字节数据也一一保存到这个数组去,直到接收到字符 】为止,同样保存,并设置标记 rflag;

一句话,就是要从接收的数据中,提取 【xxxx】数据;

楼主的问题我觉得应该出在这里:该中断函数是将接收的数据加一然后回显,方法简单明了,不错。但是进入了死循环。void serial(void) interrupt 4 using 3{uchar iif(RI){i=SBUFSBUF=i+1}//中断内再出中断,打乱了中断服务程序的返回。if(TI){TI=0}}修改的如下,希望楼主看完后明白这个是同步互斥的问题。void serial(void) interrupt 4 using 3{uchar iif(RI){i=SBUFES=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') breakUART_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}}}


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

原文地址: http://outofmemory.cn/yw/12121423.html

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

发表评论

登录后才能评论

评论列表(0条)

保存