微机原理课程设计报告时钟设计文档格式.docx
- 文档编号:19886777
- 上传时间:2023-01-11
- 格式:DOCX
- 页数:23
- 大小:267.61KB
微机原理课程设计报告时钟设计文档格式.docx
《微机原理课程设计报告时钟设计文档格式.docx》由会员分享,可在线阅读,更多相关《微机原理课程设计报告时钟设计文档格式.docx(23页珍藏版)》请在冰豆网上搜索。
第四章软件设计12
4.1流程图及其说明12
4.2软件系统的使用说明13
4.2.1MAX7219驱动13
4.2.2时钟进位部分14
4.2.3调整时间部分14
4.2.4延时函数及去抖14
4.3源程序代码15
第五章收获与体会25
参考文献27
第一章微机应用系统课程设计的目的意义
1.1设计目的
以单片机为控制核心的智能电子钟以时间准、功能强、外形美而越来越受到人们的青睐。
本实验通过设计一个智能电子钟,旨在使学生能够做到以下几点。
l.了解智能电子钟的功能特点与工作原理。
2.掌握以单片机为核心实现电子钟功能的思路和方法。
3.进一步掌握多位数码管显示的原理和接口方法。
1.2设计内容及要求
(1)编程语言为C语言;
(2)基于单片机的硬件电路设计与调试;
(3)从键盘上输入当前时间,格式为“XX(小时):
XX(分):
XX(秒),以此为起点,每秒刷新一次,1秒钟延迟方式采用软件方式并用子程序编写或者定时器实现,主程序用于显示时间结果和调用子程序,由于软件延迟产生的误差每小时调整一次,保证每小时误差不超过0.1秒。
1.3课程在教学计划中的地位和作用
《微机应用系统设计与综合实验》课程是测控技术专业本科生必修的一门技术基础课程。
通过该课程的学习使学生对微机系统有一个全面的了解、掌握常规芯片的使用方法、掌握简单微型计算机应用系统软硬的设计方法。
为了使我们微机应用课程设计目标更明确,要求更具体,学生收获更大,我们特编写课程设计任务书,学生可根据本人的爱好任选其中一个课题,要求独立完成课题,写出课程设计说明书,设计出电路原理图,说明工作原理,画出电路板图,编写程序及程序流程图。
希望同学认真阅读本任务书,认真查阅资料与上机调试,圆满完成课程设计。
通过课程设计进一步锻炼同学们在微型计算机应用方面的实际工作能力。
计算机科学在应用上得到飞速发展,因此,学习这方面的知识必须紧密联系实际:
掌握这方面的知识更要强调解决实际问题的能力。
同学们要着重学会面对一个实际问题,如何去自己收集资料,如何自己去学习新的知识,如何自己去制定解决问题的方案并通过实践不断地去分析和解决前进道路上的一切问题,最终到达胜利的彼岸。
1.4系统的主要功能及使用方法
该单片机数字时钟的主要功能:
可做时钟用,并且时间可自行设置。
使用方法如下:
系统中,单片机做控制器,实现时钟计时及时间设置的相关控制;
数码管做显示,显示当前时间,由MAX7219完成译码;
四个按钮开关用于实现时间的设置。
按钮1:
功能键;
按钮2:
增加键;
按钮3:
减少键;
按钮4:
进入计时键。
线路连接好之后,开始计时,数码管显示时间,为正常计时状态。
时间初值是00:
00:
00。
当需要对时间进行设置时,按下按钮1,进入时间调节状态。
按钮1按下的次数决定当前要调节的位。
如:
按一次调秒的个位,该位闪烁,此时如按下按钮2,秒的个位递增调节,按下按钮3,则秒的个位递减调节。
依次可对需要调节的任意位进行设置,当前设置的位闪烁。
设置完时间后,按下按钮4即可从设置的时间开始计时,再次进入正常计时状态。
第二章总体设计方案
2.1设计思想
要完成本实验任务要求的功能,可以将系统分为以下几个部分来设计:
定时器/计数器电路、时间及功能设置电路、时间显示电路等。
其中,定时器/计数器电路是整个电子钟设计的基础。
一般都是用定时/计数器来产生定时中断信号(例如定时时间间隔为1/100s),然后通过软件计数器来相继获得实时时钟的秒、分、时等时间值。
实现智能化电子钟的软件主要由主程序和中断服务程序两模块组成。
在主程序中,除了完成对系统的初始化和中断向量的设置外,需要对各种软件时间计数器进行查询、比较和判断,并根据判断结果发出各种控制信号,以完成时钟的显示操作。
在定时中断服务程序中,需要设计1/100s计数器,秒个位、秒十位计数器,分个位、分十位计数器,时个位、时十位计数器以及由键盘设置的各定时时间计数器和各作息时间计数器等等,并对各计数器酌情作加1计数。
然后,由主程序来完成对各种计数器内容的查询。
注意事项:
向定时器通道写计数初值时,无论以二进制还是十进制形式写入,如果其值超过255,需分两次分别写入计数器的高、低字节,否则只需写一次。
究竟写一次还是两次,要在写初值之前通过写控制字来设置。
第三章硬件设计
3.1硬件设计概要
这次做的是单片机时钟程序设计,顾名思义,首先应该用到的是单片机。
我们用单片机来驱动程序,完成程序的运行。
由于我们以前没有学过单片机这方面的知识,我们运用起来比较陌生,只能是一边学一边用,所以做的设计比较简单,只有最基本的时钟功能和校准功能。
当然既然是时钟,就少不了数码管,这还要用到一片7219芯片来驱动数码管,使它显示相应的时间。
这次我们的课程设计,主要目的在于熟悉单片机的原理和应用。
由于时钟设计,所以相对的硬件设计较少且连线比较简单,这里不再详细介绍。
3.2所用到的芯片及其各自功能说明
3.2.1单片机及其功能说明
这次课程设计的主要目的就是熟悉单片机,下面我们先就单片机的一些功能加以介绍。
首先我们来连接一下单片机的引脚图,如果,具体功能在下面都有介绍。
单片机的40个引脚大致可分为4类:
电源、时钟、控制和I/O引脚。
⒈电源:
⑴VCC-芯片电源,接+5V;
⑵VSS-接地端;
⒉时钟:
XTAL1、XTAL2-晶体振荡电路反相输入端和输出端。
⒊控制线:
控制线共有4根,
⑴ALE/PROG:
地址锁存允许/片内EPROM编程脉冲
①ALE功能:
用来锁存P0口送出的低8位地址
②PROG功能:
片内有EPROM的芯片,在EPROM编程期间,此引脚输入编程脉冲。
⑵PSEN:
外ROM读选通信号。
⑶RST/VPD:
复位/备用电源。
①RST(Reset)功能:
复位信号输入端。
②VPD功能:
在Vcc掉电情况下,接备用电源。
⑷EA/Vpp:
内外ROM选择/片内EPROM编程电源。
①EA功能:
内外ROM选择端。
②Vpp功能:
片内有EPROM的芯片,在EPROM编程期间,施加编程电源Vpp。
⒋I/O线
80C51共有4个8位并行I/O端口:
P0、P1、P2、P3口,共32个引脚。
P3口还具有第二功能,用于特殊信号输入输出和控制信号(属控制总线)。
STC89C52
图3.1单片机引脚图及引脚功能
拿到一块芯片,想要使用它,首先必须要知道怎样连线,我们用的一块称之为89C52的芯片,下面我们就看一下如何给它连线。
1、电源:
这当然是必不可少的了。
单片机使用的是5V电源,其中正极接40管脚,负极(地)接20管脚。
2、振蒎电路:
单片机是一种时序电路,必须供给脉冲信号才能正常工作,在单片机内部已集成了振荡器,使用晶体振荡器,接18、19脚。
只要买来晶体震荡器,电容,连上就能了,按图3.1接上即可。
3、复位管脚:
按图3.1中画法连好,至于复位是何含义及为何需要复要复位,在单片机功能中介绍。
4、EA管脚:
EA管脚接到正电源端。
至此,一个单片机就接好,通上电,单片机就开始工作了。
我们的第一个任务是要用单片机点亮一只发光二极管LED,显然,这个LED必须要和单片机的某个管脚相连,不然单片机就没法控制它了,那么和哪个管脚相连呢?
单片机上除了刚才用掉的5个管脚,还有35个,我们将这个LED和1脚相连。
(见图1,其中R1是限流电阻)
按照这个图的接法,当1脚是高电平时,LED不亮,只有1脚是低电平时,LED才发亮。
因此要1脚我们要能够控制,也就是说,我们要能够让1管脚按要求变为高或低电平。
即然我们要控制1脚,就得给它起个名字,总不能就叫它一脚吧?
叫它什么名字呢?
设计51芯片的INTEL公司已经起好了,就叫它P1.0,这是规定,不能由我们来更改。
3.2.2MAX7219及其功能说明
设计题目做的是数字时钟,首先应该有数码管来显示相应的时间,这要用到一片7219芯片来驱动所用到的数码管。
下面我们就7219的功能做一些简单的介绍。
MAX7219是MAXIM公司生产的串行输入/输出共阴极数码管显示驱动芯片,一片MAX7219可驱动8个7段(包括小数点共8段)数字LED、LED条线图形显示器、或64个分立的LED发光二级管。
该芯片具有10MHz传输率的三线串行接口可与任何微处理器相连,只需一个外接电阻即可设置所有LED的段电流。
。
它的操作很简单,MCU只需通过模拟SPI三线接口就可以将相关的指令写入MAX7219的内部指令和数据寄存器,同时它还允许用户选择多种译码方式和译码位。
此外它还支持多片7219串联方式,这样MCU就可以通过3根线(即串行数据线、串行时钟线和芯片选通线)控制更多的数码管显示。
MAX7219的外部引脚分配如图3.2所示及内部寄存器结构如表3.1所示。
图3.2MAX7219的外部引脚分配
各引脚的功能为:
DIN:
串行数据输入端
DOUT:
串行数据输出端,用于级连扩展
LOAD:
装载数据输入
CLK:
串行时钟输入
DIG0~DIG7:
8位LED位选线,从共阴极LED中吸入电流
SEGA~SEGGDP7段驱动和小数点驱动
ISET:
通过一个10k电阻和Vcc相连,设置段电流
MAX7219有下列几组寄存器:
(如图3)
MAX7219内部的寄存器如下图,主要有:
译码控制寄存器、亮度控制寄存器、扫描界限寄存器、关断模式寄存器、测试控制寄存器。
编程时只有正确操作这些寄存器,MAX7219才可工作。
表3.1MAX7219内部的相关寄存器
3.3硬件电路设计系统原理图及其说明
由于第一次使用单片机,所做的课程设计相对比较简单,只用到以上两片芯片,其具体硬件电路设计系统原理图如下图所示:
基于硬件的设计相对比较简单,因为我们做的都是最简单的功能,没有什么多余的附加功能,所以不管是从编程还是软件设计方面都相对比较简单。
只需要在电脑用C语言完成相应的功能,把程序下载到单片机,用单片机来实现相应的功能。
用单片机的程序来驱动7219,使数码管显示相应的时间。
硬件连线的时候要注意单片机应与试验箱共地,否则数码管不会显示时间。
第四章软件设计
4.1流程图及其说明
软件编程我们可以分为几个模块来编程,这样可以是整个程序显得更清晰、容易理解。
我们程序出现错误的时候也方便我们调试。
具体整个程序的流程图如下所示:
4.2软件系统的使用说明
我们可以把整个软件系统分成几个部分:
7219驱动;
时钟进位部分;
调整时间部分;
延时函数及去抖部分。
下面我们对各个部分分别加以说明。
4.2.1MAX7219驱动
对于时钟电路的设计我们首先做的是数码管驱动芯片7219。
通过7219的驱动,是数码管能显示通过软件设置的时间。
电路原理图如下图,MAX7219与单片机的连接只需要3条线:
LOAD(CS)片选引脚、CLK串行时钟引脚、DIN串行数据引脚。
其中C1为电源滤波电容,R1用来设置段电流。
图4.2电路原理图
通过上面的原理和相应的程序使数码管完成显示功能,具体程序将在下面的章节分析。
4.2.2时钟进位部分
这一部分是我们设计的主要部分,主要完成时钟的进位和正常的时间显示问题。
我们定义了一个长度为六的数组,分别用来表示时钟的时、分、秒的个位和十位。
这当中主要考虑的就是时间的进位问题以及十、分、秒十位和各位的进制问题。
其中时、分、秒的个位都是十进制。
而十位是六进制。
当分、秒的十位为六而个位为零的时候要同时清零,已达到时、分整体六十进制。
这对于软件编程来说还是比较简单的,只需要用if语句就可以完成。
这主要需要注意的就是时分秒的同时清零问题,让它完成时钟的具体功能。
具体的程序后面源程序清单中会有介绍。
4.2.3调整时间部分
这部分主要做的是时间的初始化问题以及时间的调整问题。
由于用的是51单片机,没有办法连接电脑的键盘,所以时间键盘的初始化只能用按钮来代替。
由于他和时间的调整问题属于一个功能,所以放在了一起进行编程,这样可以简化程序,变得更加容易理解同时便于调试。
在这一个功能我们设置了四个功能键。
一个用来管理中断,用来关和开中断,方便我们对时间进行调整。
一个用来循环调整的哪一位,当处于调整的位是,数码管所对应的时间位的下面会出现一个亮点进行提示。
另外两个就是负责对时间进行调整,一个是加位调整,一个是减位调整。
具体的实现问题用了两个switch语句,来确认有键按下了时候就进行加一和减一的调整。
4.2.4延时函数及去抖
这个部分相对比较简单,延时函数主要是确定时间的精度问题。
而调整时间是按键的去抖问题主要就是利用延时函数。
这里不在详细介绍,后面的源程序中会有详细的讲解。
4.3源程序代码
#include<
reg52.h>
#defineuintunsignedint
#defineucharunsignedchar
//寄存器宏定义
#defineDECODE_MODE0x09//译码控制寄存器
#defineINTENSITY0x0A//亮度控制寄存器
#defineSCAN_LIMIT0x0B//扫描界限寄存器
#defineSHUT_DOWN0x0C//关断模式寄存器
#defineDISPLAY_TEST0x0F//测试控制寄存器
//按键设置
sbitkey1=P3^0;
//功能键
sbitkey2=P3^1;
//增加键
sbitkey3=P3^2;
//减少键
sbitkey4=P3^3;
//重新计时键
//管脚定义
sbitLOAD=P1^2;
//MAX7219片选1口2脚
sbitDIN=P1^1;
//MAX7219串行数据1口1脚
sbitCLK=P1^0;
//MAX7219串行时钟1口0脚
uchart0,flash,j;
chartime[7];
/********毫秒延时程序*******/
voiddelayms(ucharaa)
{
uchari,j;
for(i=aa;
i>
0;
i--)
for(j=110;
j>
j--);
}
//函数声明
voidWrite7219(unsignedcharaddress,unsignedchardat);
voidInitial(void);
/********地址、数据发送子程序****/
voidwrite7219(unsignedcharaddress,unsignedchardat)
{
unsignedchari;
LOAD=0;
//拉低片选线,选中器件
//发送地址
for(i=0;
i<
8;
i++)//移位循环8次
{
CLK=0;
//清零时钟总线
DIN=(bit)(address&
0x80);
//每次取高字节
address<
<
=1;
//左移一位
CLK=1;
//时钟上升沿,发送地址
}
//发送数据
i++)
DIN=(bit)(dat&
dat<
//时钟上升沿,发送数据
LOAD=1;
//发送结束,上升沿锁存数据
voidkeyscan()
uchari;
if(key4==0)//恢复计时键
{
delayms(5);
if(key4==0)
while(!
key4);
i=0;
TH0=(65536-45870)/256;
//初始化定时器0
TL0=(65536-45872)%256;
t0=0;
TR0=1;
//开中断
}
}
if(key1==0)//功能键
delayms(50);
if(key1==0)//确认按下
key1);
//确认释放
TR0=0;
//关定时器0
i++;
if(i==7)
i=1;
if(i!
=0)
Write7219(i,-1);
//该四行用于实现当前调节位的闪烁
delayms(2000);
Write7219(i,time[i]);
if(key2==0)//增加键
if(key2==0)
key2);
//确认释放
switch(i)//根据功能键按下次数调节相应位的值
case1:
//调节秒的个位
{
time[1]++;
if(time[1]==10)
time[1]=0;
Write7219(1,time[1]);
}break;
case2:
//调节秒的十位
{
time[2]++;
if(time[2]==6)
time[2]=0;
Write7219(2,time[2]);
case3:
//调节分的个位
time[3]++;
if(time[3]==10)
time[3]=0;
Write7219(3,time[3]);
case4:
//调节分的十位
time[4]++;
if(time[4]==6)
time[4]=0;
Write7219(4,time[4]);
case5:
//调节时的个位
time[5]++;
if(time[5]==10)
time[5]=0;
Write7219(5,time[5]);
case6:
//调节时的十位
time[6]++;
if(time[6]==3)
time[6]=0;
Write7219(6,time[6]);
if(key3==0)//减少键,实现数值向下调节,实现方式与增加类似
if(key3==0)
key3);
switch(i)
time[1]--;
if(time[1]==-1)
time[1]=9;
}break;
time[2]--;
if(time[2]==-1)
time[2]=5;
time[3]--;
if(time[3]==-1)
time[3]=9;
time[4]--;
if(time[4]==-1)
time[4]=5;
time[5]--;
if(time[5]==-1)
time[5]=9;
time[6]--;
if(time[6]==-1)
time[6]=2;
/*****MAX7219初始化,设置MAX7219内部的控制寄存器********/
voidInitial(void)
Write7219(SHUT_DOWN,0x01);
//开启正常工作模式(0xX1)
Write7219(DISPLAY_TEST,0x00);
//选择工作模式(0xX0)
Write7219(DECODE_MODE,0xff);
//选用全译码模式
Write7219(SCAN_LIMIT,0x05);
//只用6只LED
Write7219(INTENSITY,0x04);
//设置初始亮度
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 微机 原理 课程设计 报告 时钟 设计
![提示](https://static.bdocx.com/images/bang_tan.gif)