第一范文网 - 专业文章范例文档资料分享平台

软中断在51单片机中的实现及其应用

来源:用户分享 时间:2025/6/1 21:40:53 本文由loading 分享 下载这篇文档手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:xxxxxxx或QQ:xxxxxx 处理(尽可能给您提供完整文档),感谢您的支持与谅解。

//使用UART2中断作软件中断 #elif SWI_NUM == 8 IE2 |=0x01;//ES2=1 //使用SPI中断作软件中断 #elif SWI_NUM == 9 AUXR1 |= 0x20;//SPI切换到P4口 SPCTL = 0xD0;//MASTER模式 IE2 |=0x02;//ESPI=1 #endif EA = 1; } void main(void) { unsigned char SwiFun_Num; int DataIn,result,i; P0 = 0xFF; P1 = 0xFF; P2 = 0xFF; P3 = 0xFF; SwiFunction_Init();//初始化软中断功能 DataIn = 0; result = 0; SwiFun_Num = 0; while(1) { SwiFun_Num++; DataIn++; SWI(SwiFun_Num,DataIn,result); //申请软中断服务 if(result != (DataIn + SwiFun_Num)) {for(;;) _nop_();}//错,停在这里 for(i=0;i<32767;i++) _nop_(); } } #ifdef SWI_NUM void SWI_ISR(void) interrupt SWI_NUM {//软中断服务函数 提供的功能是输出=输入+申请功能号 LED ^= 1;//便于观察是否进入软中断服务 CLEAR_SWI();//清除可能需要清除的标志 *(int *) OutputParameter = *(int *)InputParameter + FunctionNum; FunctionNum = 0;//清除申请功能号 } #endif 例3:一个具有动态代码执行能力的SWI演示例程(STC12C5AxxS2单片机)

#include #include void Set_LED0(void); void Set_LED1(void); sbit LED = P1^0; //定义软件中断使用的中断号 省略,同例2 #ifdef SWI_NUM unsigned char FunctionNum; void (*Func_CallBack)(void); #define SWI(a,b) \\ FunctionNum=a; \\ Func_CallBack = (void *)b; \\ SWI_IRQ(); \\ _nop_(); #endif void SwiFunction_Init(void){//省略,代码同例2} void Set_LED0(void){LED = 0;} void Set_LED1(void){LED = 1;} void main(void) { unsigned char SwiFun_Num; int i; P0 = 0xFF; P1 = 0xFF; P2 = 0xFF; P3 = 0xFF; SwiFunction_Init();//初始化软中断功能 SwiFun_Num = 0; while(1) { SwiFun_Num++; //申请软中断服务 if(LED ==1) SWI(SwiFun_Num,Set_LED0); Else SWI(SwiFun_Num,Set_LED1); for(i=0;i<32767;i++) _nop_(); } } #ifdef SWI_NUM void SWI_ISR(void) interrupt SWI_NUM {//软中断服务函数,提供的服务是执行指定的功能函数 CLEAR_SWI();//清除可能需要清除的标志 Func_CallBack();//执行指定的功能函数 FunctionNum = 0;//清除申请功能号 } #endif 例程4:一个SWI演示例程,互斥访问I2C总线(STC12C5AxxS2单片机)

typedef struct Swi_List * SwiNode; typedef struct Swi_List{ unsigned int TimeDelay;//延迟多少时间开始执行,等于0表示立即执行 void (*Func)(unsigned char * pInOut);//执行的函数入口地址 unsigned char * pInOut;//执行函数的数据输入输出地址 SwiNode NextNode;//下一个节点的地址 }; SwiNode SWI_Head_Node;//系统内核使用的指针变量 #ifdef SWI_NUM unsigned char FunctionNum; SwiNode SwiIRQNode; #define SWI(a,b) \\ FunctionNum = a; \\ SwiIRQNode = b; \\ SWI_IRQ(); \\ _nop_(); #endif uint8 IICRead(uint8 *Ret,uint8 Addr,uint8 NByte) {//硬件上操作总线,完成读取功能 (省略) } uint8 IICWrite(uint8 Addr,uint8 *Data,uint8 NByte) {//硬件上操作总线,完成写入功能 (省略) } void PCF8563Read(uint8 *Data) { uint8 NByte; NByte = *Data++; IICWrite(PCF8563Addr,Data,1); IICRead(Data - 1,PCF8563Addr,NByte); } void PCF8563Write(uint8 *Data) { uint8 NByte; NByte = *Data++; NByte++; IICWrite(PCF8563Addr,Data,NByte); } void Get_Temperature(int *RegTemperature) {//读传感器的温度,传感器的地址由*RegTemperature指定 uint8 SensorAddr; uint8 TempReg[2]; SensorAddr = (uint8 *) RegTemperature;//访问的传感器地址 TempReg[0] = SENSOR_REG_TEMPERATURE; 访问传感器的温度值寄存器 IICWrite(WRITE_SENSOR_ADDR0+(SensorAddr&0x07)*2,TempReg,1);//写一个字节 IICRead(Temp, READ_SENSOR_ADDR0+(SensorAddr&0x07)*2,2);//读两个字节 *RegTemperature = (Temp [0]<<8)+ Temp [1]; } void SWI_ISR(void) interrupt SWI_NUM {//软中断服务函数 提供的服务是执行链表中的函数 if(FunctionNum == 1) {//功能1:增加软中断服务,将软中断申请放到队列中等待执行 if(SWI_Head_Node == 0) { //申请内存 SWI_Head_Node = ( SwiNode )malloc(sizeof(Swi_List_Struct)); if(SWI_Head_Node != 0) { SWI_Head_Node->TimeDelay = SwiIRQNode->TimeDelay; SWI_Head_Node->Func = SwiIRQNode->Func; SWI_Head_Node->pInOut = SwiIRQNode->pInOut; SWI_Head_Node->NextNode = 0; } } else { (省略) } } //寻找是否有就绪的软中断任务需要执行 pNode = SWI_Head_Node; pRightNode = SWI_Head_Node; for(;;) { if(pNode != 0) { if((pNode->TimeDelay)==0) {//发现一个等待执行的软中断 if(pNode == SWI_Head_Node) {//是第一个节点 if((pNode->NextNode) != 0) {//还有下一个节点 //撤销节点 SWI_Head_Node = pNode->NextNode; pRightNode = SWI_Head_Node; //执行函数 pNode->Func(pNode->pInOut); //释放内存 free(pNode); pNode = pRightNode;//指向下一个节点 } else {//没有下一个节点 (省略) } } else

搜索更多关于: 软中断在51单片机中的实现及其应用 的文档
软中断在51单片机中的实现及其应用.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.diyifanwen.net/c4xdr41q7dj7k6x46aj54_4.html(转载请注明文章来源)
热门推荐
Copyright © 2012-2023 第一范文网 版权所有 免责声明 | 联系我们
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:xxxxxx 邮箱:xxxxxx@qq.com
渝ICP备2023013149号
Top