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

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-15 21:24
  1. #include<reg51.h>
  2. #include"ds1302.h"
  3. //#include"smg.h"

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

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

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

  28. /*******************************************************************************
  29. * 函 数 名         : main
  30. * 函数功能                   : 主函数
  31. * 输    入         : 无
  32. * 输    出         : 无
  33. *******************************************************************************/
  34. void main()
  35. {          
  36.     EA=1;//打开总中断
  37.         TMOD = 0x11;     //定时器0选择工作方式1
  38. //        //Ds1302Init();  //---初始化DS1302.写入初始值--- 注释后,断电重启不被初始化
  39.         Timer0Cofig();
  40.         Timer1Cofig();
  41.         while(1)
  42.         {       
  43.                  KEY_Scan();
  44.                  if (TIME[1]==0x10&&TIME[0]<0x05)
  45.                  {          
  46.                         TR1  = 1;                 //启动定时器0                               
  47.                  }else{
  48.                           TR1  = 0;                 //启动定时器0
  49.                  }
  50.         }       
  51. }

  52. /*******************************************************************************
  53. * 函 数 名         : Timer0Cofig
  54. * 函数功能                   : 配置定时器
  55. * 输    入         : 无
  56. * 输    出         : 无
  57. *******************************************************************************/
  58. void Timer0Cofig(void)
  59. {
  60.     TH0  = 0xd8;         //设置初始值,定时10MS
  61.     TL0  = 0xf0;
  62.     ET0  = 1;                 //打开定时器0中断
  63.     TR0  = 1;                 //启动定时器0       
  64. }

  65. /*******************************************************************************
  66. * 函 数 名         : Timer0
  67. * 函数功能                   : 定时器0中断函数
  68. *******************************************************************************/                  
  69. void Timer0() interrupt 1
  70. {
  71.     TH0  = 0xd8;         //设置初始值,定时10MS(55536)
  72.     TL0  = 0xf0;
  73.             Ds1302ReadTime(); //---读取时钟信息---
  74.                 DisplayData[0] = SMG_CODE[TIME[2]/16];                                //时
  75.                 DisplayData[1] = SMG_CODE[TIME[2]&0x0f];                                 
  76.                 DisplayData[2] = 0x40;
  77.                 DisplayData[3] = SMG_CODE[TIME[1]/16];                                //分
  78.                 DisplayData[4] = SMG_CODE[TIME[1]&0x0f];       
  79.                 DisplayData[5] = 0x40;
  80.                 DisplayData[6] = SMG_CODE[TIME[0]/16];                                //秒
  81.                 DisplayData[7] = SMG_CODE[TIME[0]&0x0f];
  82.                 DigDisplay();                                                                         //  使用数码管显示
  83. }
  84. /*******************************************************************************
  85. * 函 数 名         : Timer1Cofig
  86. * 函数功能                   : 配置定时器
  87. *******************************************************************************/
  88. void Timer1Cofig(void)
  89. {
  90.     TH1  =(65536-200)/256;         //设置初始值,定时200uS(55536)
  91.     TL1  =(65536-200)%256;
  92.     ET1  = 1;                 //打开定时器0中断
  93.     TR1  = 0;                 //初始化不开启定时器0       
  94. }
  95. /*******************************************************************************
  96. * 函 数 名         : Timer1
  97. * 函数功能                   : 定时器1中断函数
  98. *******************************************************************************/                  
  99. void Timer1() interrupt 3
  100. {
  101.     TH1  = (65536-200)/256;         //设置初始值,定时200uS(55536)
  102.     TL1  =(65536-200)%256;
  103.         Beep=~Beep;
  104. }
复制代码

一周热门 更多>