基于C51单片机技术的时钟课程设计报告 精品文档格式.docx
《基于C51单片机技术的时钟课程设计报告 精品文档格式.docx》由会员分享,可在线阅读,更多相关《基于C51单片机技术的时钟课程设计报告 精品文档格式.docx(19页珍藏版)》请在冰豆网上搜索。
总体描述1
3.2
系统总体框图
3.3
Proteus电路图2
3.4
各部分硬件介绍2
4
软件设计流程及描述
6
4.1
程序流程图
4.2
函数模块及功能
7
4.2.1单片机主控制模块7
4.2.2数码管显示模块8
4.2.3按键模块9
4.2.4计时模块10
5
功能实现11
6
心得体会
13
7
源程序13
1摘要
众所周知单片机是一种集成在电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计时器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的计算机系统。
本设计要制作的就是单片机于生活中最为常见的几种应用——时钟。
本设计以AT89S52单片机作为核心,可以显示当前的时间,时间也可以人为设定,显示格式为时(两位),分(两位),秒(两位)。
设置时间的数值、启动定时器。
时钟显示电路由数码管组成,制作该装置的材料需要有软硬件的支持,硬件方面AT89C51单片机,晶振,电源,数码管。
2设计要求
2.1功能需求
1、在数码管上显示初始时间如12-23-33,从初始设置的时间开始走时,每一秒自动加1,当59秒后自动向分进位、59分后自动向时进位。
2、通过按键设置时间,按下键1,时钟分加1;
按下键2,时钟分减1,。
从而实现用按键设置时间的功能。
2.2设计要求
本次设计的是时钟,本电路是由AT89S52单片机为控制核心,通过按键实现时钟分的自增自减进行时间的设置,在数码管上进行显示。
总体描述
单片机采用STC90C516RD+,采用MCS-51实验开发板。
在实验开发板上,根据功能需求,设定了控制模块由AT89S52单片机为控制核心,具有在线编程功能,低功耗,能在3V超低压工作,选用12MHZ的晶振,使得单片机有合理的运行速度;
输入模块由按键控制,设定或调整时间信息;
输出模块有数码管显示时间信息,通过对AT89S52单片机的编程控制数码管的显示。
系统总体框图如图3-1所示:
图3-1系统总体框图
3.3
Proteus电路图
整体Proteus电路图如下图3-2所示:
图3-2整体Proteus电路图
3.4
各部分硬件介绍
AT89C51单片机为40引脚双列直插芯片,有四个I/O口P0,P1,P2,P3,MCS-51单片机共有4个8位的I/O口(P0、P1、P2、P3),每一条I/O线都能独立地作输出或输入。
18引脚和19引脚接时钟电路,XTAL1接外部晶振和微调电容的一端,在片内它是振荡器倒相放大器的输入,XTAL2接外部晶振和微调电容的另一端,在片内它是振荡器倒相放大器的输出。
第9引脚为复位输入端,接上电容,电阻及开关后够上电复位电路,20引脚为接地端,40引脚为电源端。
如下图3-3所示:
图3-3AT89C51仿真图
74HC573的八个锁存器都是透明的D型锁存器,当使能(G)为高时,Q输出将随数据(D)输入而变。
当使能为低时,输出将锁存在已建立的数据电平上。
输出控制不影响锁存器的内部工作,即老数据可以保持,甚至当输出被关闭时,新的数据也可以置入。
这种电路可以驱动大电容或低阻抗负载,可以直接与系统总线接口并驱动总线,而不需要外接口。
特别适用于缓冲寄存器,I/O通道,双向总线驱动器和工作寄存器。
表3-1为74HC573的引脚功能表:
表3-174HC573引脚功能表
PINNo引脚号
SYMBOL符号
NAMEANDFUNCTION名称及功能
1
OE
3StateoutputEnableInput(ActiveLOW)3态输出使能输入(低电平)
2,3,4,5,6,7,8,9
D0toD7
DataInputs数据输入
12,13,14,15,16,17,18,19
Q0toQ7
3StateLatchOutputs3态锁存输出
11
LE
LatchEnableInput锁存使能输入
10
GND
Ground接地(0V)
20
VCC
PositiveSupplyVoltage电源电压
下图74HC573的仿真图,其中引脚2~9分别接AT89C51的P0,引脚12~19分别接数码管的A、B、C、D、E、F、G、D、P端,引脚1接电源端,引脚11接地端。
图3-474HC573仿真图
74HC138按照三位二进制输入码和赋能输入条件,从8个输出端中译出一个低电平输出。
两个低电平有效的赋能输入端和一个高电平有效的赋能输入端减少了扩展所需要的外接门或倒相器,扩展成24线译码器不需外接门;
扩展成32线译码器,只需要接一个外接倒相器。
在解调器应用中,赋能输入端可用作数据输入端。
下表为74HC138的真值表,其中H表示高电平,L表示低电平。
表3-274HC138真值表
下图为74HC138的仿真电路图,其中,引脚1、2、3分别接AT89C51的P0^0、P0^1、P0^2,引脚4、5接地,引脚5接一个上拉电阻并接电源端,Y0~Y7分别接数码管的引脚1~8。
图3-574HC138仿真图
下图为按键K1、K2的仿真图,K1接AT89C52的引脚P3^2控制时钟的分钟自加、K2接P3^3控制时钟的分钟自减。
图3-6开关K1、k2仿真图
下图为共阴数码管的方真图,其原理详见下文。
图3-7共阴数码管仿真图
程序流程图如图4-1所示:
图4-1程序流程图
4.2.1单片机主控制模块
AT89S52是一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程Flash存储器。
AT89S52单片机为40引脚双列直插芯片,有四个I/O口P0,P1,P2,P3,MCS-51单片机共有4个8位的I/O口(P0、P1、P2、P3),每一条I/O线都能独立地作输出或输入。
引脚图如图4-2所示:
图4-2AT89S52引脚结构
4.2.2数码管显示模块
LED数码管显示器的内部由8个发光二极管组成。
其中7个长条形的发光二极管排列成“日”字形,另一个圆点形状的发光二极管在显示器的右下角作为显示小数点用。
数码管的外观引脚结构如图4-3所示:
图4-3数码管的外观引脚结构
LED数码显示器的内部结构有两种不同的形式:
一种是8个发光二极管的阳极全部连接在一起组成公共端,8个发光二极管的阴极则单独引出,称为共阳极显示器,如图4-4。
另一种是8个发光二极管的阴极全部连接在一起组成公共端,8个发光二极管的阳极则单独引出,称为共阴极显示器,如图4-5所示:
图4-4共阳极显示器图4-5共阴极显示器
LED显示器字形码表,如表4-1所示:
表4-1LED显示器字形码表
本设计中主要用数码管显示当前时间和显示设置后的时间,数码管显示模块流程图,如图4-6所示:
图4-6数码管显示模块流程图
4.2.3按键模块
本设计采用按键控制时间的设置,通过按键的控制使时钟的分自增、自减从而实现时间的设置。
独立按键电路图,如图4-7所示:
图4-7独立按键电路图
按键模块流程图,如图4-8所示:
图4-8按键模块流程图
4.2.4计时模块
计数器:
是单片机应用中的重要部件,工作方式灵活,可以对外部事件计数和检测等;
实现计数功能。
其核心是特殊功能寄存器中能进行加1计数的寄存器。
实现原理:
对T0或T1引脚输入的外部脉冲计数,如下图4-9所示:
图4-9计数器原理图
计时模块流程图,如图4-10所示:
图4-10计时模块流程图
功能实现
程序运行后从当前时间开始计时。
前一段前时间如图5-1所示:
图5-1一段时间前
一段时间后时间如图5-2所示:
图5-2一段时间后
以图5-2为当前初始时间,连续按4下键1,时钟分自增4次,如图5-3所示:
图5-3自增后时间
以图5-3为当前初始时间,连续按13下键2,时钟分自减13,如图5-4所示:
图5-4自减后时间
通过此次实验,我完成了通过按键设置时钟时间,并用数码管进行显示,实现了时钟的计时功能。
本实验加深了我对单片机应用的了解。
实验过程中遇到了许多以前没有遇到的问题,这在某种程度上让我知道哪些知识是我还要加强的,哪些知识是我还欠缺的;
同时也感谢老师耐心的指导。
总而言之,通过本实验的编译让我受益匪浅。
源程序
#include<
reg52.h>
intrins.h>
#defineucharunsignedchar
#defineuintunsignedint
ucharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
ucharcodew[8]={0,1,2,3,4,5,6,7};
sbitkey1=P3^2;
sbitkey2=P3^3;
sbitkey3=P3^4;
ucharsec=56;
ucharmin=34;
ucharhour=12;
uintcount;
voidDelay(uintxms);
voidsecond();
voidminute();
voidhours();
voidother();
voidftime();
voidOutside_Init(void);
voidtimer1_int(void);
voidcharge();
voidtimeon();
voidOutside_Init1(void);
voidOutside_Init0(void);
voidDelay(uintxms)
{
uinti,j;
for(i=0;
i<
xms;
i++)
for(j=0;
j<
148;
j++)
;
}
voidsecond()
uchari,j;
i=sec/10;
j=sec%10;
P2=0x7;
P0=table[j];
Delay
(1);
P2=0x6;
P0=table[i];
Delay
(1);
voidminute()
i=min/10;
j=min%10;
P2=0x4;
Delay(