[原创]基于proteus仿真16*64点阵屏带DS1302实钟芯片

本文介绍了作者作为大一新生,如何在未系统学习相关课程的情况下,通过自学完成基于Proteus的16*64点阵屏仿真项目,其中涉及到DS1302实钟芯片的使用。文章详细阐述了设计思路,包括电路模型、源程序编写和调试过程,以及74HC595移位寄存器的工作原理。同时,讨论了DS1302的特性及与之通信的协议,并提供了项目的源代码链接。
摘要由CSDN通过智能技术生成

注:本人大一新生,未学习电路,单片机,C语言,汇编均为自学内存,故难免有所疏露,希望大家多多指点。

  该项目为惠州学院计算机系嵌入式培训班硬件组的任务(本人是电子系的,但还是加入了呵)。

设计思路:

  1,确定电路模型。

  2,写源程序。

  3,调试。

项目名称:基于PROTEUS仿真的16*64点阵屏

关键字:16,64,点阵,PROTEUS,DS1302,74HC595。

元器件使用清单
AT89S52*1 无源晶振33MHz*1 无源晶振32.768KHz 电容33pF*2 电容10uF*1 限流电阻10K*1 复位式按键开关*1 钮扣电池3V*1
74HC595 DS1302 74HC154 8*8LED点阵        

实现思路:


  最小系统就不讲了,由于扫描次数多,故晶振频率要高,避免抖动。

  首先,讲级联,这是我最最头痛的事了。在网下载了几份英文的中文的数据手册后,便开始了有道之旅,看完了整份英文版的数据手册后我有了想把74595翻译成中文的欲望。为什么?因为我觉得我能把它翻译得比百度上面的好呵呵,开玩笑的。嗯,请看74595的原理图。

 

 

  芯片简介:The HC595A consists of an 8–bit shift register and an 8–bit D–type latch with three–state parallel outputs. The shift register accepts serial data and provides a serial output. The shift register also provides parallel data to the 8–bit latch. The shift register and latch have independent clock inputs. This device also has an asynchronous reset for the shift register.

  HC595A包含了一个8位的移位寄存器和一个8位3态并行输出的D类型锁存器。移位寄存器通过串行数据输入(SERIAL DATA INPUT)接收串行数据,并附有一个串行数据输出口(SERIAL DATA OUTPUT)用于级联。移位寄存器提供并行数据给8位锁存器。两个寄存器有着独立的时钟脉冲输入。该器件的移位寄存器也有一个异步复位引脚。

   数据手册中很多表,那都是很有用的,因为那些参数关系到一个产品的稳定性等。但对于大一的我,就只是半懂不懂的略看了一下,说不拿出来说了哈,因为还没学电路和模电。

       PIN DESCRIPTIONS

 

INPUTS
A (Pin 14)
Serial Data Input. The data on this pin is shifted into the
8–bit serial shift register.
CONTROL INPUTS
Shift Clock (Pin 11)
Shift Register Clock Input. A low– to–high transition on this
input causes the data at the Serial Input pin to be shifted into
the 8–bit shift register.
Reset (Pin 10)
Active–low, Asynchronous, Shift Register Reset Input. A
low on this pin resets the shift register portion of this device
only. The 8–bit latch is not affected.

 Latch Clock (Pin 12)

Storage Latch Clock Input. A low–to–high transition on this
input latches the shift register data.
Output Enable (Pin 13)
Active–low Output Enable. A low on this input allows the
data from the latches to be presented at the outputs. A high
on this input forces the outputs (QA–QH) into the high–
impedance state. The serial output is not affected by this
control unit.
OUTPUTS
QA – QH (Pins 15, 1, 2, 3, 4, 5, 6, 7)
Noninverted, 3–state, latch outputs.
SQH (Pin 9)
Noninverted, Serial Data Output. This is the output of the
eighth stage of the 8–bit shift register. This output does not
have three–state capability.

翻译:

A:毫无疑问,是数据输入引脚。

Shift Clock:移位寄存器时钟脉冲输入引脚,给该引脚一个上升沿(低电平变化成高电平),数据(一位)将从A引脚读入移位寄存器,怎么实现的呢?首先,将原来的寄存器的里二进制数据移位SRn---->SRn+1,并且把SRH的数据通过SERIAL DATA OUTPUT输出(可以被下一个595的A读取,从而实现级联)。

RESET:复位就说了吧。一个低电平就可以了。

LATCH CLOCK:锁存器时钟脉冲,给它一个上升沿,移位寄存器里的数据将输入到LATCH寄存器里面去,如果OUTPUT ENABLE输入使能端为低电平,数据将通过LATCH输出。

注:移位寄存器时钟脉冲变化与内置锁存器脉冲的变化时独立的,即没影响。  

  好了,讲完了引脚,那么上级联的图片(PROTEUS)吧。

 

  嗯这就是级联图,怎么样?是不是和网上其他人的一样,对!我就是参考别人的哈。

  接下来,请看74154——一个4对16的译码器的真值表,这个译码器采用压缩BCD码(具体请百度)。

  

  怎么用应该知道了吧,就是我给A0~A3一个压缩BCD码值,它的16个输出引脚将输出上面真值表的值。很显然,每次只有一个引脚输出低电平。

  嗯,我是能过级联,给595一个64个位的数据,再驱动154选中一行,点亮图型的一行,如此循环,就显示出了图形,时间,数字等。

  好了,讲讲DS1302吧。

DS1302:

  The DS1302 trickle-charge timekeeping chip contains a real-time clock/calendar and 31 bytes of static RAM.

  我的翻译:DS1302是一个带涓流充电的时间记录芯片,它包含了一个实时时钟/日历和大小为31字节的RAM。

  这里,我插入DS1302的引脚图(来自MAXIM DS1302)

  

  

  嗯,讲下引脚吧,X1,X2(XTAL)接一个32.768KHz的晶振,这里,需要强调的有以下来自DATASHEET中的一句话。

  “The DS1302 uses an external 32.768kHz crystal. The oscillator circuit does not require any external resistors or capacitors to operate.”

  

  

  从这句话可以知,DS1302的晶振电路是不需要电容的,在网上下载(百度中“DS1302中文资料”第一篇)的数据手册的接线图是错的呵,

原作者在该晶振中接了6PF的电容(可能他不小心看错了吧),这个表的意思是该晶振具有6PF的负载容抗应该,因为DS1302内部己经集成了

电容了呵呵。

  VCC1连接一个3V的备用电源的正极。

  VCC2正常情况下连接大于3.2V的主供应电源。

  CE:老版本的数据手册里面为RESET(复位),为什么换名了呢?这应该是DS1302新增了“突发/爆发模式”的原故吧,我觉得。

    CE有两个作用:其一,打开如Figure1图中逻辑控制器,使移位寄存器能接收指令或地址。其二,提供一种终止结束单/多字节数据传输的方法。

    在输出/输入数据时,该引脚必须为高电平。注意:在开始数据传输时,SCLK引脚必须为0(低电平)时才能把CE拉至1(高电平)。在一个字

    节的数据传输完时,如是CE还保持高电平,则启动突发模式,即可以连续读/写时间/日历寄存器,或连续读/写31个字节的RAM。

  插一下与DS1302通迅的“协议”哈。

  

  DS1302的输出/输入只有一个脚啊!怎么与它通讯呢?——串口通讯。

  与DS1302通讯前,先发一条COMMAND,然后再执行相应的读写操作。

  在上表中,第0位控制读/写,显然,bit0=0时为写操作,A0~A4为对应的操作数(地址),2^5=32>31(RAM内存)。而bit6为你要操作的对象,是RAM还是

 DS1302的时钟/日历寄存器?而最高位MSB(即bit7,英文为most significant bit),正常情况下为1,为0的话,DS1302停止工作。

  好了,讲回引脚吧,I/O显然是通讯引脚,而SCLK来头比较大些,下面详讲。

   SCLK:当SCLK在上升沿时,DS1302移位寄存器读入指令(command)一个位。下降沿时,DS1302输出时间/日历/数据/的一个位。无论读出读入,都是从bit0

开始的。嗯,也就是说,给DS1302传指令需要一位一位的传,传一个bit的同时SCLK要上升沿,而读时每读一个字节前要制造一个下降沿。另外,还有一点要注意的是,

若传输的是读指令,读出数据/时间将在读指令最后一位输入后的第一个下降沿输出。程序写不好的话会造成读出数据不准(见下图)。另外,再声明一次,DS1302中,时钟/日历

寄存器中的数据是用压缩BCD码表示的。读出写入时间/日历都应做相应的转换。(见下)

  写入的时间/日期可用一个宏来实现:#define BCD(time) (time/10*16+time%10)    //定义宏,将要写入DS1302的时间转化为BCD码 

  而读出呢?反过来思考下就行了哈哈。

  

  

  

  指令(COMMAND)数据手册已经详细给出了。就是数据手册Table 3. Register Address/Definition里面的READ/和WRITE里面的数据,RAM同理在下面有给出。

  这是我写的驱动程序(仅供参考,可能有误):

display显示程序执行文件
/***************************************************************************************
*   File Name:        74HC595驱动程序
*    Effect:        驱动74HC595
*    Head:            74HC595.h
*    Explaination:    函数ShiftReg用于输出一个8个位的数据;
*                    函数ShiftMove用于输出一个位的后mov位;
*                    函数ShiftAdd用于输一个数据的前mov位;
*                    函数OE_595用于控制74595的输出使能端;
*                    函数Init595用于初使化74595;
*                    函数LoadLatch用于将shift register中的数据装载进Latch register.
*    Author:        Mason     
*    别名:            小菜
*    Email Address:    1609099954@qq.com
*    last modified time:2012-7-25             
*    Performance:Finished
*    Question:
**************************************************************************************/

#include<reg52.h>
#include"drive595.h"

sbit OUTEN        =P1^0;             //Connected OUTEN to OutputEnable of 74HC595
sbit RESET74595    =P1^1;             //Reset
sbit LCLK        =P1^2;            //Latch Clock
sbit SCLK        =P1^3;            //Serial Clock
sbit SDIN        =P1^4;            //Serial Data Input

extern void ShiftReg(unsigned char TranChar)       //函数ShiftReg用于输出一个8个位的数据
{
    unsigned char z;
    for(z=0;z<8;z++)
    {
        ((TranChar&0x80)!=0x00)?(SDIN=1):(SDIN=0);    
        SCLK=1;                                      //上升沿:使SDIN数据读入Shift Register
        TranChar<<=1;
        SCLK=0;            
    }
}

extern void Shiftmove(unsigned char TranChar,unsigned mov)
{                                                   //函数ShiftMove用于输出一个位的后mov位
    unsigned char z;
    TranChar<<=mov;
    for(z=0;z<7-mov;z++)
    {
        ((TranChar&0x80)!=0x00)?(SDIN=1):(SDIN=0);    
        SCLK=1;                              //rising edge:使SDIN数据读入Shift Register
        TranChar<<=1;                      
        SCLK=0;            
    }
}

extern void Shiftadd(unsigned char TranChar,unsigned mov)
{                                          //函数ShiftAdd用于输一个数据的前mov位
    unsigned char z;
    for(z=0;z<mov;z++)
    {
        ((TranChar&0x80)!=0x00)?(SDIN=1):(SDIN=0);    
        SCLK=1;                              //rising edge:使SDIN数据读入Shift Register
        TranChar<<=1;
        SCLK=0;    
    }
}       

extern void OE_595(char flag)            //该函数用于控制输出使能端
{
    OUTEN=flag;    
}

extern void LoadLatch(void)
{
    LCLK=1;                                  //上升沿:使Latch最后一位数据通过级连传给下一595
    LCLK=0;
}

extern void Init595(void)
{
    RESET74595=1;
    OUTEN=1;
    LCLK=0;                //Serial data input
    SCLK=0;                //Serial clock
}

extern void Reset595(void)                //复位74HC595
{
    RESET74595=0;
    RESET74595=1;
}
74HC595驱动程序头文件
/***************************************************************************************
*   File Name:        74HC595驱动程序头文件
*    Effect:        声名外部函数
*    Head:            74HC595.h
*    Explaination:    函数ShiftReg用于输出一个8个位的数据;
*                    函数ShiftMove用于输出一个位的后mov位;
*                    函数ShiftAdd用于输一个数据的前mov位;
*                    函数OE_595用于控制74595的输出使能端;
*                    函数Init595用于初使化74595;
*                    函数LoadLatch用于将shift register中的数据装载进Latch register.
*    Author:        Mason     
*    别名:            小菜
*    Email Address:    1609099954@qq.com
*    last modified time:2012-7-22             
*    Performance:    Finished
*    Question:
**************************************************************************************/

#ifndef DRIVE595_H
#define DRIVE595_H

extern void ShiftReg(unsigned char TranChar);                     //向74595传输TranChar 的8个位
extern void Shiftmove(unsigned char TranChar,unsigned mov);         
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值