找回密码
 立即注册

QQ登录

只需一步,快速开始

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

这是一个STC89C52RC单片机秒表程序,哪位大神知道如何加入蜂鸣器实现一秒一响的功能

[复制链接]
跳转到指定楼层
楼主
ID:351979 发表于 2018-6-16 15:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include <reg52.h>

code unsigned char tab[]=

   {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

   //共阳数码管 0-9

unsigned char Dis_Shiwei;//定义十位

unsigned char Dis_Gewei; //定义个位

unsigned char S_Dis_Shiwei;//定义秒十位

unsigned char S_Dis_Gewei; //定义秒个位

unsigned char second,msecond;

void CLR(void);

void delay(unsigned int cnt)

{

while(--cnt);

}

main()

{

EX0=1;//外部中断0设置

IT0=1;

EX1=1;//外部中断1设置

IT1=1;

TMOD |=0x01;//定时器设置 10ms in 12M crystal

TH0=0xd8;

TL0=0xf0;

ET0=1;  //打开中断

TR0=0;

EA=1;

CLR();

while(1)

  {

  P0=S_Dis_Shiwei;//显示秒十位

  P2=0xEF;

  delay(300);//短暂延时

  P0=S_Dis_Gewei; //显示秒个位

  P2=0xF7;

  delay(300);

  P0=0xBF; //显示秒个位

  P2=0xFB;

  delay(300);

  P0=Dis_Shiwei;//显示十位

  P2=0xFD;

  delay(300);//短暂延时

  P0=Dis_Gewei; //显示个位

  P2=0xFE;

  delay(300);

  }

}

/********************************/

/*      定时中断                */

/********************************/

void tim(void) interrupt 1 using 1

{

TH0=0xd8;//重新赋值

TL0=0xf0;

msecond++;

if (msecond==100)

    {

    msecond=0;

    second++;//秒加1

if(second==100)

    second=0;

S_Dis_Shiwei=tab[second/10];//十位显示值处理

    S_Dis_Gewei=tab[second%10]; //个位显示处理

        }

    Dis_Shiwei=tab[msecond/10];//十位显示值处理

    Dis_Gewei=tab[msecond%10]; //个位显示处理

}

void ISR_INT0(void) interrupt 0 using 1

{

TR0=!TR0; //利用外部中断打开和关闭定时器0 用于开始和停止计时

}

void ISR_INT1(void) interrupt 2 using 1

{

if(TR0==0)//停止时才可以清零

   CLR();

}

void CLR(void)

{

second=0; //利用外部中断清零

msecond=0;

Dis_Shiwei=tab[msecond/10];//十位显示值处理

Dis_Gewei=tab[msecond%10]; //个位显示处理

S_Dis_Shiwei=tab[second/10];//十位显示值处理

S_Dis_Gewei=tab[second%10]; //个位显示处理

}

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

使用道具 举报

沙发
ID:352909 发表于 2018-6-16 16:49 | 只看该作者
数据一秒刷新一次的话直接在刷新的时候让他一开一关,可以定义一个变量,让它跟着数据刷新在0,1之间变化,然后判断这个变量的值,决定蜂鸣器开还是关。
回复

使用道具 举报

板凳
ID:97554 发表于 2018-6-16 17:41 | 只看该作者
sbit一个beep位,在秒++那里来一个beep电平100ms左右的变化
回复

使用道具 举报

地板
ID:352925 发表于 2018-6-16 17:42 | 只看该作者
定义deep,用定时器中断让蜂鸣器1秒1响
回复

使用道具 举报

5#
ID:239611 发表于 2018-6-16 17:47 | 只看该作者
我看了你的程序,如果是有源蜂鸣器,最简单的设定是在定时器中断程序中判定msecond<10蜂鸣器响,else蜂鸣器灭(响的时间可以自己实验最佳值),这样有一个bug就是如果你停在msecond<10时蜂鸣器会一直响。
如果是无源蜂鸣器或者不要这个bug,就需要用另一个定时器。
回复

使用道具 举报

6#
ID:352925 发表于 2018-6-16 17:56 | 只看该作者
定义蜂鸣器为beep,然后用定时器中断1秒响一下
回复

使用道具 举报

7#
ID:352975 发表于 2018-6-16 20:25 | 只看该作者
蜂鸣器分有源和无源两种,用法有区别,看了一下程序,同意楼上的观点
回复

使用道具 举报

8#
ID:123003 发表于 2018-6-16 20:37 | 只看该作者
好资料啊
回复

使用道具 举报

9#
ID:341045 发表于 2018-6-16 21:24 | 只看该作者
//前面不用改
//用有源蜂鸣器, P3.7脚接1K电阻通过三极管控蜂鸣器地.
//只在中断处理程序加几条, 其它不用改.每秒响0.1秒
void tim(void) interrupt 1 using 1

{

TH0=0xd8;//重新赋值

TL0=0xf0;

msecond++;

//新加
if (msecond == 10) {
    P3^7 = 0;  //关闭蜂鸣器, 蜂鸣器响10*10=100毫秒
}



if (msecond==100)

    {

    msecond=0;

    second++;//秒加1

    P3^7 = 1;  //新加, 开蜂鸣器, 现在用P3.7, 看你具体有那脚空了

if(second==100)

    second=0;
//...............后面也不改
//...............
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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