单片机中延时100毫秒的程序
4个回答
展开全部
汗!问这个问题说明你对时钟周期、机器周期、定时器周期都不太了解吧。
延时100毫秒的程序可以是一个函数,也可以是利用定时器的一段代码。
如果是用汇编延时那么你要把单片机指令周期表翻一下了,看看整个循环语句用了哪些指令,每个指令多少个机器周期,然后计算每个机器周期耗时多少时长,你就知道循环多少次了。
如果用C语言延时,那么就要借助仪器了,你同样要估算一下机器周期和循环次数,然后要精确到100ms就需要把这个延时时间作为频率从单片机IO口输出,用仪器来辅助测量,最后得出叫准确的100ms的循环次数的值。
如:
void delay_100ms(uint8 n)
{
uint16 i;
while(n)
{
for(i=0;i<xxx;i++)//此循环应为运行100ms,用仪器辅助得到xxx的值。不够就再在FOR一次。
}
}
延时100毫秒的程序可以是一个函数,也可以是利用定时器的一段代码。
如果是用汇编延时那么你要把单片机指令周期表翻一下了,看看整个循环语句用了哪些指令,每个指令多少个机器周期,然后计算每个机器周期耗时多少时长,你就知道循环多少次了。
如果用C语言延时,那么就要借助仪器了,你同样要估算一下机器周期和循环次数,然后要精确到100ms就需要把这个延时时间作为频率从单片机IO口输出,用仪器来辅助测量,最后得出叫准确的100ms的循环次数的值。
如:
void delay_100ms(uint8 n)
{
uint16 i;
while(n)
{
for(i=0;i<xxx;i++)//此循环应为运行100ms,用仪器辅助得到xxx的值。不够就再在FOR一次。
}
}
2010-12-02
展开全部
这个要看什么单片机
首先有个晶振频率,然后有个PLL,相当于倍频,然后有个分频,才到总线频率。
为什么一直提频率呢,因为频率的倒数是周期,然后你算算100ms是多少总线周期,就知道循环几次了。
还有一种方法是用中断,计时比较准确。
基础知识不好哦~~~
首先有个晶振频率,然后有个PLL,相当于倍频,然后有个分频,才到总线频率。
为什么一直提频率呢,因为频率的倒数是周期,然后你算算100ms是多少总线周期,就知道循环几次了。
还有一种方法是用中断,计时比较准确。
基础知识不好哦~~~
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
51单片机 12MHz
汇编:DELAY: ;误差 0us
MOV R7,#13H
DL1:
MOV R6,#14H
DL0:
MOV R5,#82H
DJNZ R5,$
DJNZ R6,DL0
DJNZ R7,DL1
RET
C:
void delay(void) //误差 0us
{
unsigned char a,b,c;
for(c=19;c>0;c--)
for(b=20;b>0;b--)
for(a=130;a>0;a--);
}
汇编:DELAY: ;误差 0us
MOV R7,#13H
DL1:
MOV R6,#14H
DL0:
MOV R5,#82H
DJNZ R5,$
DJNZ R6,DL0
DJNZ R7,DL1
RET
C:
void delay(void) //误差 0us
{
unsigned char a,b,c;
for(c=19;c>0;c--)
for(b=20;b>0;b--)
for(a=130;a>0;a--);
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
51单片机 MOV R7,#13H
DL1:
MOV R6,#14H
DL0:
MOV R5,#82H
DJNZ R5,$
DJNZ R6,DL0
DJNZ R7,DL1
RET
C:
void delay(void) //误差 0us
{
unsigned char a,b,c;
for(c=19;c>0;c--)
for(b=20;b>0;b--)
for(a=130;a>0;a--);
}
DL1:
MOV R6,#14H
DL0:
MOV R5,#82H
DJNZ R5,$
DJNZ R6,DL0
DJNZ R7,DL1
RET
C:
void delay(void) //误差 0us
{
unsigned char a,b,c;
for(c=19;c>0;c--)
for(b=20;b>0;b--)
for(a=130;a>0;a--);
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询