单片机课设电子秒表文档格式.docx

上传人:b****6 文档编号:20168356 上传时间:2023-01-17 格式:DOCX 页数:34 大小:322.17KB
下载 相关 举报
单片机课设电子秒表文档格式.docx_第1页
第1页 / 共34页
单片机课设电子秒表文档格式.docx_第2页
第2页 / 共34页
单片机课设电子秒表文档格式.docx_第3页
第3页 / 共34页
单片机课设电子秒表文档格式.docx_第4页
第4页 / 共34页
单片机课设电子秒表文档格式.docx_第5页
第5页 / 共34页
点击查看更多>>
下载资源
资源描述

单片机课设电子秒表文档格式.docx

《单片机课设电子秒表文档格式.docx》由会员分享,可在线阅读,更多相关《单片机课设电子秒表文档格式.docx(34页珍藏版)》请在冰豆网上搜索。

单片机课设电子秒表文档格式.docx

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;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 幼儿教育 > 幼儿读物

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1