标题: 这是一个STC89C52RC单片机秒表程序,哪位大神知道如何加入蜂鸣器实现一秒一响的功能 [打印本页]

作者: akm666    时间: 2018-6-16 15:25
标题: 这是一个STC89C52RC单片机秒表程序,哪位大神知道如何加入蜂鸣器实现一秒一响的功能
#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]; //个位显示处理

}


作者: yangzhuhao    时间: 2018-6-16 16:49
数据一秒刷新一次的话直接在刷新的时候让他一开一关,可以定义一个变量,让它跟着数据刷新在0,1之间变化,然后判断这个变量的值,决定蜂鸣器开还是关。
作者: 杨雪飞    时间: 2018-6-16 17:41
sbit一个beep位,在秒++那里来一个beep电平100ms左右的变化
作者: 浩蒙帝    时间: 2018-6-16 17:42
定义deep,用定时器中断让蜂鸣器1秒1响
作者: botgs    时间: 2018-6-16 17:47
我看了你的程序,如果是有源蜂鸣器,最简单的设定是在定时器中断程序中判定msecond<10蜂鸣器响,else蜂鸣器灭(响的时间可以自己实验最佳值),这样有一个bug就是如果你停在msecond<10时蜂鸣器会一直响。
如果是无源蜂鸣器或者不要这个bug,就需要用另一个定时器。
作者: 浩蒙帝    时间: 2018-6-16 17:56
定义蜂鸣器为beep,然后用定时器中断1秒响一下

作者: bowen2012    时间: 2018-6-16 20:25
蜂鸣器分有源和无源两种,用法有区别,看了一下程序,同意楼上的观点
作者: jiangming1313    时间: 2018-6-16 20:37
好资料啊
作者: lzts88    时间: 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;
//...............后面也不改
//...............




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1