单片机课程设计说明书.docx

上传人:b****7 文档编号:16660357 上传时间:2023-07-16 格式:DOCX 页数:64 大小:1.12MB
下载 相关 举报
单片机课程设计说明书.docx_第1页
第1页 / 共64页
单片机课程设计说明书.docx_第2页
第2页 / 共64页
单片机课程设计说明书.docx_第3页
第3页 / 共64页
单片机课程设计说明书.docx_第4页
第4页 / 共64页
单片机课程设计说明书.docx_第5页
第5页 / 共64页
单片机课程设计说明书.docx_第6页
第6页 / 共64页
单片机课程设计说明书.docx_第7页
第7页 / 共64页
单片机课程设计说明书.docx_第8页
第8页 / 共64页
单片机课程设计说明书.docx_第9页
第9页 / 共64页
单片机课程设计说明书.docx_第10页
第10页 / 共64页
单片机课程设计说明书.docx_第11页
第11页 / 共64页
单片机课程设计说明书.docx_第12页
第12页 / 共64页
单片机课程设计说明书.docx_第13页
第13页 / 共64页
单片机课程设计说明书.docx_第14页
第14页 / 共64页
单片机课程设计说明书.docx_第15页
第15页 / 共64页
单片机课程设计说明书.docx_第16页
第16页 / 共64页
单片机课程设计说明书.docx_第17页
第17页 / 共64页
单片机课程设计说明书.docx_第18页
第18页 / 共64页
单片机课程设计说明书.docx_第19页
第19页 / 共64页
单片机课程设计说明书.docx_第20页
第20页 / 共64页
亲,该文档总共64页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

单片机课程设计说明书.docx

《单片机课程设计说明书.docx》由会员分享,可在线阅读,更多相关《单片机课程设计说明书.docx(64页珍藏版)》请在冰点文库上搜索。

单片机课程设计说明书.docx

单片机课程设计说明书

 

单片机原理及应用课程设计说明书

 

题目:

电子钟

 

学生姓名:

学号:

院(系):

专业:

指导教师:

年月日

一、选题背景

1、设计任务

(1)基本功能:

设计一个时钟电路,能显示年月日和时分秒;通过功能键完成年月日时分秒的切换与对时功能;

(2)附加功能:

添加秒表功能,能通过键盘进行时间和秒表功能切换。

(3)系统硬件设计要求:

根据任务要求,完成单片机最小系统及其扩

展设计,组成功能完整的系统;

(4)系统软件设计:

根据系统功能要求,完成程序的编写与调试;

(5)说明书:

功能介绍、系统说明、模块说明、使用说明;须改进之处及体会;参考文献:

参考书、资料、网站等;附件:

系统原理图及程序清单。

2、设计内容

(1)设计一个时钟电路,能显示年月日和时分秒;通过功能键完成年月日时分秒的切换与对时功能。

(2)添加秒表功能,能通过键盘进行时间和秒表功能切换;

(3)添加闹钟功能,通过按键控制开关;

二、总体设计

1、系统总体设计

1.1 功能设计

电子时钟的单片机芯片选用89C51作为主控芯片,显示模块采用LED数码管。

本系统使用定时器产生的时基实现时钟、秒表、闹钟等功能。

在本系统中,主要有四大主要功能,分别实现不同功能。

具体功能如下:

(1)、第一个功能是实现时钟、年份、月日、星期几以及秒状态的显示与切换。

(2)、第二个功能,即第一大菜单下,实现时钟、年份、月日和星期几的校准。

(3)、第三个功能,即在第二大菜单下,实现秒表功能。

秒表功能中,可以正常跑秒,也可随时暂停或者清零。

(4)、第四个功能,即第三大菜单下可实现闹钟的功能。

可先选择打开或是关闭闹钟,若选择关闭,系统跳出闹钟界面。

若选择打开闹钟,则可设置时间。

1.2 参考元器件

(1)51系列单片机SST89E516RD

(2)4个共阳数码管

(3)蜂鸣器

(4)4个按键

2、系统硬件电路设计

2.1单片机MCU

89C52内置8位中央处理单元、256字节内部数据存储器RAM、8k片内程序存储器(ROM)32个双向输入/输出(I/O)口、3个16位定时/计数器和5个两级中断结构,一个全双工串行通信口,片内时钟振荡电路。

图2-1单片机MCU最小系统

2.2复位电路

图中RST接单片机的复位引脚RST,形成复位电路。

平时RST端口是高电平,当按键按下后,RST端口为低电平,实现低电平复位。

图2-2复位电路

2.3数码管

数码管显示电路如图所示,段选端口接到复用端口P1上,在数码管显示电路中,将J11—J18跳线的2、3短接,就可以进行段选。

数码管的公共端COM1—COM4是经PNP三极管9012接单片机的P0.0—P0.3口上的,属于共阳极的接法,当COM端有低电平时,选中数码管的某个位。

图2-3数码管

J11J12J13J14

图2-4跳线

2.4键盘

本次采用的是独立式键盘,8个按键一端分别接P2[0-7]口,并通过10K的电阻上拉,另一端地。

没有按键状态下,P2口为高电平,当有按键按下时,为低电平状态。

电子时钟面板中设有4个按键(S2-S5),用于用户设定参数及执行各项操作。

具体操作见用户使用说明书。

图2-5键盘

2.5蜂鸣器

为了方便用户操作,在本系统中,加入蜂鸣器,作为按键和闹钟的提示音。

如图为蜂鸣器驱动电路,蜂鸣器一端接VCC,另一端通过三极管9012接P0.4口,当P0.4口有低电平时,三极管导通,驱动蜂鸣器工作。

图2-6蜂鸣器

3、系统软件设计

3.1系统软件总计架构设计

软件设计首先要考虑的是程序的结构和设计方法。

一般来说,程序设计的方法可以有三种:

模块化程序设计方法、自顶向下的程序设计方法和结构化的程序设计方法。

针对微控器应用系统设计的特点,综合三种设计方法各自的优点,同时考虑到程序的可维护性和可移植性,本系统采用一种层次化的软件设计方法。

整个系统可分为三层,即应用层、界面层和底层驱动层。

图3-1给出了电子时钟系统软件的层次结构图。

图3-1电子时钟系统软件的层次结构图

底层驱动层是指包含直接和硬件相关的驱动程序,如LCD显示、按键、时钟芯片、AD转换器、中断和定时等。

界面层主要提供数据交互,为应用层和底层驱动之间以及底层驱动层各模块之间提供数据的交互。

应用层主要完成具体功能的实现,它要通过界面层控制底层驱动层各模块来完成所需功能,而不能越过界面层直接访问底层驱动层。

按照层次化设计的原则,底层模块要求有相对的独立性和完整性。

所谓独立性是指底层的各个模块间不产生直接的数据交互,底层也不直接访问应用层,如果有需要,都必须通过界面层进行数据交互。

所谓完整性是指驱动层内将与硬件相关的操作全部包装起来,应用层不再考虑和硬件有关的任何操作。

界面层的数据交互是通过数据缓冲区BUFFER或先进先出寄存器FIFO实现的。

它们实际上都是一系列数据存储器单元。

应用层对底层的访问以及子程序模块间的交互,要通过都必须通过界面层进行沟通。

3.2任务划分

(1)时基处理函数mn_Timer_Base(),在主函数里循环调用。

(2)蜂鸣器报警,在应用层app.c和key.c里循环执行,在按键确认按下或者闹钟时间到了作提示音。

(3)按键的键值扫描任务,每50ms执行一次,并在主函数里循环调用。

(4)数码管led_tube的显示任务,每5ms扫描一次。

(5)应用层状态转换任务,和各个功能函数。

各个功能函数在mn_App()里状态转换时调用,mn_App()在主函数里循环调用。

3.3程序框架

结合上述层次化设计方法,本系统程序主要包括主程序、应用层程序、以及底层驱动程序,下面将结合程序设计设计过程作详细介绍。

3.3.1底层驱动

(1)BEEP驱动

蜂鸣器驱动程序主要包括蜂鸣器的初始化,即IO口设置为输出,使能上拉,默认输出高电平。

在本系统中,蜂鸣器作为按键和闹钟的提示音。

(2)按键驱动

按键驱动主要包括按键初始化(配置引脚为输入,使能上拉)、读取按键键值、按键防抖,以及按键键值转化。

其中按键消抖采用定时器方式,能大大释放CPU资源。

另外添加了连击(即按键长按)功能,同样是在定利用定时器法方式实现的。

键值转化将键值写入FIFO中,在应用层函数中读出键值,并做相应处理。

(3)数码管显示模块

为了节约硬件资源,降低系统的设计成本,采用动态扫描,软件译码的方式来实现数码管显示。

在数据存储区建立一个显示缓冲区,存储单元的个数与数码管个数相等,也就是4个。

每次执行显示任务时,只进行一个数码管显示,下一次调用显示子程序时,显示下一位数码管,以此类推。

这样当每次退出数码管显示程序后,由于I/O口的锁存作用相应的数码管一直点亮。

这就是数码管动态扫描函数ledScan_Display(),本系统中,每5ms扫描一次数码管。

用led_Disp_init()函数对数码管缓冲区进行初始化。

另外加入小数点亮、灭的函数:

dot_On(),dot_Off()。

若想使第二个数码管的小数点亮,则可调用dot_On(DOT_TWO)实现。

(4)定时器

本系统使用定时器0。

对定时器0进行初始化,初始化应完成如下工作:

(1)、设置定时器/计数器的工作模式TMOD(常用的是模式1:

TMOD=0x01);

(2)、装入预置数到TH0和TL0中(THx=TLx=MAX(8192/65536/256)-计数次数);

(3)、如果工作在中断方式,则需要开定时器/计数器的中断TCON中的标志位:

TF0/TF1=0/1;

(4)、启动定时器/计数器:

TR0/TR1=1;

定时器初始化1ms的定时,定时器0的中断函数里使1ms标志位置1,这样就可以在时基产生函数mn_Timer_Base()里产生多个时间的定时标志位,可在不停的时间赶不同的事,尽量不浪费CPU的运行效率。

3.3.2界面层

界面层主要由各种寄存器、标志位和缓冲区组成,其功能是用于提供数据交互。

各个底层模块都有自己相应的变量及标志,这些变量是底层与应用层或是底层与其他底层模块对话的接口。

界面层主要变量的说明,如表3-1。

表3-1界面层主要变量的说明

变量名称

说明

sys_State

系统状态缓冲区,用于存放系统工作状态

event_FIFO

系统事件缓冲区,用于存放系统的各种事件

led_Disp_Buff

数码管显示缓冲区

keyVluBuf

键值缓冲区,用于存放键值

beep_Time

蜂鸣器响的时间缓冲区

watch_stop

秒表跑秒/暂停标志位

clock_stop

闹钟开/关标志位

(所有时间标志位)

作时间标志,当标志位置1或达到条件时,做相应的任务。

3.3.3应用层

应用层主要实现电子时钟的具体功能,通过界面层的各个变量及标志位的操作控制底层驱动层各个模块来实现所需功能,而并不越过界面层直接访问底层驱动层。

对于本系统的状态转换首先列出菜单如下图:

图3-2系统菜单示意图

根据以上功能菜单那表列出状态转换表:

(1)、系统状态分析

表3-2系统状态分析

状态名称

编号

状态说明

状态1

0x10

显示菜单P-1

状态2

0x20

显示菜单P-2

状态3

0x30

显示菜单P-3

状态4

0x11

显示年状态

状态5

0x12

显示月日状态

状态6

0x13

显示周状态

状态7

0x14

显示时分状态

状态8

0x15

显示秒状态

状态9

0x16

设置年

状态10

0x17

设置月

状态11

0x18

设置日

状态12

0x19

设置周

状态13

0x1a

设置时

状态14

0x1b

设置分

状态15

0x21

秒表

状态16

0x31

显示ON/OFF

状态17

0x32

设置闹钟小时

状态18

0x33

设置闹钟分钟

(2)、系统事件分析

表3-3系统事件分析

编号

事件名称

1

确认键按下(S2)

2

DOWN键按下(S3)

3

UP键按下(S4)

4

菜单键(S5)

(3)、系统状态转换分析

表3-4系统状态装换分析

事件

转换

状态

状态1

状态2

状态3

状态4

状态5

状态6

状态7

状态8

状态9

状态10

状态11

状态12

状态13

状态14

状态15

状态16

状态17

状态18

on

off

确认键按下(S2)

到状态9

到状态15

到状态16

--

--

--

--

--

到状态4

到状态5

到状态5

到状态6

到状态7

到状态7

到状态7

到状态18/

到状态3

到状态18

到状态17

DOWN键按下(S3)

到状态2

到状态3

到状态1

到状态5

到状态6

到状态7

到状态8

到状态4

--

--

--

--

--

--

--

-

----

--

--

UP键按下(S4)

到状态3

到状态1

到状态2

到状态8

到状态4

到状态5

到状态6

到状态7

--

--

--

--

--

--

--

-

--

--

--

菜单键(S5)

到状态7

到状态7

到状态7

到状态1

到状态1

到状态1

到状态1

到状态1

到状态11

到状态12

到状态10

到状态14

到状态7

到状态13

--

到状态3

到状态3

到状态3

到状态3

3.3.5主函数

主函数包括系统初始化,在while

(1)里调用时基处理函数、按键相关程序、以及应用程序,见附件

4.操作步骤

4.1基本操作

打开单片机时,界面首先出现的是时间分钟显示,如图1。

此时按键S3和S4可用来切换时钟、年份、月日、星期几以及秒状态,各界面示例图如下

图4-1时分显示

图4-2年份显示

图4-3月日显示

图4-4星期六显示

4.2菜单选择操作

S5按键可进入菜单选择界面,此时界面出现P-1的字样,如图5,代表此时是菜单一。

此时按键S3和S4可用来切换菜单1、2、3的显示。

从前面知道每个菜单下,有不同的功能。

菜单选好之后,S2键表示确定进入。

图4-5系统菜单主界面

4.3时间校准操作(P-1)

确认进入菜单1便是进入校准状态,在此状态下,S5键进行切换要调试的部位,调试的部分会有1s的间隔闪烁给调试者提醒。

例如此时年份2015在闪烁,说明此时调试的部分是年份,若想调试的是时间,便按S5进行切换。

切换的顺序是:

年份—>日—>月—>星期—>分钟—>时间。

调好时按S2确认。

4.4秒表(P-2)

确认进入菜单2便是进入秒表功能,界面初始状态是0000,如图6。

S5键可以进行跑秒的开始于暂停,S4与S3是秒表清零键,S2可返回上一级。

若没有进行清0操作就退出秒表状态的话,再次进入秒表状态时,会保留上一次的值。

图4-6秒表

4.5闹钟(P-3)

确认进入菜单3(P-3)便是进入闹钟功能,首先可按S4或者S3选择闹钟开或者关,S2是确认键。

若闹钟选择关(OFF),界面图如图7。

确认键按下后,系统跳回上一级即菜单选择界面;若闹钟选择开(ON),界面图如图8。

确认键按下后,系统进入设置闹钟时间,S3(down)和S4(up)键可上调或者下调时间,此界面可按S5进行切换设置小时或者分钟。

设置好之后按确认键(S2)返回上一级。

闹钟响时,可按任意键关闭闹钟,若无手动关闭闹钟,一分钟后闹钟自动关闭。

图4-7关闭闹钟界面

图4-8开闹钟界面

三、设计体会和总结

1、设计体会

课程设计需要很大的耐心,尤其是在写程序的时候,如果基础不扎实,再加上不细心的话,根本就做不出来。

写程序是本次课程设计遇到的最大的问题,因为需要实现很多功能,还要控制不同的按键来实现不同的操作,这些对学单片机并不是很久的我们着实是一个挑战,但也同时给了我们一个平台,让我们有机会接触到单片机在实际生活中的运用,也是一次很好的经验,对以后要从事单片机方面的工作的同学是一个很好的机会。

2、设计总结

这次的课程设计把我们上学期学的单片机的知识运用到了实践中,在课本中学到的定时器/计数器,串行口,中断等等,都在这次的课程设计中有了更深的体会和领悟。

在做课设的时候,也需要查一些资料,通过查资料,会获得一些在课堂上学不到的知识,扩展了我们的知识面。

 

附录A:

实物图展示

菜单1:

(显示年月日、时间、星期)

 

显示年:

(2016年)

显示月.日:

(3月26号)

显示星期:

(星期六)

菜单2:

(秒表功能)

显示5.03秒

显示3.78秒

菜单3:

(闹钟功能)

显示闹钟开:

显示闹钟关:

附录B:

程序

1.app.c

#include"app.h"

#include"Int_Deal.h"

#include"led_Tube.h"

#include"beep.h"

//#include"key.h"

uchardataevent_FIFO[8];//事件缓冲区

uchardata*event_WrIp=event_FIFO;//写指针

uchardata*event_RdIp=event_FIFO;//度指针

uchardatacurrent_Event=0;

uchardatasys_State=0x14;

uchardatacount_Second=0;

chardatacount_Minute=37;

chardatacount_Hour=10;

uchardatacount_Week=6;

uchardatacount_Day=28;

uchardatacount_Mouth=11;

uintdatacount_Year=2015;

bitdataflag_1hour;

bitdataflag_1day=0;

uchardataflag_1mouth=0;

bitdatawatch_stop=0;

bitdataclock_stop=0;

uintdatacount_Watch=0;

chardataalarm_Clock_Hour=10;

chardataalarm_Clock_Minute=38;

uchardataflag_Clock=0;

voidwrite_Event(ucharcmd)

{

*event_WrIp=cmd;

if(event_WrIp==(event_FIFO+7))event_WrIp=event_FIFO;

elseevent_WrIp++;

}

ucharread_Event(void)

{

uchartemp;

if(event_RdIp!

=event_WrIp)//读事件

{

temp=*event_RdIp;

if(event_RdIp==(event_FIFO+7))event_RdIp=event_FIFO;

elseevent_RdIp++;

returntemp;

}

elsereturn(0);

}

voidmn_App(void)

{

//ucharcurrent_Event=0;

current_Event=read_Event();

//key_Deal();

ledScan_Display();

timer_Deal();

dot_Off(DOT_TWO);

alarm_Clock_Beep();

//beep_Off();

switch(sys_State)

{

case0x00:

break;//菜单,母状态

case0x10:

{meau1_Display();break;}//显示菜单P-1

case0x20:

{meau2_Display();break;}//显示菜单P-2

case0x30:

{meau3_Display();break;}//显示菜单P-3

//时钟子状态

case0x11:

{year_Display();break;}//显示年

case0x12:

{month_Display();break;}//显示月日

case0x13:

{week_Display();break;}//显示周

case0x14:

{hour_Display();break;}//显示时分

case0x15:

{second_Display();break;}//显示秒

case0x16:

{year_Set();break;}//设置年

case0x17:

{month_Set();break;}//设置月

case0x18:

{day_Set();break;}//设置日

case0x19:

{week_Set();break;}//设置周

case0x1A:

{hour_Set();break;}//显示时

case0x1B:

{minute_Set();break;}//显示分

//秒表子状态

case0x21:

{stop_Watch();break;}//秒表功能

//case0x22:

//

//case0x23:

//

//闹钟子状态

case0x31:

{alarm_Clock_Open();break;}//显示on/off

case0x32:

{alarm_Clock_Hour_Set();break;}//设置时

case0x33:

{alarm_Clock_Minute_Set();break;}//设置分

default:

break;

}

}

voidmeau1_Display(void)//菜单1,校准时间功能

{

switch(current_Event)

{

case0:

break;

case1:

{sys_State=0x16;break;}//确认键进入年设置

case2:

{sys_State=0x20;break;}//菜单下翻建,P-2

case3:

{sys_State=0x30;break;}//菜单上翻建,P-3

case4:

{sys_State=0x14;break;}//返回时间显示

default:

break;

}

led_Disp_Buff[0]=10;//显示

led_Disp_Buff[1]=17;

led_Disp_Buff[2]=21;

led_Disp_Buff[3]=1;

}

voidmeau2_Display(void)//菜单2,秒表功能

{

switch(current_Event)

{

case0:

break;

case1:

{sys_State=0x21;break;}//确认进入秒表状态

case2:

{sys_State=0x30;break;}//菜单下翻建,P-3

case3:

{sys_State=0x10;break;}//菜单上翻建,P-1

case4:

{sys_State=0x14;break;}//返回时间显示

default:

break;

}

led_Disp_Buff[0]=10;//显示

led_Disp_Buff[1]=17;

led_Disp_Buff[2]=21;

led_Disp_Buff[3]=2;

}

voidmeau3_Display(void)//菜单3,闹钟功能

{

switch(current_Event)

{

case0:

break;

case1:

{sys_State=0x31;break;}//确认进入闹钟状态

case2:

{sys_State=0x10;break;}//菜单下翻建,P-1

case3:

{sys_State=0x20;break;}//菜单上翻建,P-2

case4:

{sys_State=0x14;break;}//返回时间显示

default:

break;

}

led_Disp_Buff[0]=1

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

当前位置:首页 > 经管营销 > 经济市场

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2