找回密码
 立即注册

QQ登录

只需一步,快速开始

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

想让蜂鸣器只响5秒,怎样改?

  [复制链接]
跳转到指定楼层
楼主
ID:113369 发表于 2016-6-3 17:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

#include"reg52.h"
#define uint unsigned int
#define uchar unsigned char


sbit beep=P3^5;
bit flag;
uint x,y;

void init()                              //初始化,开定时器0
{
         TMOD=0x01;
         TCON=0x10;   
           TH0=(65536-x)/256;     
         TL0=(65536-y)%256;
         IE=0x82;
}

void main()
{
        init();
        while(1)
        {
                while(flag);
                flag=0;
                if(x<50000)
                {
                        y+=500;
                //        x+=50;
                }
                else x=y=100;
        }
}

void timer0() interrupt 1    //定时器中断
{
        flag=0;
        beep=!beep;
        TH0=(65536-x)/256;
        TL0=(65536-y)%256;
}
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:123289 发表于 2016-6-3 19:31 | 只看该作者
本帖最后由 yzwzfyz 于 2016-6-3 19:33 编辑

1、做一个时间中断并计时。
2、在时间中断程序中做一个蜂鸣计时器K。
3、设置一个标记BEEL,当BEEL=1时就起动蜂鸣器,=0时就关闭蜂鸣器。
4、当BEEL=1时(由你在需要蜂鸣的时候置1),时间中断程序进行一次K+1,并判断K是否>=5秒。是:则关闭蜂鸣器,并清BELL=0,K=0。不是:则不处理,即保持现状。
5、主程序MAIN中不需要做什么,只(由你在需要蜂鸣的时候置1)。
回复

使用道具 举报

板凳
ID:123289 发表于 2016-6-3 19:33 | 只看该作者
你的程序问题是:中断程序中缺少一个计时器,对蜂鸣器进行计时。
回复

使用道具 举报

地板
ID:113369 发表于 2016-6-3 20:26 | 只看该作者
yzwzfyz 发表于 2016-6-3 19:31
1、做一个时间中断并计时。
2、在时间中断程序中做一个蜂鸣计时器K。
3、设置一个标记BEEL,当BEEL=1时就 ...

可以帮忙修改一下吗?
回复

使用道具 举报

5#
ID:123289 发表于 2016-6-3 21:09 | 只看该作者
说到这个份上了,你应当自己做了。
回复

使用道具 举报

6#
ID:124970 发表于 2016-6-3 21:47 | 只看该作者
最简单的方法,写个delay_ms的函数,放在while里,在增加个计数变量,计数5000次退出while,这样比你直接在while计数,定时准确度要高一点,就行了!
回复

使用道具 举报

7#
ID:125016 发表于 2016-6-4 10:34 | 只看该作者
做一个delay延迟函数
5秒就是5000ms
void delay(uint x)
{
    uint i,j;
    for(i=x;i>0;i--)
        for(j=110;j>0;--);
}
定义蜂鸣器为fmq=
void fmq0()
{
    fmq=0;
    delay(5000);
    fmq=1;
}
回复

使用道具 举报

8#
ID:125038 发表于 2016-6-4 11:04 | 只看该作者
本帖最后由 TIMEKILLER 于 2016-6-4 11:20 编辑

因为定时器0的定时时间是不断变化的,所以就简单考虑,你需要再用一个定时器1,来对定时器0的中断开关进行控制。为了增强实时性,可以不用定时器1中断,在定时器0中断里对定时器1的TH1/TL1寄存器当前值进行判断。int i ;
if(((TH1<<8+TL1)>=50000)&&i<10)
{
    i++;
    TH1=0;
    TL=0;
}
else
{  
    ET0=0;/*时间到,关掉定时器0中断,蜂鸣器停止*/
    i=0;
    TH1=0;
    TL1=0;
}
回复

使用道具 举报

9#
ID:125115 发表于 2016-6-4 19:03 | 只看该作者
延时5s
回复

使用道具 举报

10#
ID:125128 发表于 2016-6-4 20:34 | 只看该作者
用计时器计数时间5s后条件循环停止
回复

使用道具 举报

11#
ID:125162 发表于 2016-6-5 00:21 | 只看该作者
需要计时器
回复

使用道具 举报

12#
ID:125168 发表于 2016-6-5 02:33 | 只看该作者
停timer0
回复

使用道具 举报

13#
ID:110895 发表于 2016-6-5 10:20 | 只看该作者
做个定时5S的定时器,启动定时器时,让蜂鸣器响,定时到时让蜂鸣器停,同时停定时器。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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