找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1533|回复: 5
打印 上一主题 下一主题
收起左侧

51单片机初学,定时器程序问题求助 让蜂鸣器件实现发出2种不同声响

[复制链接]
跳转到指定楼层
楼主
ID:995267 发表于 2022-6-1 11:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我想实现的是用定时器去让蜂鸣器件实现发出2种不同声响,每种响声持续0.4s,定时器控制0.5秒切换一次响声。我在软件上仿真是能响,可是时间老是对不上。请大神帮我看看是仿真本来时间就不是那么准确,还是我写的有问题..

这是实现这部分功能的单片机代码

蜂鸣器函数
void delay(unsigned char ms)
{                                                
        unsigned char i;
        while(ms--)
        {
                for(i = 0; i < 120; i++);
        }
}

void fb500()
{
unsigned char i;
for(i=0;i<200;i++)
    {
     P14=1;
     delay(1);
     P14=0;
         delay(1);
         }
}
void fb250()
{
unsigned char i;
for(i=0;i<100;i++)
    {
     P14=1;
     delay(2);
     P14=0;
         delay(2);
         }
}

主函数
void main{        TMOD=0x01;
        TL0=(65536-50000)/256;
        TH0=(65536-50000)%256;
        ET0=1;
        EA=1;
        TR0=1;
        while(1);
                   }


中断
void time1_serv(void) interrupt 1
{
TL0=(65536-50000)/256;
TH0=(65536-50000)%256;
j++;                     //j是我设置的全局变量,初值为0
if(j==10)
{j=0;
if(n==1)
{
n=~n;
fb500();
}
else
{
n=~n;
fb250();
}
}
}

我的想法是设置中断50毫秒,10次定时器中断便运行一次蜂鸣器的函数。然后蜂鸣器是周期乘循环次数等于响的时间,不知道对不对,望各位指点。

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:995267 发表于 2022-6-1 11:57 | 只看该作者
求大佬点拨,时间算法是否有问题,仿真软件上时间对不上
回复

使用道具 举报

板凳
ID:301191 发表于 2022-6-1 17:31 | 只看该作者
顶一下
回复

使用道具 举报

地板
ID:123289 发表于 2022-6-1 17:36 | 只看该作者
帮你构思一下:
按你的设计,时间中断每50ms一次。
做一个变量BETIME,用于计时蜂鸣时间,如下操作:
例:蜂鸣0.8秒:
起动蜂鸣,同时让BETIME=0.8s/50ms=16
时间中断程序如下写法:
1、如果BETIME=0(无蜂鸣操作),什么也不做,退出。
2、如果BETIME<>0(蜂鸣已起鸣),BETIME=BETIME-1,再测:
如果,BETIME<>0(时间未到),什么也不做,退出。
如果,BETIME=0(时间到了),关蜂鸣。

简单吧。

回复

使用道具 举报

5#
ID:213173 发表于 2022-6-1 18:19 | 只看该作者
模拟警笛声 滴---嘟---
  1. #include <reg51.h>

  2. sbit buzzer=P1^0; //无源蜂鸣器  

  3. unsigned int count;

  4. void main ()
  5. {         
  6.         TMOD= 0x01;                //设置定时器模式
  7.         TL0 = 0x38;                //设置定时初始值
  8.         TH0 = 0xFF;                //设置定时初始值
  9.         TR0 = 1;                //定时器0开始计时
  10.         EA  = 1;                //开总中断
  11.         ET0 = 1;                //开T0中断
  12.         while(1);
  13. }

  14. void Timer0Interrupt(void) interrupt 1
  15. {
  16.         buzzer=~buzzer;

  17.         if(++count>=3000)
  18.                 count=0;
  19.         if(count<2000)
  20.         {
  21.                 TL0 = 0x38;                //200微秒
  22.                 TH0 = 0xFF;
  23.         }
  24.         else
  25.         {
  26.                 TL0 = 0x70;                //400微秒
  27.                 TH0 = 0xFE;
  28.         }
  29. }

复制代码
回复

使用道具 举报

6#
ID:329625 发表于 2022-6-8 19:59 | 只看该作者
对蜂鸣器的频率做出不同变化即可完成
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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