单片机课设电子秒表.docx
- 文档编号:7076342
- 上传时间:2023-01-17
- 格式:DOCX
- 页数:34
- 大小:322.17KB
单片机课设电子秒表.docx
《单片机课设电子秒表.docx》由会员分享,可在线阅读,更多相关《单片机课设电子秒表.docx(34页珍藏版)》请在冰豆网上搜索。
单片机课设电子秒表
单片机原理及应用设计说明书
题目:
电子跑表
学生姓名:
宋栋栋
学号:
201006020123
院(系):
电气与信息工程学院
专业:
电子信息科学与技术
指导教师:
张玉杰
2013年3月12
目录
1基本设计任务1
1.1任务简介1
1.2设计基本要求1
1.3附加功能1
2方案论证1
3硬件设计2
3.1总电路图2
3.2单片机电路2
3.3数码管显示电路3
3.4按键电路3
3.5电源电路3
3.6蜂鸣器电路4
4软件设计4
4.1状态分析4
4.2系统事件分析4
4.3数据存储及缓冲区分配5
4.4各个模块流程图6
4.4.1数码管显示流程图6
4.4.2按键驱动流程图7
4.4.3应用层流程图8
4.4.4主程序流程图9
5小结10
6体会10
7改进意见10
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主界面状态
状态名称
编号
状态介绍
转换条件
主界面状态
0
四位数码管显示时分,LED灯闪烁
按下菜单选择键
2、主菜单状态
状态名称
编号
状态介绍
转换条件
主菜单状态
1
屏幕显示系统主菜单,可以通过按键调整选中菜单项目
按上下选择键;按确认/退出键;
3、跑表功能
状态名称
编号
状态介绍
转换条件
跑表功能状态
2
屏幕显示跑表数据
按下确认/退出键
4、系统时间设置
状态名称
编号
状态介绍
转换条件
系统时间设置状态
3
屏幕显示时钟,时钟停表,按菜单选择键切换调整时或分,改位闪烁
按下确认/退出键
4.2系统事件分析
编号
名称
说明
1
设置键按下事件
按键1按下
2
上翻键按下
按键2按下
3
下翻键按下
按键3按下
4
确定/退出键短按下
按键4按下
4.3数据存储及缓冲区分配
名称
数据类型
存放位置
字节数
功能
Sys_State
uchar
data
1
系统状态寄存器
ClockHour
uchar
data
1
时钟’时’数据寄存器
ClockMinute
uchar
data
1
时钟’分’数据寄存器
Event_FIFO[8]
uchar
data
8
系统事件缓冲区
Event_WrIp
uchar
data
1
写事件指针
Keyin_Buf
uchar
data
1
键读入的缓冲区
Keychk_Buf
uchar
data
1
键检测寄存器
Keycvt_Buf
uchar
data
1
键转换寄存器
Keyoldcvt_Buf
uchar
data
1
旧键转换寄存器
Keyvlu_Buf
uchar
data
1
键值寄存器
Key_DeFlag
uchar
data
1
按键延时时间到标志
Keychk_Time
uchar
data
1
键时间寄存器
ButtonDown
uchar
data
1
有键按下标志
StWatchStartFlag
bit
bdata
1
跑表暂停开始标志
ScanTime_Flag
bit
bdata
1
数码管刷新延时标志
WrKey_Flag
bit
bdata
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
#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);break;}//跑表显示
case2:
{MenuDisp(16,20,menu,27);break;}//菜单选择显示
}
}
//============================================================
//显示函数
//============================================================
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()
//功能描述:
按键防抖
//输入参数:
KeyInBuff
//输出参数:
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()
//功能描述:
键值转换
//输入参数:
KeyCvtBuff
//输出参数:
EventFIFO
//============================================================
voidKeyCvt(void)
{
if(KeyCvtBuff==KeyOldBuff)
return;//返回到chk函数中继续循环
else
{
KeyOldBuff=KeyCvtBuff;
switch(KeyCvtBuff)//三次循环后cvt=0
{
case0x00:
{return;}
case0x01:
{
ButtonDown=1;//有键按下
*Event_WrIp=1;
break;
}
case0x02:
{
ButtonDown=1;
*Event_WrIp=2;
break;
}
case0x04:
{
ButtonDown=1;
*Event_WrIp=3;
break;
}
case0x08:
{
ButtonDown=1;
*Event_WrIp=4;
break;
}
}
if(Event_WrIp==(Event_FIFO+7))//修改写事件指针
Event_WrIp=Event_FIFO;
elseEvent_WrIp++;
}
}
8.3定时器程序
文件名:
INIT.c
/******************************************************
文件名称:
Int_Deal
功能描述:
处理系统的中断事件
*******************************************************/
#include
#defineucharunsignedchar
#defineuintunsignedint
//===========变量定义===================
externuchardataClockSecond;//分计时单元
externuchardataClockMinute;//秒计时单元
uintdataClockSecondCnt;//1S时间计数单元
externuchardataClockHour;
uchardataStWatch_MSecCnt;//秒表中的变量
uchardataStWatch_MSec;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 电子 秒表
![提示](https://static.bdocx.com/images/bang_tan.gif)