标题:
关于单片机延时时间的C语言代码问题
[打印本页]
作者:
Host
时间:
2018-11-23 10:44
标题:
关于单片机延时时间的C语言代码问题
有一个问题没明白,如下:一重循环:
for(i=0;i<n;i++);
所消耗的机器周期数约为3*n
二重循环:
for(i=0;i<m;i++)
for(i=0;i<n;i++);
所消耗的机器周期数约为3*m*n
那么我在设计鸣笛报警时,要发声1600HZ音频与800HZ音频各0.5s
单片机晶振为11.0592MHz
以1600Hz为例:
T=625us,则应该每312us取反一次,延时312所消耗机器周期数N=312/1.085=286,那么由一重循环,n约为100
void delay1600(void)
{
unsigened char n;
for(n=0;n<100;n++);
}
函数即可表示你延时形成1600Hz的音频
同理800Hz,n=200
void delay800(void)
{
unsigened char n;
for(n=0;n<200;n++);
}
那么要让其发声0.5s=500ms,以1600Hz为例,一个震动周期为625us约为0.6ms,
那么一共需要500/0.6=830个声音周期。那么在设计主程序时:
void main(void)
{
unsigned int i;
while(1)
{
for(i=0;i<830;i++)
{
sound=0;
delay1600();
sound=1;
delay1600();
}
//1600Hz音频发声0.5s
for(i=0;i<200;i++)
{
sound=0;
dela800();
sound=1;
delay800();
}
//800Hz音频发声0.5s
}
}
这里我就有一个问题没有明白,为什么800Hz发声0.5s只需要200个声音周期,不是应该是400个?
希望有人可以解答一下。
谢谢!
作者:
飞云居士
时间:
2018-11-24 19:50
800的好像没响0.5是,而是响0.25s
作者:
HC6800-ES-V2.0
时间:
2018-11-25 08:42
C语言算这个是真不容易精确的——汇编要精确一些。
用STC-ISP的软件延时计算器吧,那个专业的就是不一样。
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1