本帖最后由 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"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;
}
一周热门 更多>