这是我在“2020年7月初学校组织的时长一周的项目”中做的项目,提前一周的周三开始从咱论坛里参考了几个单独分开的项目来做的。由于是提前自己做的,第一天上午讲解软件安装的的时候就完成了所需要做的项目。但硬件方面只用到了C51和LCD12864,讲解项目的时候又加了一些其他的一些诸如管理时间的DS1302,管理温度的DS18B20。又把项目重做了一遍,做完之后还有点时间顺便做了做其他的几个功能。分享之前先对个人的项目进行说明:
- 由于特殊原因,上的是网课,不在学校,所以并没有在开发板上测试,只是在仿真里可以运行。
- 项目所用到的知识点:矩阵键盘、T0中断、LCD12864的使用(显示屏,无字库)、DS1302的使用(读写当前时间)。(DS18B20只是一个温度的数值,所以交给辅助去做了,嗯,然后就没加)。
- 个人认为:适合拿来简单参考了解一下功能是如何实现的,不适用于研究或钻研细节方面的东西。
- 一开始源文件只是一个.c文件,只用到了T0中断来控制秒表、闹钟以及时间,并用四个直接连在C51引脚上的按钮来实现功能。
但是后来听课了解了一丁点#include命令后,将项目拆分成了各个头文件,并加入了控制时间的DS1302来代替T0管理时间模块。
按钮也从单独的直接连接C51的引脚,换为了一个3*3的矩阵键盘。由于矩阵键盘没有办法检测按下两个键以上的情况,所以在功能多的前提下按键的安排(哪个按键管什么功能)就开始“放飞自我”:出于做学校项目的目标是及格,所以并没有仔细去规划哪个按钮控制哪个功能,使用方法详见附件内的"说明.docx"或"说明.pdf",这里面简要介绍了功能如何使用。 - 有关代码的解释只有项目文件的注释。
- 仿真图我用的是:ISIS7 Professional,项目文件是Keil uVision4
- 我觉得这个不难实现。做之前啥也不会,慢慢了解了LCD12864是如何输出的,DS1802是如何读出时间、写入时间的;以及矩阵键盘的原理后,很快很容易的就能够做出来项目,详细请百度或参考书籍文献或自行研究别人的项目。
一、功能:
二、代码:
main.c:
- #include<reg52.h>
- #include"dingyi.h" //引脚以及宏定义
- #include"key.h" //检测按键,以及根据按键去做什么。
- #include"clock.h" //DS1302的使用
- #include"LCD12864.h" //包含LCD12864的最基本的使用函数。
- #include"LCD12864_use.h" //这里面包含了对LCD12864.h中写的函数的使用的函数,例如:调用kaifazhe()就能再LCD12864上输出开发者;调用ShowTime(...)可以根据参数输出时间等。
- #include"music.h" //这个用来播放音乐以及闹钟播放
- #include"show.h" //这个用来配合按键输出的,还未写入,所以没用
- unsigned char nowkey; //检测到的当前按下的值
- unsigned char state_key[3]={0,0,0}; //当前模块,按钮4可切换的最大值,按钮4当前状态(切换更改的数值)
- unsigned char clock_time[6]={0,0,0,0x31,1,0x20}; //秒、分、时、日、月、年
- unsigned char alarm[4]={1,10,45,23}; //闹钟启动状态,秒、分、时
- unsigned char chronograph[6]={0,0,0,0,0,0}; //百分秒、秒、分钟、小时、开启状态、暂停状态
- unsigned char music[4]={0,0,0,0}; //音乐开关状态、当前音乐、高八位、低八位
- unsigned int pwd; //按键检测模式计数用
- /************************************************************************
- *函数名:initT0()
- *函数功能:初始化T0,让T0处于一开就能使用的状态
- *形式参数:无
- *返回值:
- *用途:初始化
- *************************************************************************/
- void initT0()
- {
- TMOD=0x01; //定时器T0工作在方式1,定时模式
- TH0=(65536-10000)/256; //一次中断10ms
- TL0=(65536-10000)%256;
- EA=1; //开总中断
- ET0=1; //定时器T0允许中断
- TR0=0; //定时器初始处于关闭状态
- }
- /************************************************************************
- *函数名:initMain()
- *函数功能:初始化T0,lcd,时钟,让T0处于一开就能使用的状态
- *形式参数:无
- *返回值:
- *用途:初始化
- *************************************************************************/
- void initMain()
- {
- init_lcd();
- Clock_Fresh(clock_time);
- Clock_Initial(clock_time);
- initT0();
- state_key[0]=0; //按键状态初始化
- state_key[1]=0;
- state_key[2]=0;
- alarm[0]=1; //alarm初值这样赋只是方便演示,当然这么写很不严谨!!!。闹钟设定开启
- alarm[1]=0; //秒→0
- alarm[2]=clock_time[1]/16*10+clock_time[1]%16+1; //分→系统时间下一分,如果此时是59分很明显59+1就溢出了
- alarm[3]=clock_time[2]/16*10+clock_time[2]%16; //时→当前时
- chronograph[0]=0;
- chronograph[1]=0;
- chronograph[2]=0;
- chronograph[3]=0;
- chronograph[4]=0;
- chronograph[5]=0;
- music[0]=0;
- music[1]=1; //初始化闹钟的铃声是第二首歌曲“梦中的婚礼”
- music[2]=0;
- music[3]=0;
- }
- /************************************************************************
- *函数名:main()
- *函数功能:执行主函数
- *形式参数:无
- *返回值:
- *用途:顺序执行编写好的程序,中间有可能被T0中断
- *************************************************************************/
- void main()
- {
- REBEGIN: //恢复出场设置时用
- initMain();
- Clr_Scr();
- kaifazhe(); //这个加到这里之后删不掉了。。。删除掉反而提示内存溢出。。。
- while(1)
- {
- if(alarm[0]==1) //检查闹钟
- if(clock_time[2]%16+clock_time[2]/16*10==alarm[3]&&
- clock_time[1]%16+clock_time[1]/16*10==alarm[2]&&
- clock_time[0]%16+clock_time[0]/16*10==alarm[1]
- )
- {
- Clr_Scr();
- music[0]=1;
- while(~puzi(music)); //如果按下了7键返回1才能往下执行
- music[0]=0;
- TR0=0;
- alarm[0]=0;
- Clr_Scr();
- }
- nowkey=keyyyy(); //检测当前键
- dosomething(nowkey,state_key,clock_time,alarm,chronograph,music); //根据当前键对数值进行改变
- //下面本来想也封装个函数,写到show.h中,但是没时间了,就不写封装了。
- if(state_key[0]==0) //0.显示模式
- {
- Clock_Fresh(clock_time); //时间刷新
- ShowTime(10,alarm[0],clock_time,7); //输出时间
- }
- else if(state_key[0]==1) //1.秒表
- {
- if(chronograph[state_Chronograph_Show_Pause]==0) //如果此时处于不处于暂停状态才播放,
- //这里会导致换个模式后如果还是处于暂停状态
- MiaoBiao(chronograph[3],chronograph[2],chronograph[1],chronograph[0]); //秒表模式显示
- }
- else if(state_key[0]==2) //2.编辑时间
- {
- Clock_Fresh(clock_time); //时间刷新
- ShowTime(state_key[2],alarm[0],clock_time,7); //状态2输出编辑模式时间
- }
- else if(state_key[0]==3) //3.编辑闹钟
- {
- ShowAlarm(alarm[0],state_key[2],alarm[3],alarm[2],alarm[1]); //闹钟状态显示
- }
- else if(state_key[0]==4) //4.音乐盒
- {
- showmusic(music[1]); //音乐模式显示
- }
- else if(state_key[0]==5) //5.电子琴
- {
- while(1)
- {
- TR0=0;
- pwd=0;
- nowkey=keyyyy(); //检查按下的哪个键
- music[2]=FREQH[nowkey+7]; //高八位赋初值
- music[3]=FREQL[nowkey+7]; //低八位赋初值
- showkey(nowkey);
- TR0=1; //启动T0中断
- music[0]=1; //允许播放音乐
- while(nowkey!=0&&nowkey==keyyyy())
- {
- delay(1); //当有键按下,每1ms左右pwd+1(1s=1000ms)
- pwd++;
- if(pwd>3000&&nowkey==9) //9键按下了3s左右,关闭T0中断(不再响),进入内部函数
- {
- TR0=0;
- kaifazhe2();
- }
- }
- TR0=0;
- music[0]=0;
-
- if(pwd>3000)goto NEXT; //while内部结束后检测按键按下了几秒,如果超过了3s,跳转到NEXT
-
- }
- NEXT:
- Clr_Scr();
- state_key[0]=0;
- }
- else ;
- if(nowkey==9) //检查按下的按键是否是9,是的话需要按下3s左右,恢复出厂设置
- {
- pwd=0;
- for(pwd=0;pwd<300;pwd++)
- {
- delay(10);
- if(keyyyy()==nowkey);
- else goto MAINEND;
- }
- goto REBEGIN;
- }
- MAINEND:;
- }
- }
- void T0int()interrupt 1
- {
- if(music[0]==1) //T0启动,检查是否要播放音乐
- {
- TH0=music[2];
- TL0=music[3];
- P3_7=~P3_7;
- }
- else if(chronograph[state_Chronograph_On_Off]==1) //否则再检测是否要启动秒表
- {
- //给下一次定时赋值
- TH0=(65536-10000)/256; //高八位赋初值
- TL0=(65536-10000)%256; //低八位赋初值
- chronograph[chronograph_10ms]++; //加百分之一秒,然后进行溢出判断以及处理
- if(chronograph[chronograph_10ms]>98)
- {
- chronograph[chronograph_10ms]=0;
- chronograph[chronograph_sec]++;
- if(chronograph[chronograph_sec]>59)
- {
- chronograph[chronograph_sec]=0;
- chronograph[chronograph_min]++;
- }
- if(chronograph[chronograph_min]>59)
- {
- chronograph[chronograph_min]=0;
- chronograph[chronograph_hour]++;
- }
- if(chronograph[chronograph_hour]>23)
- {
- chronograph[chronograph_hour]=0;
- }
- }
- }
- else
- {
- TR0=0; //在不播放音乐,不启动定时器的状态下开启了定时器,则关闭定时器。
- }
- }
复制代码
三、问题:
如mian.c代码:第75行,明明删掉一整个函数调用却提示溢出,如图:
个人在项目展示前写好了两个输出函数用来展示,但是当时也是只能放一个到主函数中,再放会溢出。后来改了改部分代码,又加了几个按钮功能才把两个输出函数都加进去。现在的状态是想删删不掉,又没想去对这个项目文件进行优化、或者深入,所以不对其进行处理。下次做小项目的时候得提前做好代码层细节上的优化,这次就不再对项目进行修改了。
四、压缩包内文件说明:
项目文件:
仿真图:
全部资料51hei下载地址:
万年历(闹钟)+秒表+音乐盒+电子琴.zip
(295.56 KB, 下载次数: 96)
|