微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 如何解决 无缘蜂鸣器频率 被 数码管刷新干扰

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

时间:10-02 整理:3721RD 点击:
功能:数码管时钟,整点报时。按键调整时间。
实现步骤:
1、动态刷新数码管,将DS1302寄存器中的值赋给刷新函数用来显示当前时间。
2、定时器0以10ms计时刷新数码管。
3、每小时的0分、0秒-2秒 无缘蜂鸣器响。(闹铃2秒钟)
4、通过按键调整DS1302的初始值,来更改当前时间(或闹钟时间)
遇到问题:
刷新数码管的定时器中断会影响无缘蜂鸣器的声音频率。
         
调试过程:
一:定时器0刷新数码管,主函数中判断时间,如果时间到就闹钟。
结果:蜂鸣器频率被数码管和按键扫描打乱。
二:另外加了一个定时器1,在main()函数中只做按键扫描,和判断当前时间是否等于闹钟时间。如果是定时器1打开。(TR1  = 1;)          否则关闭定时器1;并将定时器1的优先级高于定时器0 。
结果:发现声音频率还是会被10ms的刷新打断。
请高手点拨!

  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. }

复制代码

T1定时器的优先级能大于T0么?

你好 :
/*******************************************************************************
* 函 数 名         : Timer1Cofig
* 函数功能                   : 配置定时器
*******************************************************************************/
void Timer1Cofig(void)
{
    TH1  =(65536-200)/256;         //设置初始值,定时200uS(55536)
    TL1  =(65536-200)%256;
        PT0=1;                         //定时器1中断优先级为1(共4级,默认0,0 )
    ET1  = 1;                 //打开定时器0中断
    TR1  = 0;                 //初始化不开启定时器0       
}
这是我改过的,但是结果还是一样的

哈哈  我改过后看到您的回复,  问题没有解决。
但是刚才又检查一遍 我在T1中断中  设置了PT0=1;   晕死了。
还是要谢谢你、  哈哈
如果没有你的回答, 我就以为还是不行呢。
  希望像我一样的新手  以后遇见问题,找到解决的方法并修改代码的时候,一定要小心,认真多看两遍。否则很容易认为是该方法不对。就错过正确的解决问题方法,去找错误的方法了,耽搁时间  白忙乎了。

这个对于单片编程 关键要注意细节问题 我练习编程只要一复杂点 没有一次是一次通过的不是少个括号就是忘个符号  好不容易没有语法错误了 数据设置又动不动出现问题 哎 编程是考验耐心和细心的工作呀

还是一块一块的做,先写一个功能,然后测试。再写另一个功能,在进行测试,然后再把这两个功能结合到一起

其实中断设置优先级这个我也没用过,我习惯都是用自然优先级

经验不错 跟着小编一起学习一下

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top