本帖最后由 可可球 于 2015-10-14 16:05 编辑
最近用C8051做了块板子,发现延时不准确,不知道什么原因,求助大神们采用的是外部晶掁22.1184MHZ,二分频,应该是11.0592MHz
#include<c8051f020.h>
#define uint unsigned int //数据类型的宏定义
#define uchar unsigned char
void delay_ms(uint);
void delay_us(uint);
void main()
{
uint i;
WDTCN = 0xde;
WDTCN = 0xad; // 禁止内部看门狗
XBR2 = 0x40; /*使能交叉开关*/
P2MDOUT =0xff;
P74OUT |= 0xf3;
OSCXCN = 0x77; // start external oscillator with 22.1184MHz crystal,
//启用外部晶掁,晶掁22.1184MHZ,二分频,SYSCLK定义为11.0592
for (i=0; i < 256; i++) // XTLVLD blanking interval (>1ms)
while (!(OSCXCN & 0x80)) // Wait for crystal osc. to settle
OSCICN = 0x88; // select external oscillator as SYSCLK
while(1)
{
delay_us(10);
P2=0xff;
delay_us(10);
P2=0x00;
}
}
//***********************************************************************
// 延时子程序us
//***********************************************************************
void delay_us(uint us)
{
uchar k=us;
while(k--);
}
//***********************************************************************
// 延时子程序ms
//***********************************************************************
void delay_ms(uint ms)
{
uchar i,j;
for(i=0;i<ms;i++)
{
for(j=0;j<10;j++)
delay_us(150);
}
}
以下是主函数里的
while(1)
{
delay_us(10);
P2=0xff;
delay_us(10);
P2=0x00;
}
在 delay_us()函数给不同的值时,示波器测得的波形
发现delay_us(1)的时候,波形是2.6us,delay_us(10)是8.24us,delay_us(500)是160us
|