如何解决无缘蜂鸣器频率 被数码管刷新干扰

2019-07-15 12:21发布

本帖最后由 4147313 于 2016-12-12 15:47 编辑

功能:数码管时钟,整点报时。按键调整时间。

实现步骤:
1、动态刷新数码管,将DS1302寄存器中的值赋给刷新函数用来显示当前时间。
2、定时器0以10ms计时刷新数码管。
3、每小时的0分、0秒-2秒 无缘蜂鸣器响。(闹铃2秒钟)
4、通过按键调整DS1302的初始值,来更改当前时间(或闹钟时间)

遇到问题:
刷新数码管的定时器中断会影响无缘蜂鸣器的声音频率。
         



调试过程:
一:定时器0刷新数码管,主函数中判断时间,如果时间到就闹钟。
结果:蜂鸣器频率被数码管和按键扫描打乱。

二:另外加了一个定时器1,在main()函数中只做按键扫描,和判断当前时间是否等于闹钟时间。如果是定时器1打开。(TR1  = 1;)          否则关闭定时器1;并将定时器1的优先级高于定时器0 。
结果:发现声音频率还是会被10ms的刷新打断。

请高手点拨!!

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
8条回答
4147313
2019-07-16 02:21
#include<reg51.h>
#include"ds1302.h"
//#include"smg.h"

//--定义使用的IO--//
sbit Beep =  P3^7 ;
#define KEY P1                   //8位按键
#define DUAN_SMG P0 //数码管段选
sbit LSA=P2^2;                   //数码管位选
sbit LSB=P2^3;
sbit LSC=P2^4;

//--定义全局变量--//
unsigned char keyTime; //保存按键时间长短
unsigned char DisplayData[8];        //用来存放要显示的8位数的值
unsigned char SMG_CODE[17]={          //数码管显示十进制数值
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

//--声明使用到的函数--//
void DigDisplay();                                //刷新数码管
void Delay10ms(unsigned int c);        //延时函数
void delay(unsigned int i);
void Timer0Cofig(void);                        //初始化定时器0
void Timer1Cofig(void);                        //初始化定时器1
void KEY_Scan();                                   //扫描按键
unsigned char IncBcdLow(unsigned char bcd);          
unsigned char IncBcdHigh(unsigned char bcd);        //加时间
unsigned char DecBcdLow(unsigned char bcd);                //减时间
unsigned char keyTimeOK();                //按键时长

/*******************************************************************************
* 函 数 名         : main
* 函数功能                   : 主函数
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void main()
{          
    EA=1;//打开总中断
        TMOD = 0x11;     //定时器0选择工作方式1
//        //Ds1302Init();  //---初始化DS1302.写入初始值--- 注释后,断电重启不被初始化
        Timer0Cofig();
        Timer1Cofig();
        while(1)
        {       
                 KEY_Scan();
                 if (TIME[1]==0x10&&TIME[0]<0x05)
                 {          
                        TR1  = 1;                 //启动定时器0                               
                 }else{
                          TR1  = 0;                 //启动定时器0
                 }
        }       
}

/*******************************************************************************
* 函 数 名         : Timer0Cofig
* 函数功能                   : 配置定时器
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void Timer0Cofig(void)
{
    TH0  = 0xd8;         //设置初始值,定时10MS
    TL0  = 0xf0;
    ET0  = 1;                 //打开定时器0中断
    TR0  = 1;                 //启动定时器0       
}

/*******************************************************************************
* 函 数 名         : Timer0
* 函数功能                   : 定时器0中断函数
*******************************************************************************/                  
void Timer0() interrupt 1
{
    TH0  = 0xd8;         //设置初始值,定时10MS(55536)
    TL0  = 0xf0;
            Ds1302ReadTime(); //---读取时钟信息---
                DisplayData[0] = SMG_CODE[TIME[2]/16];                                //时
                DisplayData[1] = SMG_CODE[TIME[2]&0x0f];                                 
                DisplayData[2] = 0x40;
                DisplayData[3] = SMG_CODE[TIME[1]/16];                                //分
                DisplayData[4] = SMG_CODE[TIME[1]&0x0f];       
                DisplayData[5] = 0x40;
                DisplayData[6] = SMG_CODE[TIME[0]/16];                                //秒
                DisplayData[7] = SMG_CODE[TIME[0]&0x0f];
                DigDisplay();                                                                         //  使用数码管显示
}
/*******************************************************************************
* 函 数 名         : Timer1Cofig
* 函数功能                   : 配置定时器
*******************************************************************************/
void Timer1Cofig(void)
{
    TH1  =(65536-200)/256;         //设置初始值,定时200uS(55536)
    TL1  =(65536-200)%256;
    ET1  = 1;                 //打开定时器0中断
    TR1  = 0;                 //初始化不开启定时器0       
}
/*******************************************************************************
* 函 数 名         : Timer1
* 函数功能                   : 定时器1中断函数
*******************************************************************************/                  
void Timer1() interrupt 3
{
    TH1  = (65536-200)/256;         //设置初始值,定时200uS(55536)
    TL1  =(65536-200)%256;
        Beep=~Beep;
}

一周热门 更多>