找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1671|回复: 2
收起左侧

关于单片机延时时间的C语言代码问题

[复制链接]
ID:214223 发表于 2018-11-23 10:44 | 显示全部楼层 |阅读模式
有一个问题没明白,如下:一重循环:
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个?
希望有人可以解答一下。
谢谢!
回复

使用道具 举报

ID:404160 发表于 2018-11-24 19:50 | 显示全部楼层
800的好像没响0.5是,而是响0.25s
回复

使用道具 举报

ID:164602 发表于 2018-11-25 08:42 | 显示全部楼层
C语言算这个是真不容易精确的——汇编要精确一些。
用STC-ISP的软件延时计算器吧,那个专业的就是不一样。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表