本帖最后由 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的刷新打断。
请高手点拨!!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
- #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;
- }
复制代码一周热门 更多>