基于51单片机实现的简单闹钟设计

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

【摘要】众所周知闹钟对我们日常生活来讲是一个很重要的工具,因而我利用单片机AT89C52制作一个简单的倒计时定时闹钟。本设计利用单片机的内部中断资源和按键的基本使用方法构思而成。利用按键设定需要定时的时间长短,利用中断设置20次中断定义一秒,然后利用程序设计时间倒数。并使用4个8段数码管显示分和秒,并且定时结束后使用电铃警示。硬件系统利用proteus仿真,在仿真中就能观察到系统的实际运行情况。

【关键字】

单片机AT89C51 倒计时定时中断 protues仿真

一、设计项目简介

基于51单片机进行简单闹钟设计。四位数码管从左往右分别代表十分位,分位,十秒位,秒位。按动对应按键能增加各个位的数值,按动开始计时按键能开始倒计时。

二、硬件设计

1.总体设计思路

控制芯片使用比较熟悉的AT89C52单片机芯片,数码管使用四位相连的8段共阴数码管,并且使用74HC573锁存器控制数码管的显示。在定时过程使用s1控制十分位,s2控制分位,s3控制十秒位,

s4控制秒位,s5开始倒计时。

基本思路设计如下:

2. AT89C52芯片介绍

80C52是INTEL 公司MCS-51系列单片机中基本的产品,它采用INTEL 公司可靠的CHMOS 工艺技术制造的

高性能8位单片机,属于标准的MCS-51的HCMOS 产品。它结合了HMOS 的高速和高密度技术及CHMOS 的低功耗特征,它基于标准的MCS-51单片机体系结构和指令系统,属于80C51增强型单片机版本,集成了时钟输出和向上或向下计数器等更多的功能,适合于类似马达控制等应用场合。

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

控制按键

AT89C52控制芯片

74HC573锁存器

数码管

电路。

此外,80C52还可工作于低功耗模式,可通过两种软件选择空闲和掉电模式。在空闲模式下冻结CPU而RAM定时器、串行口和中断系统维持其功能。掉电模式下,保存RAM数据,时钟振荡停止,同时停止芯片内其它功能。80C52有PDIP(40pin)和PLCC(44pin)两种封装形式。8051片内有 ROM,无须外接外存储器和373,更能体现“单片”的简练。

3.74HC573芯片介绍

74HC573的八个锁存器都是透明的D 型锁存器,当使能(G)为高时,Q 输出

将随数据(D)输入而变。当使能为低时,输出将锁存在已建立的数据电平上。输出控制不影响锁存器的内部工作,即老数据可以保持,甚至当输出被关闭时,新的数据也可以置入。这种电路可以驱动大电容或低阻抗负载,可以直接与系统总线接口并驱动总线,而不需要外接口。特别适用于缓冲寄存器,I/O 通道,双向总线驱动器和工作寄存器。数据锁存当输入的数据消失时,在芯片的输出端,数据仍然保持;这个概念在并行数据扩展中经常使用到。

锁存器接单片机芯片如下:

4.单片机内部中断原理

内部中断是指单片机内部的功能模块产生中断信号,只要是单片机

内部在CPU外围能独立工作的功能模块都会提供中断功能,常见的内部中断类型有时钟Timer、串口UART、模数转换ADC等。内部中断的工作流程和外部中断没太多区别,只是中断请求信号是在单片机内部进行传输,中断信号不是管脚上的电平状态,而是一个寄存器里面的相应标志位,通常当某个内部中断产生中断请求时就会将相应标志位置为1,CPU响应中断时将这个标志位清0。

5.设计原理图

三、软件设计

C语言源程序

#include

#define uint unsigned int

#define uchar unsigned char

sbit dula=P2^6; //段码和位码设置。

sbit wela=P2^7;

sbit s1=P3^0; //设置按键,s1代表十分位,s2分位,s3十秒位,s4秒位。sbit s2=P3^1;

sbit s3=P3^2;

sbit s4=P3^3;

sbit s5=P3^4;

sbit beep=P2^3; //设置电铃

uchar code seg_table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; // 共阴极8位段码表,带点和不带点。

uchar code seg_table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};

void delay(uint t); //各个子函数的申明。

int display1();

void display2(uint k);

void init_t0();

uint NUM;

uint SEC;

uint S;

uint M;

uint k1;

uint k2;

uint k3;

uint k4;

void main()

{

NUM=0,SEC=0 ,S=0,M=0,k1=0,k2=0,k3=0,k4=0,wela=0,dula=0,wela=1,P1=0x00,wela=0,dula=1,P1=seg_table[NUM],dula=0;

while(1)

{

display1(); //运行开始设置时间函数

if(s5==0)

{

goto start; //当s5按键按下,开始倒计时。

相关文档
最新文档