注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

瘋人院

lunatic asylum

 
 
 

日志

 
 

电子时钟设计论文  

2008-11-19 18:29:32|  分类: 个人日记 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

 

题目名称:数字电子时钟

广州大学华软软件学院   

 

 

  摘要:  本次设计中的LED数码管电子时钟电路采用24小时制记时方式,本次设计采用AT89C51单片机的扩展芯片和6个PNP三极管做驱动,由三块LED数码管构成的显示系统,与传统的基于8/16位普通单片机的LED显示系统相比较,本系统在不显著地增加系统成本的情况下,可支持更多的LED数码管稳定显示。设计采用AT98C51单片机,使用5V电源供电,并且在按键的作用下可以进行调时,调分,复位功能。计时数据的更新在计算机C语言的驱动下每秒自动进行一次,但不需程序干预其输出状态。

 

关键词:AT89C51  数码管   LED   时钟

      

 

Abstract: The design of LED digital electronic control circuit with the 24-hour clock system in mind when they approach the design of the expansion AT89C51 single chip and chipset PNP transistor 6 so driven by the three LED digital display system consisting of control , And based on the traditional 8 / 16 of an ordinary single-chip LED display system compared to the present system does not significantly increase the cost of the system, can support more stable LED digital tube display. AT98C51 single chip design, the use of 5V power supply, and the key role can be carried out when the transfer, transfer points and reset functions. Time to update the data in the computer language C driven by a second automatic, but the procedures do not interfere with the state of the output..

 

Keyword:      AT89C51        nixietube        LED              clock

 

 

 

 

 

前言

一块单片机芯片就是一台计算机,由于单片机以其集成度高、体积小、可靠性高、控制功能强、低电压、低功耗等特点使它应用于智能仪器仪表、机电一体化、实时程控、人类生活中。除此之外还广泛应用办公自动化领域、商业营销领域、汽车及通信系统、计算机外部设备等各领域中,并且单片机已成为计算机发展和应用的一个重要方面。由此可见掌握单片机的使用方法和利用单片机解决实际问题具有重要的意义。

本次设计根据AT89C51单片机系统扩展的基本原理和方法、常用总线标准和典型接口电路的应用,结合本次设计的题目,通过单片机芯片引脚的分析,实现对数码管的位选和段选,最后通过PNP三极管的驱动LED动态显示的方式完成设计任务,设计论文中附有电路图、程序清单、各数据存储单元的所在地址和输入输出口对应表。因水平有限,难免有疏落不足之处,恳请老师和同学能给予指正。

 

 

 

 

目录:

 

1         方案论证与比较 ………………………………………………………………………4

1.1    采样方法比较与选择 ……………………………………………………………4

1.2    单片机的构成 ……………………………………………………………………4

1.3    振荡器(晶振)特性 ………………………………………………………………5

1.4    芯片擦除 …………………………………………………………………………5

1.5    AT89C51单片机的引脚说明  ……………………………………………………6

1.6    LED简介  …………………………………………………………………………8

 

2     系统设计 ………………………………………………………………………………10

       2.1   总体设计 …………………………………………………………………………10

       2.2   电路设计 …………………………………………………………………………11

2.2.1三极管接 Vcc的限流电阻电路设计………………………………………11

2.2.2 晶振负载电容电路设计……………………………………………………12

 

3   软件设计 ………………………………………………………………………………12

    3.1 程序流程图 ………………………………………………………………………13

    3.2 程序分析 …………………………………………………………………………13

 

4     结论 ……………………………………………………………………………………16

 

 

 

 

 

 

 

 

 

 

 

 

1                方案论证与比较

1.1 采样方法比较与选择

    方案一、用6个1.5K的电阻配合6个PNP型的三极管对信号进行放大,通过1.5K的电阻接Vcc正5V电产生稳定上拉信号作为数码管的片选信号输入信号。这样连接的话数码管的显示会很暗,看不清。

    方案二、直接用3个1.5K的电阻并联接到Vcc然后在电阻的另一端分别接上6个PNP型的三极管,三个电阻并联的目的是为了减低电阻直接的分压,是数码管能显示的亮一点,同时还能起到对三极管的保护作用,三个1.5K的电阻并联后的电阻是0.5K。

    由于方案二,在制作材料上能达到节省材料,和在数码管显示效果上能加强,所以我们选择方案二作为电路的焊接电路。

 

1.2单片机的构成

 AT89C51单片机是在一块芯片中集成了CPU、RAM、ROM、定时器/计数器和多种功能的I/O线等一台计算机所需要的基本功能部件,AT89C51单片机单片机内包含下列几个部件:

(1) 一个8位CPU;

(2)一个片内振荡器及时钟电路;

(3)4K字节ROM程序存储器;

(4)128字节RAM数据存储器;

(5)两个16位定时器/计数器;

(6)可寻址64K外部数据存储器和64K外部程序存储器空间的控制电路;

(7)32条可编程的I/O线(四个8位并行I/O端口);

(8)一个可编程全双工串行口;

(9)具有五个中断源、两个优先级嵌套中断结构。

其内部机构框图如图2.2所示:   

           电子时钟设计论文 - bo;bo - 欢迎

 

 

 

1.3振荡器(晶振)特性

XTAL1(19脚)和XTAL2(18脚)分别为反向放大器的输入和输出,通过这两个引脚接上晶振,其频率为12.000MHz。

 

1.4芯片擦除

整个PEROM阵列和三个锁定位的电擦除可通过正确的控制信号组合,并保持ALE管脚处于低电平10ms 来完成。在芯片擦操作中,代码阵列全被写“1”且在任何非空存储字节被重复编程以前,该操作必须被执行。

此外,AT89C51单片机设有稳态逻辑,可以在低到零频率的条件下静态逻辑,支持两种软件可选的掉电模式。在闲置模式下,CPU停止工作,但RAM,定时器,计数器,串口和中断系统仍在工作。在掉电模式下,保存RAM的内容并且冻结振荡器,禁止所用其他芯片功能,直到下一个硬件复位为止。

为了满足一些应用系统的特殊要求,有时要进行一些系统的扩展设计以弥补单片机内部资源的不足。单片机的扩展系统通过并行I/O接口或串行I/O接口做总线,在外部扩展程序存储器、数据存储器或输入/输出接口及其他功能部件以满足一些控制系统的特殊要求,AT89C51单片机的扩展系统结构如图2.3所示。

                    电子时钟设计论文 - bo;bo - 欢迎

1.5 AT89C51单片机的引脚说明

AT89C51单片机采用40条引脚双列直插式器件,引脚除5V( 40脚)和电源地( 20脚)外,其功能分为时钟电路、控制信号、输入/输出三大部分,逻辑框图及引脚图分别如图2.4(a)(b)所示

电子时钟设计论文 - bo;bo - 欢迎

AT89C51单片机的内部硬件结构中除了程序存储器由FPEROM取代了87C51单片机的EPROM外,其余部分完全相同,其管脚说明如下:

(1)VCC:供电电压

(2)GND:接地

(3)时钟电路

   XTAL1(19脚)——芯片内部振荡电路(单级反相放大器)输入端。

    XTAL2(18脚)——芯片内部振荡电路(单级反相放大器)输出端。

(4)控制信号

RST(9脚)复位信号:时钟电路工作后,在此引脚上将出现两个机器周期的高电平,芯片内部进行初始复位,P0口~P3口输出高电平,将初值07H写入堆栈指针。

ALE(30脚)地址锁存信号:当访问外部存储器时,P0口输出的低8位地址由ALE输出的控制信号锁存到片外地址锁存器,P0口输出地址低8位后,又能与片外存储器之间传送信息。另外,ALE可驱动4个TTL门。

(29脚)片外程序存储器读选通: 低电平有效, 作为程序存储器的读信号,输出负脉冲,将相应的存储单元的指令读出并送到P0口, 可驱动8个TTL门。

/Vpp(30脚):当 为高电平且PC值小于0FFFH时,CPU执行内部程序存储器程序;当 为低电平时,CPU仅执行外部程序存储器程序。

(5)I/O接口

P0口(P0.0~P0.7,39~32脚)三态双向口:P0口结构包括一个输出锁存器、两个三态缓冲器、一个输出驱动电路和一个输出控制端。P0口做地址/数据复用总线使用。若从P0口输出地址数据信息,此时控制端为高电平,若从P0口输入数据指令信息时,引脚信号应从输入三态缓冲器进入地址总线,它可驱动8个TTL门。P0~P3口上的“读-修改-写”功能,其操作是先将字节的全部8位数读入,再通过指令修改某些位,然后将新的数据写回到口锁存器中。

P1口(P1.0~P1.7,1~8脚)准双向口:P1口做通用I/O接口使用,P1口的每一位口线能独立地作用于输入线,P1口可驱动4个TTL门。

P2口(P2.0~P2.7,21~28脚)通用I/O接口:它做通用I/O接口使用时,是一个准双向口,此时转换开关MUX倒向左边,输出极与锁存器相连,引脚可作为用户I/O口线使用,输入/输出操作与P1口完全相同,P2口做地址总线使用。当系统中接有外部存储器时,P2口用于输出高8位地址A8~A15,这时在CPU控制下,转换开关MUX倒向右边,接通内部地址总线。P2口的口线状态取决于片内输出的地址信息,这些信息来源于PC、DPTR等。在外接程序存储器中,由于访问外部存储器操作连续不断,P2口不断送出地址高8位。AT89C51单片机的P2口一般只做地址总线使用,不做I/O接口直接连外部设备使用。

P3口(P3.0~P3.7,10~17脚)双功能口:P3口做通用I/O接口使用,输出功能控制线为高电平,与非门的输出取决于锁存器的状态,此时锁存器Q端的状态与其引脚状态是一致的。在这种情况下,P3口的结构和操作与P1口相同。P3口第二功能是可作为系统具有控制功能的控制线,另外P3口可驱动4个LSTTL门电路。P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流,这是由于上拉的缘故。

P3口也可作为AT89C51的一些特殊功能口使用如:

P3.0 RXD(串行输入口);

P3.1 TXD(串行输出口);

P3.2 /INT0(外部中断0);

P3.3 /INT1(外部中断1);

P3.4 T0(记时器0外部输入);

P3.5 T1(记时器1外部输入);

P3.6 /WR(外部数据存储器写选通);

P3.7 /RD(外部数据存储器读选通);

 

1.6 LED简介

LED数码管根据LED的接法不同分为共阴和共阳两类,了解LED的这些特性,对编程是很重要的,因为不同类型的数码管,除了它们的硬件电路有差异外,编程方法也是不同的。图2.7(a)是共阴和共阳极数码管的内部电路图,它们的发光原理是一样的,只是它们的电源极性不同而已。

将多只LED的阴极连在一起即为共阴式,而将多只LED的阳极连在一起即为共阳式。以共阴式为例,如把阴极接地,在相应段的阳极接上正电源,该段即会发光。当然,LED的电流通常较小,一般均需在回路中接上限流电阻。假如我们将"b"和"c"段接上正电源,其它端接地或悬空,那么"b"和"c"段发光,此时,数码管显示将显示数字“1”。而将"a"、"b"、"d"、"e"和"g"段都接上正电源,其它引脚悬空,此时数码管将显示“2”。其它数字的显示原理与此类同。

LED的7段数码管利用单只LED组合排列成“8”字型的数码管,分别引出它们的电极,点亮相应的点划来显示出0-9的数字。在这次的设计中采用的均是共阴极的LED显示,当I/O口输出为高电平的时候,对应段就被点亮。LED数码管的结构图如图2.7(b)所示。

                                     电子时钟设计论文 - bo;bo - 欢迎

这次设计的显示部分采用AT89C51单片机动态扫描完成, 在多数的应用场合中,我们并不希望使用多I/O端口的单片机,原则上是使用尽量少引脚的器件。在没有富余端口的情况下,应通过优化设计程序和扩展电路达到预期的目的。动态扫描的频率有一定的要求,频率太低,LED将出现闪烁现象。如频率太高,由于每个LED点亮的时间太短,LED的亮度太低,肉眼无法看清,所以一般均取几个ms左右为宜,这就要求在编写程序时,选通某一位LED使其点亮并保持一定的时间,程序上常采用的是调用延时子程序。

LED显示电路

(1) 静态显示电路

LDE显示器工作在静态显示时,其公共阳极(或阴极) 接VCC(或GND) ,一直处于显示有效状态,所以每一位的显示内容必须由锁存器加以锁存,显示各位相互独立。

(2) 动态显示电路   

将所有位的段选线的同名端联在一起,由一个8位I/O口控制,形成段选线的多位复用。而各位的公共阳极或公共阴极则分别由相应的I/O口线控制,实现各位的分时选通,即同一时刻只有被选通位是能显示相应的字符,而其他所有位都是熄灭的。由于人眼有视觉暂留现象,只要每位显示间隔足够短,则会造成多位同时点亮的假象。这就需要单片机不断地对显示进行控制,CPU需要不断地进行显示刷新.

 

2  系统设计

2.1  总体设计

数码管选中信号从P2口出来进过三极管的放大来到数码管的共阳极引脚,选中6个数码管中的其中一个;P1口出来是数码管的段选信号,通过对数码管的编码显示不同的数字进行显示。本设计,设置了三个按键,一个调时,一个调分,还有一个复位

    

电子时钟设计论文 - bo;bo - 欢迎

                                               总体设计框架图

 

2.2  单元电路设计

2.2.1  三极管接Vcc的限流电阻电路设计

 

因为元器件的限制0.5k左右的电阻只有6个,通过三个1.5k的电阻并联接法得到大小为0.5k左右的电阻,接0.5k左右的电阻是为了限流,同时又不会使数码管的显示很暗。

2.2.2        晶振负载电容电路设计

 

 

晶体元件的负载电容是指在电路中跨接晶体两端的总的外界有效电容。是指晶振要正常震荡所需要的电容。一般外接电容,是为了使晶振两端的等效电容等于或接近负载电容。要求高的场合还要考虑ic输入端的对地电容。应用时一般在给出负载电容值附近调整可以得到精确频率。此电容的大小主要影响负载谐振频率和等效负载谐振电阻。

 

         晶振的负载电容=[(Cd*Cg)/(Cd+Cg)]+Cic+△C式中Cd,Cg为分别接在晶振的两个脚上和对地的电容,Cic(集成电路内部电容)+△C(PCB上电容).就是说负载电容15pf的话,两边个接27pf的差不多了,一般a为6.5~13.5pF  

 

3  软件设计

主控制芯片为AT89C51 ,为了直观和易懂,所以采用c语言编程方便简单.

3.1   软件流程图如下:

        电子时钟设计论文 - bo;bo - 欢迎     

 

 

3.2 程序分析如下:

 

#include

#define uchar unsigned char         //宏定义

#define uint unsigned int

uchar code dispcode[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90 ,0xff};//不带小数点控制显示什么内容

uchar code dispcodedian[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0xff};//显示小数点的数据显示表

//uchar dispbitcode[]={0x81,0x82,0x84,0x88,0x90,0xa0};           //控制那个数码管亮npn

uchar dispbitcode[]={0x5f,0x7e,0x7d,0x7b,0x77,0x6f};          //控制那个数码管亮pnp

uchar dispbuf[6];           //中间变量

uchar dispbitcnt,second,minite,hour;

uint tcnt;                      //计数

sbit k1=P3^0;               //复位           

sbit k2=P3^1;               //调分

sbit k3=P3^2;               //调时

 

void key(void);                    //按键子程序

void delay(uint z);         //延时子程序声明

void init();                    //初始化子程序

void display();                     //显示子程序

void main(void)

{

       init();

       while(1)

    { 

              key();

              display();        //调用延时

    }

}

void display()               //显示子函数

{

       dispbuf[0]=dispcode[second%10];

       dispbuf[1]=dispcode[second/10];

       dispbuf[2]=dispcodedian[minite%10];

       dispbuf[3]=dispcode[minite/10];

       dispbuf[4]=dispcodedian[hour%10];

       dispbuf[5]=dispcode[hour/10];

      

       P2=dispbitcode[dispbitcnt];

       P1=dispbuf[dispbitcnt];        

    dispbitcnt++;

       if(dispbitcnt==6)

       {

              dispbitcnt=0;

       }

       delay(5); 

}

void key(void)                     //按键设置

{

       if(k1==0)              //复位

       {

              delay(5);        //延时5ms,实现判断时跳过不稳定时期,在稳定期判断。

              if(k1==0)

              {

                     second=0;

                     minite=0;

                     hour=12;

                    

              }

              while(k1==0);       

              delay(5);

              while(k1==0);

       }

       if(k2==0)   //调分

       {

              delay(5);

              if(k2==0)

              {

                     minite++;

                     if(minite==60)

                     {

                            minite=0;

                     }                  

              }

              while(k2==0);

              delay(5);

              while(k2==0);

       }

       if(k3==0) //调时

       {

              delay(5);

              if(k3==0)

              {

                     hour++;

                     if(hour==24)

                     {

                            hour=0;

                     }                  

              }

              while(k3==0);

              delay(5);

              while(k3==0);

       }    

}

 

void timer() interrupt 1 //中断程序控制时间的自动的累加

{

      

       TH0=(65536-5000)/256;

       TL0=(65536-5000)%256; 

       tcnt++;

       if(tcnt==200)        

       {

              tcnt=0;

              second++;

              if(second==60)

        {

                     second=0;

                     minite++;

                     if(minite==60)

            {

                            minite=0;

                            hour++;

                            if(hour==24)

                {

                                   hour=0;

                }

            }

        }

       }

}

void delay(uint z)//延时

{

       uint i,j;

       for(i=z;i>0;i--)

              for(j=110;j>0;j--);

}

void init()              //程序的初始化函数

{

       EA=1;            //打开总中断

       TR0=1;         

       ET0=1;

       TMOD=0x01;

       TH0=(65536-5000)/256;

       TL0=(65536-5000)%256;

      

       hour=12;

       minite=0;

       second=0;

      

}

 

4 结论

由于电路设计合理,功能电路基本能实现设计要求,程序简单明了,基本上达到了题目要求的各项指标。从硬件焊接反方面来说,觉得比较棘手的就是是在焊数码管时,和整体器件的布局。布局不好会影响后面工序焊接的还乱,在这点上我们组自己觉得做的很不错,布线焊接模块功能区分明确。在编程中遇到的最大困难就是延时的计算和数码管显示的程序段,在整体程序来看,我们采用程序的结构话,使程序明朗,各功能程序段都以子程序的方式调用,所以在主程序中是相当的简单明朗的。在硬件和软件的结合过程中也遇到比较大的问题,就是一开始数码管全不老是显示8,或是乱码之类的,进过调试,现在没有出现中现象了。这也是我们的一大攻关吧。

参考文献:

《单片机c语言》 ;

《电子技术》 ;

《单片机原理及应用》,李建忠著,西安:西安电子科技大学,2002年;

 

附录:

附1:元器件明细表:

1、  AT89C51

2、  数码管

3、  10K,1.5K,0.5K电阻

4、  PNP三极管

5、  30pf电容

6、  10uF电解电容

7、  12.000MHz晶振

 

附2:仪器设备清单

 

1、  数字万用表         

2、  稳压电源

3、  示波器

  评论这张
 
阅读(7500)| 评论(12)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017