完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
本帖最后由 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个回答
|
|
没看到你有设置中断优先级的啊。。。
最佳答案
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
请前辈指点一二~~~~
|
|
|
|
#include
#include"ds1302.h" //#include"smg.h" //--定义使用的IO--// ***it Beep = P3^7 ; #define KEY P1 //8位按键 #define DUAN_SMG P0 //数码管段选 ***it LSA=P2^2; //数码管位选 ***it LSB=P2^3; ***it 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; } |
|
|
|
|
|
|
|
如果你只是想解决这个问题,从硬件入手会简单很多,比如换有源蜂鸣器,给它一个电平就会响,不用频率控制;比如用带锁存的芯片控制数码管,不用一直刷新,数码管会保持住,每秒去更新显示即可。如果是想学习单片机,还是推荐把问题原因找到,这样才能学到东西。
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
《DNESP32S3使用指南-IDF版_V1.6》第四十二章 录音机实验
359 浏览 0 评论
655 浏览 1 评论
714 浏览 2 评论
《DNESP32S3使用指南-IDF版_V1.6》第四十一章 音乐播放器实验
764 浏览 0 评论
709 浏览 1 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
12176 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-1-16 03:12 , Processed in 0.894166 second(s), Total 83, Slave 67 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (威廉希尔官方网站 图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号