钻石会员 
 
主题
回帖0
积分11414
阅读权限50
注册时间2012-1-30
最后登录1970-1-1
在线时间 小时
 
 
 
 
 | 
 
学单片机,前一阵中了doyoung和STC的毒,买回来STC12C5A60S2和STC2052AD各一个及配件若干,一开始学习的就是通过led的亮灭的时间间隔来实现不同的亮度以及LED的闪烁,这就涉及到C语言里的延时程序,刚开始学不会什么定时器,也不想用什么pwm,就想把延时程序搞个明白,但又不想去学习很深的时钟周期什么的(上学的时候微机原理都学不好),只想找一个准确点的函数当模版来使用,使用情况是:12M的晶体,1ms的延时程序。网上有很多51的程序,都是12T的,现在用的这个STC12的,就不知道延时这部分该怎么改了。  
1.用单片机小精灵1.2 1.3,不知道STC12系列的单片机在时钟周期那里到底该选1T还是STC1T?(这两个的区别是1T的时钟周期是0.08333us,STC1T的时钟周期是0.125us。) 
 
2.由于是新手,并不会在C语言程序里设置1T还是12T模式,不设置的话,STC12系列单片机出厂默认设置的是1T还是12T模式呢? 
 
3.在baidu上搜,看了半天,有人说汇编语言编的延时程序比较准,C语言靠for循环编的误差较大,不知这种说法是否正确?能不能在C语言里引用一点汇编的模块,从而提高精度降低误差?《单片机小精灵》里无论用什么编,注释里的误差都是0us,可能是0us么? 
 
4.有以下几个延时程序,请大家帮我推荐一个精度较高的(使用环境:12M的晶体,1ms的延时,STC12系列单片机出厂默认的时钟周期,自己没改过,目前也不会改): 
A:doyoung老师的教材里延时程序是这样的: 
void delay (unsigned int a) 
{                                // 1ms延时程序 
unsigned int i; 
while( --a != 0) 
   { 
   for(i = 0; i < 600; i++);    //STC单片机在外部晶振为12MHz时i值上限为600  
   }                                   //AT89C51单片机在外部晶振为12MHz时i值上限为125 
} 
doyoung老师说这个延时程序1小时后快10秒 
 
B:《单片机小精灵》12MHz,1T模式: 
void delay1ms(void)   //误差 0us 
{ 
    unsigned char a,b; 
    for(b=129;b>0;b--) 
        for(a=45;a>0;a--); 
} 
 
C:《单片机小精灵》12MHz,STC1T模式: 
void delay1ms(void)   //误差 0us 
{ 
    unsigned char a,b,c; 
    for(c=1;c>0;c--) 
        for(b=222;b>0;b--) 
            for(a=12;a>0;a--); 
} 
 
D:网上找到的一个C语言延时程序: 
/********************(STC12C5608AD  12MHZ z=1时精确延时1ms)*******************/ 
void delay_1ms(uint z) 
{ 
 uint x,y; 
 for(x=z; x>0; x--) 
  for(y=920; y>0; y--); 
} 
 
E:网上找到的一个C语言延时程序: 
void delay1ms(uint p)//12mhz 
{ uchar i,j; 
 for(i=0;i<p;i++) 
 { 
  for(j=0;j<124;j++) 
  {;} 
}  
} 
每个里面的数都不一样,头大啊,请大家给推荐一个正确的,精确度高的,谢谢! |   
 
 
 
 |