单片机延时程序学习

单片机延时程序分析结合静态数码管显示

因为最近在学习开发板,涉及到静态数码管的时候发现延时程序在单片机里用处挺大的,所以决定一边学一边写一点。

###想法
静态数码管依次显示0-F,中间间隔1s

###问题
网上查找到的方法是使用三个for loop

1
2
3
4
5
6
7
8
void delay(void)
{
unsigned char i, j, k;

for (i=0; i<100; i++)
for (j=0; j<100; j++)
for (k=0; k<20; k++);
}

不考虑是否中间间隔时间是精准的前提下,数码管显示正常,大约在0.5s左右

但是,在C中应该可以用
for (i = 0; i<100*100*20; i++);
来取代三个 for loop。经过试验,数码管无法正常显示,所有的led常亮,推测是led点亮周期太短。

修改上面的 for loop 使用i<100*100*2000,数码管显示正常

笔记

这里借用Winddoing的整理,记录一些单片机的一些常识,其中包含了很多汇编的知识,可能会有一些漏洞。

机器周期

机器周期是指单片机完成一个基本操作所花费的时间
51单片机中一个机器周期等于12个振荡(时钟)周期,假如单片机为12MHz晶振,其振荡周期为 1/12M s, 得出其机器周期为 1/1M s = 1μs

指令周期

  • 单周期指令 MOV R7,#80H
  • 双周期指令 DJNZ R7,KK
  • 四周期指令

汇编指令的时间计算

TBC 因为汇编有很多的东西要捡起来