|
使用STC11F48XE作为主控MCU系统不正常的问题已解决
前段时间提出来的使用STC11F48XE后,烧录程序不正常的问题。 后来自己已经解决了该问题,觉得应该和大家分享一下,现将问题处理的方法发在这里。
经过查询资料,STC11系列的处理效率比普通51系列快了3--24倍,因此,在程序中很多使用空指令、循环来进行延时的地方,就不适用了,必须全部使用精确的定时函数来处理。 经过测算,12M以下时钟,能处理的精确定时在500us左右,再小就有可能出问题了,因此我增加了这个处理500us定时的函数,和以前的处理1ms定时的同时配合使用。 将所有的用空指令、循环来进行延时的地方,全部使用延时500us函数替换,经过测试,程序已经可以在STC11F48XE上稳定运行了。 在此建议:不要使用空指令、循环等来实现短延时,这样实现的程序对MCU的依赖性太高,换一个MCU可能就不能执行了,而应该使用精确的定时功能来实现延时。
具体改动的地方:
AT89C5X.C 只列出一个函数的修改,其他地方参考修改就可以了
- void AT89C5X_Write(unsigned char ucStartingAddressBuffer[2],unsigned char ucDataBuffer[],unsigned char ucDataLengthBuffer[])
- {
- unsigned char i,j;
- unsigned int nStartingAddress = ucStartingAddressBuffer[1]*256+ucStartingAddressBuffer[0];
-
- AT89C5X_InitOpt();
-
- P27 = 0;
- delay_xms(1);
- P27 = 1;
- delay_xms(1);
-
- for(i = 0; i < ucDataLengthBuffer[0]; i++)
- {
-
- SetAddress(nStartingAddress);
-
- PortData = ucDataBuffer[i];
-
- P26 = 0;
- P27 = 1;
- P36 = 1;
- P37 = 1;
- P33 = 1;
- PROG = 1;
-
-
- if(bHighProgrameVoltage)
- SetVpp(12);
- else
- SetVpp(5);
- delay_xxus(1);
-
-
- PROG = 0;
- delay_xxus(1);
-
-
-
-
-
-
- PROG = 1;
- delay_xxus(1);
-
- SetVpp(5);
- delay_xxus(1);
-
- P27 = 0;
-
-
- j = 255;
- PortData = 0xFF;
- while(j--)
- {
- if(PortData == ucDataBuffer[i])
- break;
- }
- nStartingAddress++;
- }
- AT89C5X_EndOpt();
- }
回复楼主
|