单片机课设电子秒表文档格式.docx
- 文档编号:20168356
- 上传时间:2023-01-17
- 格式:DOCX
- 页数:34
- 大小:322.17KB
单片机课设电子秒表文档格式.docx
《单片机课设电子秒表文档格式.docx》由会员分享,可在线阅读,更多相关《单片机课设电子秒表文档格式.docx(34页珍藏版)》请在冰豆网上搜索。
8程序清单11
8.1数码管驱动程序11
8.2按键驱动程序13
8.3定时器程序16
8.4应用层程序19
8.5主函数23
参考文献25
1基本设计任务
1.1任务简介
为指针式和数字式两种类型。
指针式计时器是传统的显示方式,指示的时间精确度较低;
而数字式计时器则直接用数字显示时间,读数直观,一般可精确到秒,并且具有较多的实用功能。
设计要求利用单片机完成较为精确的计时操作,并能根据情况对其功能进行扩展。
1.2设计基本要求
⑴系统硬件设计:
根据任务要求,完成单片机最小系统及其扩展设计,组成功能完整的系统;
⑵系统软件设计:
根据数字电子计时器功能,完成控制软件的编写与调试;
⑶基本功能:
①上电时显示时、分、秒为全0;
②设置一个控制按键,按下按键,则时钟以秒为单位开始计时;
③运行状态下可通过控制按键使时钟暂停,同时显示已计时数值;
④停止状态下(已上电),按下复位按钮,时钟复位(清零),并进入下一次计时状态。
1.3附加功能
根据实际情况自由添加附加功能,如电子时钟、万年历及语音报时等功能。
2方案论证
如果只是显示跑表的话四位数码管满足需求,但是要显示时钟的话有时、分秒三个数据需要显示,而实验板上只有四位数码管。
现在可以选择的方案有三种方案选择。
1、用滚动字幕来实现,每个一分钟切换一次显示。
2、用按键来切换显示,按键后可切换至显示时或分秒。
3、用四位数码管显示时和分,用LED灯来显示秒的显示。
考虑到使用LED灯闪烁来显示秒的走时,比较直观,且可以一次性实现时分秒的显示,所以选用第三种方案。
3硬件设计
3.1总电路图
3.2单片机电路
3.3数码管显示电路
3.4按键电路
3.5电源电路
3.6蜂鸣器电路
4软件设计
4.1状态分析
4.1.1主界面状态
状态名称
编号
状态介绍
转换条件
主界面状态
四位数码管显示时分,LED灯闪烁
按下菜单选择键
2、主菜单状态
主菜单状态
1
屏幕显示系统主菜单,可以通过按键调整选中菜单项目
按上下选择键;
按确认/退出键;
3、跑表功能
跑表功能状态
2
屏幕显示跑表数据
按下确认/退出键
4、系统时间设置
系统时间设置状态
3
屏幕显示时钟,时钟停表,按菜单选择键切换调整时或分,改位闪烁
4.2系统事件分析
名称
说明
设置键按下事件
按键1按下
上翻键按下
按键2按下
下翻键按下
按键3按下
4
确定/退出键短按下
按键4按下
4.3数据存储及缓冲区分配
数据类型
存放位置
字节数
功能
Sys_State
uchar
data
系统状态寄存器
ClockHour
时钟’时’数据寄存器
ClockMinute
时钟’分’数据寄存器
Event_FIFO[8]
8
系统事件缓冲区
Event_WrIp
写事件指针
Keyin_Buf
键读入的缓冲区
Keychk_Buf
键检测寄存器
Keycvt_Buf
键转换寄存器
Keyoldcvt_Buf
旧键转换寄存器
Keyvlu_Buf
键值寄存器
Key_DeFlag
按键延时时间到标志
Keychk_Time
键时间寄存器
ButtonDown
有键按下标志
StWatchStartFlag
bit
bdata
跑表暂停开始标志
ScanTime_Flag
数码管刷新延时标志
WrKey_Flag
0.1
写键时间标志
4.4各个模块流程图
4.4.1数码管显示流程图
4.4.2按键驱动流程图
4.4.3应用层流程图
4.4.4主程序流程图
5小结
本次设计主要是实现时钟以及跑表的相关功能,并且添加了时钟调整,跑表停止和复位,以及菜单选择等功能。
相对原理比较简单,但是在实现时也存在着很多难点,利用标志位将每一个独立的功能相连接,最终实现一系列完整的功能。
6体会
都说大学的学习注重的是自己自主学习能力和动手能力,相比之前做过的课程设计这一次的单片机课程设计很是不同,之前数模电课程设计是自己动手按照自己画的原理图做电路板,在这个过程中考验的是动手能力,以及专业知识的运用,而这次的课设主要任务式在电脑上编写程序,实现一定的功能,相对于数模电课设来说这次的任务在体力上轻松一些,但是不要以为它很简单,真正动手后才发现有很多困难的地方。
在老师所给的题目中我选择做的电子时钟。
老师很早就把任务布置下来了,本来是要去年做的,但是由于课程一直很紧直到前几周我们才开始动手,由于以前很少自己独立动手写程序,第一次上手很难,总是不知道该怎么弄,后来请教了一些学得好的同学,他告诉我一个方法就是,先把你要做的东西的功能用笔写下来,然后把它们之间的关系搞清楚,画出流程图,然后在开始写程序,果然按照他这个方法我感觉明朗多了。
虽然最终的程序有很多都是借鉴别人的,但是我在这个过程中把他们都弄懂搞明白了,在这次做课设的过程中我不仅把之前的单片机知识进行了巩固,同时也学到了很多编程的技巧,对我的编程能力有了很大的提升,还有就是同学之间的相互帮助也是十分重要的,相信这次课程设计对我以后的学习工作都会有很大的帮助!
7改进意见
本来在做的时候还想再加上温度显示的功能,但是一加上之后就会影响到数码管的显示,数码管会出现闪烁的现象,所以就又去掉了。
还有一点就是在调整时间时候对应调整的时或分位上没有闪烁,不能很好的指示是调整的是哪一位,以后需要再改进。
8程序清单
8.1数码管驱动程序
文件名:
LedDisp.c
/*************************************************
//函数名:
MnLed()
//功能描述:
LED数码管动态扫描扫描函数
************************************************/
#include<
reg51.h>
#defineucharunsignedchar
#defineuintunsignedint
//==========================================================
//宏定义
#defineLedNum4//数码管个数
#defineDataPortP1//段口
#defineComPortP0//位口(4bit)
//定义变量
bitbdataScanTime_Flag=1;
//扫描时间,根据实际情况调整
uchardataScanBitCnt;
//扫描位数
uchardataLedDispBuff[LedNum];
//4个数码管
uchardataLedDisp_menu=0;
externuchardataStWatch_MSec;
externuchardataStWatch_Sec;
externuchardataStWatch_MSecCnt;
//===========================================================
uchardataClockSecond;
//分计时单元
uchardataClockMinute;
//秒计时单元
uchardataClockHour;
uchardatamenu=1;
//================共阳数码管表==================//段选
uchardataCODE[]={0xc0,0xf9,0xa4,0xb0,//0-01-12-23-3
0x99,0x92,0x82,0xf8,//4-45-56-67-7
0x80,0x90,0x88,0x83,//8-89-910-A11-b
0xc6,0xa1,0x86,0x8e,//12-C13-D14-E15-F
0x8c,0xc1,0x89,0xc7,//16-P17-U18-H19-L
0xbf,0x91,0x92,0xf7,//20--21-y22-S23-_
0x8b,0xc2,0xa3,0xff//24-h25-G26-o27-空
};
//===================位选表==================================
uchardataComPort_CODE[]={0xfe,0xfd,0xfb,0xf7,
0xef,0xdf,0xbf,0x7f
};
//数码管位显示选择
//============================================================
//子函数声明
voidLed_DispBuff();
//获得显示内容
voidLed_Display();
//将显示内容送去显示
//接口主函数
voidMn_LED_Driver()
{
if(ScanTime_Flag==1)//事件标志位有效(扫描时间到)
{
ScanTime_Flag=0;
//清除标志位,然后再具体操作
Led_DispBuff();
//获得数据
Led_Display();
//把数据送去显示
}
}
//显示缓冲区
voidClock(uchara,ucharb)//时间相关显示驱动
LedDispBuff[0]=a/10;
//将分的高位存入显示缓冲区
LedDispBuff[1]=a%10;
//将分的低位存入显示缓冲区
LedDispBuff[2]=b/10;
//将秒的高位存入显示缓冲区
LedDispBuff[3]=b%10;
voidMenuDisp(uchara,ucharb,ucharc,uchard)//菜单相关显示驱动
{
LedDispBuff[0]=a;
//显示第一个数码管
LedDispBuff[1]=b;
//显示第二个
LedDispBuff[2]=c;
//显示第三个
LedDispBuff[3]=d;
//显示第四个
voidLed_DispBuff()//显示接口
switch(LedDisp_menu)
case0:
{Clock(ClockHour,ClockMinute);
break;
}//时钟显示
case1:
{Clock(StWatch_Sec,StWatch_MSec);
}//跑表显示
case2:
{MenuDisp(16,20,menu,27);
}//菜单选择显示
//显示函数
voidLed_Display()//
ScanBitCnt++;
if(ScanBitCnt==4)//四个led都显示了一遍
ScanBitCnt=0;
//返回第一个led
}
DataPort=CODE[LedDispBuff[ScanBitCnt]];
//段选
ComPort=ComPort_CODE[ScanBitCnt];
//位选
8.2按键驱动程序
Key.c
//文件名称:
按键扫描子程序
//功能说明:
直入式4键键盘
#include<
#defineucharunsignedchar
#defineuintunsignedint
//============常量===================
#defineKeyPortP2//按键端口
#defineKeyNomber8//按键数目
#defineKeyTime5//防抖定时时间
//============变量===================
uchardataKeyInBuff;
uchardataKeyChkBuff;
uchardataKeyTimeBuff;
uchardataKeyCvtBuff;
uchardataKeyOldBuff;
uchardataKeyBuff[4];
uchardataButtonDown;
//按键按下标志
uchardataKey_Value;
bitbdataKeyInFlag;
bitbdataKey_DeFlag;
bitbdataKey_Flag;
externuchardataEvent_FIFO[8];
//事件缓冲区八个单元
externuchardata*Event_WrIp;
//写事件指针,指向存放空间
//===================函数声明============
voidKeyIn(void);
voidKeyChk(void);
voidKeyCvt(void);
voidDeKeyTime(void);
//======================================
MnKey()
按键
voidMn_Key()
KeyIn();
KeyChk();
KeyCvt();
KeyIn()
读入按键,并取反
//输入参数:
Keyport
//输出参数:
KeyInBuff
voidKeyIn(void)
KeyInBuff=KeyPort;
KeyInBuff^=0xff;
//异或
KeyChk()
按键防抖
KeyCvtBuff
voidKeyChk(void)
if(KeyInBuff==KeyChkBuff)//未定义的变量初值为0,有键按下就不相等
{
if(KeyInFlag==0)
return;
else
{
if(Key_Flag==1)//消抖时间到在into中Key_Flag==1
{
Key_Flag=0;
//清除标志位
Key_DeFlag=0;
KeyInFlag=0;
KeyCvtBuff=KeyChkBuff;
//将chk的值赋给cvt
}
}
}
else
KeyChkBuff=KeyInBuff;
//将in的值赋给chk
KeyInFlag=1;
Key_DeFlag=1;
//有键按下则置位延时标志位
KeyCvt()
键值转换
EventFIFO
voidKeyCvt(void)
if(KeyCvtBuff==KeyOldBuff)
return;
//返回到chk函数中继续循环
KeyOldBuff=KeyCvtBuff;
switch(KeyCvtBuff)//三次循环后cvt=0
case0x00:
{return;
case0x01:
{
ButtonDown=1;
//有键按下
*Event_WrIp=1;
break;
}
case0x02:
*Event_WrIp=2;
case0x04:
*Event_WrIp=3;
case0x08:
*Event_WrIp=4;
if(Event_WrIp==(Event_FIFO+7))//修改写事件指针
Event_WrIp=Event_FIFO;
elseEvent_WrIp++;
8.3定时器程序
INIT.c
/******************************************************
文件名称:
Int_Deal
功能描述:
处理系统的中断事件
*******************************************************/
#include<
//===========变量定义===================
externuchardataClockSecond;
//分计时单元
externuchardataClockMinute;
//秒计时单元
uintdataClockSecondCnt;
//1S时间计数单元
externuchardataClockHour;
uchardataStWatch_MSecCnt;
//秒表中的变量
uchardataStWatch_MSec;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 电子 秒表