//==================================================================== //函数名:Init_SCI1 //作用:串口1初始化 //==================================================================== void Init_SCI1(void) { SCI1BDH=0x00;//波特率设置:波特率=总线频率/(16*BR) SCI1BDL=0x41;//总线频率为10M,波特率为9615,BR=65 SCI1C1=0x00;//0x00:开始位+8个数据位(低位在前)+停止位;无校验 //0x02:开始位+8个数据位(低位在前)+停止位;偶校验,even //0x03:开始位+8个数据位(低位在前)+停止位;奇校验,odd //#define SCI1C1 _SCI1C1.Byte //0 SCI1C1_PT 0,奇效验1,偶效验 //1 SCI1C1_PE 奇偶效验允许位 //2 SCI1C1_ILT 空闲方式选择位 //3 SCI1C1_WAKE 唤醒条件选择位 //4 SCI1C1_M 字符长度选择位 //5 SCI1C1_RSRC 接收源选择位 //6 SCI1C1_SCISWAI 等待模式下时钟选择位 //7 SCI1C1_LOOPS 循环模式选择位 // SCI1C2_TE=1;//0:禁止发送;1:使能发送 // SCI1C2_TIE=0;//0:禁止发送中断;1:使能发送中断 // SCI1C2_TCIE=0; //发送完成中断允许位
// SCI1C2_RIE=1;//0:禁止接收中断;1:使能接收中断 // SCI1C2_RE=1;//0:禁止接收;1:使能接收 SCI1C2=0x2C;//使能接受中断 使能发送和接收 SCI1C3 = 0x00;
cTransNum=0; //清发送数据计数值 cTransSum=0; //清发送数据效验和 cTransBuf[0]='\0'; //设定发送的数据长度为零 cReceiveNum=0; //清接收数据计数值 cReceiveSum=0; //清接收数据效验和 cReceiveBuf[0]='\0'; //设定接收的数据长度为零 cReceiveTemp=0; //清本次接收数据暂存 cReceiveTemp1=0; //清上次接收数据暂存 cTimeNum=0; //清定时发送计数 } void main(void) { DisableInterrupts; //禁止中断 Init_FBE(); //初始化晶振 Init_mclk(); Init_PortB(); Init_PortF(); //初始化LED
Init_KBI(); //初始化按键 Init_SCI1(); //初始化SCI Init_LCD(); Init_TPM(); //初始化定时器
EnableInterrupts; /* 使能中断*/
for(;;) {
switch(cReceiveBuf[1]) { case 0: ////////当前处于监视状态 DisplayFunction(iStakeoutValue1,iStakeoutValue2); PTFD_PTFD0=0; break; case 1: DisplayFunction(iStakeoutValue1,iStakeoutValue2); //显示功能项菜单 // DisplayLed2(iStakeoutValue2); //显示功能项对应的数值 // bValueGlitter=0; //清闪烁标志位 break; case 2: DisplayFunction(iStakeoutValue1,iStakeoutValue2); //显示功能项菜单 // DisplayLed2(iStakeoutValue2); //显示功能项对应的数值 // bValueGlitter=1; //置闪烁标志位 break; default: // cDisplayNumHex[0]=cDisplayNumHex[1]=ErrorId[0]; // cDisplayNumHex[2]=ErrorId[5]; //如不是上述故障则显示0.0. // cDisplayNumHex[3]=ErrorId[5]; // iStakeoutValue2=cReceiveBuf[5]*256+cReceiveBuf[4]; break; } // } /* loop forever */ } //==================================================== //SCI1接收中断服务程序 //==================================================== interrupt VectorNumber_Vsci1rx void isrSCI1(void) { PTFD_PTFD1=0; 测试用不执行此指令 /* cReceiveTemp=SCI1D; //接收当前的字符 if(cReceiveTemp=='e') ////////接收到结束码后的处理 { if(cReceiveBuf[cReceiveNum-1]==cReceiveSum) //////效验和正确 { cReceiveBuf[cReceiveNum-1]='\0'; //上次接收到的字符为接收数组结束标志 Receive(); //接收数据处理 } cReceiveNum=0; //清发送已接收的数据计数 cReceiveSum=0; //清接收效验和 cReceiveBuf[0]='\0'; //设定接收数据长度为零 cReceiveTemp=0; //清接收暂存 cReceiveTemp1=0; //清上次接收暂存 PTFD_PTFD1=0; } else ////////接收数据 { cReceiveBuf[cReceiveNum]=cReceiveTemp; //把本次接收的数据放到数组中 cReceiveSum+=cReceiveTemp1; //求效验和 cReceiveTemp1=cReceiveTemp; //把本次接收的数据放到暂存,用作下次的效验和 cReceiveNum++; //接收数据计数加1 } */ // PTFD_PTFD1=0; // SCI1C2_RIE=0; }
//==================================================== //SCI1发送中断服务程序 //==================================================== interrupt VectorNumber_Vsci1tx void SCI1_TX_ISR(void) { //清发送中断允许位 /* if((cTransNum)<10) ////////发送数据 strlen(cTransBuf { SCI1D=cTransBuf[cTransNum]; //发送数据 cTransSum+=cTransBuf[cTransNum]; //求发送数据效验和 cTransNum++; //已发送的数据个数 } else if((cTransNum)==10) ////////发送效验和 strlen(cTransBuf) { SCI1D=cTransSum; //发送效验和 cTransNum++; //已发送的数据个数 } else if((cTransNum>10)) ////////发送结束码 strlen(cTransBuf)) { SCI1D='e'; //发送结束码 cTransNum=0; //清计数位 cTransSum=0; //清发送数据效验和 cTransBuf[0]='\0'; //设定发送数据长度为零 //while(SCI1S1_TC) //SCI1S1_TC=0; SCI1C2_TIE=0; //清发送中断标志 // PTFD_PTFD1=0; } */ } 在定时器中断能够正常运行 在SCi中断中不能运行
|