如何解决 无缘蜂鸣器频率 被 数码管刷新干扰
实现步骤:
1、动态刷新数码管,将DS1302寄存器中的值赋给刷新函数用来显示当前时间。
2、定时器0以10ms计时刷新数码管。
3、每小时的0分、0秒-2秒 无缘蜂鸣器响。(闹铃2秒钟)
4、通过按键调整DS1302的初始值,来更改当前时间(或闹钟时间)
遇到问题:
刷新数码管的定时器中断会影响无缘蜂鸣器的声音频率。
调试过程:
一:定时器0刷新数码管,主函数中判断时间,如果时间到就闹钟。
结果:蜂鸣器频率被数码管和按键扫描打乱。
二:另外加了一个定时器1,在main()函数中只做按键扫描,和判断当前时间是否等于闹钟时间。如果是定时器1打开。(TR1 = 1;) 否则关闭定时器1;并将定时器1的优先级高于定时器0 。
结果:发现声音频率还是会被10ms的刷新打断。
请高手点拨!
- #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;
- }
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; 晕死了。
还是要谢谢你、 哈哈
如果没有你的回答, 我就以为还是不行呢。
希望像我一样的新手 以后遇见问题,找到解决的方法并修改代码的时候,一定要小心,认真多看两遍。否则很容易认为是该方法不对。就错过正确的解决问题方法,去找错误的方法了,耽搁时间 白忙乎了。
这个对于单片编程 关键要注意细节问题 我练习编程只要一复杂点 没有一次是一次通过的不是少个括号就是忘个符号 好不容易没有语法错误了 数据设置又动不动出现问题 哎 编程是考验耐心和细心的工作呀
还是一块一块的做,先写一个功能,然后测试。再写另一个功能,在进行测试,然后再把这两个功能结合到一起
其实中断设置优先级这个我也没用过,我习惯都是用自然优先级
经验不错 跟着小编一起学习一下