关于单片机计时的问题

pzlapple 2009-12-11 12:32:04
#include <AT89X51.H>

unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,

0x6d,0x7d,0x07,0x7f,0x6f};

unsigned char Second;

void delay1s(void)

{

unsigned char i,j,k;

for(k=100;k>0;k--)

for(i=20;i>0;i--)

for(j=248;j>0;j--);

}

void main(void)

{

Second=0;

P0=table[Second/10];

P2=table[Second%10];

while(1)

{

delay1s();

Second++;

if(Second==60)

{

Second=0;

}

P0=table[Second/10];

P2=table[Second%10];

}

}

中间的delay为什么选择这样的三个循环?表示多长时间?跟脉冲有关系吗?是不是来一个脉冲就做一次“--”?
...全文
59 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
kondykuang 2009-12-11
  • 打赏
  • 举报
回复
void delay1s(void)

{

unsigned char i,j,k;

for(k=100;k>0;k--)

for(i=20;i>0;i--)

for(j=248;j>0;j--);

}
为什么 3重? 因为里面的变量都是char 最大才255.
单层的话 cpu 一下子就跑过去了,达不到需要的延时时间
所以 3层 能达到更久的延时
kondykuang 2009-12-11
  • 打赏
  • 举报
回复
单片机的延时 要看你的单片机的速度 就是晶振的大小。
如果是12M的51的话 实际只能跑1M起来
那么执行一条单周期指令 需要1us。
通过 for 循环 来 消耗单片机的时间 达到延时的作用,具体延时多久 只能估算。
有时候可以借助 示波器来调整
比如
void delay()
{
``````
}

void main()
{

while(1)
{
P1=0xff;
Delay();
P1=0x00;
Delay();
}
这样 通过观察示波器 可以大致 得出你的delay() 延时了多少
}
DINGXIAOYU777 2009-12-11
  • 打赏
  • 举报
回复
应该是延时一秒。这跟你用的晶振有关。
对于单周期指令的执行时间是12个振荡周期。
delay1s()是延时程序。
chogo 2009-12-11
  • 打赏
  • 举报
回复
从名字是看是延时1秒钟……

这个还跟芯片有关系的吧,我记得需要一个脉冲--,一个脉冲取指才行的。
从一个循环到另一个循环还需要设置寄存器。

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧