钻石会员
主题
回帖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++)
{;}
}
}
每个里面的数都不一样,头大啊,请大家给推荐一个正确的,精确度高的,谢谢! |
|