数字时钟设计步骤及原理
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
unsigned char ReadByte(unsigned char ADD);
void WriteByte(unsigned char Byte,ADD);
#define _Nop() _nop_() /*定义空指令*/
sbit zlg7289_cs =P1^1;
sbit zlg7289_clk =P2^6;
uchar keychange=0;
uchar key=0; /*键盘值*/
bit keyint=0; /*按键中断标志*/
bit keyok=1; /*数据是否修改好*/
uchar num=0; /*移位键移到哪个LED*/
/****延时函数****************************************/
OUTByte(0x06); //发送06H写使能命令字
SCK=0;
CS=1;
zlg7289_cs=1;
}
void WRDI(void) //写使能复位(禁止写{
{
zlg7289_cs=1;
SCK=0;
CS=0;
OUTByte(0x04); //发送04H写禁止命令字SCK=0;
CS=1;
zlg7289_cs=1;
***************模拟I2C总线传输程序***********************************
********************************************************************/
bit ack; /*应答标志位*/
/*******************************************************************
{
unsigned char TempCyc;
zlg7289_cs=1;
for(TempCyc=0;TempCyc<8;TempCyc++)
{
SCK = 0;
if(Byte&0x80)
SI = 1;
else
SI = 0;
SCK = 1;
Byte = Byte<<1; //右移
}
SI=0; //使SI处于确定的状态
zlg7289_cs=1;
}
//单字节数据从X25045读到单片机
//数据由SCK的下降沿输出到SO线上。
unsigned char INPUTByte(void) //输入一个字节
{
unsigned char Temp=0, TempCyc;
zlg7289_cs=1;
for(TempCyc=0;TempCyc<8;TempCyc++)
起动总线函数
********************************************************************/
void Start_I2c()
{
SDA=1; /*发送起始条件的数据信号*/
_Nop();
SCL=1;
_Nop(); /*起始条件建立时间大于4.7us,延时*/
图4显示芯片电路设计
4.双电源电路设计
系统采用双电源,平时使用V1=10V的外接电源,停电时使用电池,由V2输入。电池有6节,其电压为9V。当电池电压低于6V时,LED亮,说明电池电量不足。电路如图5所示。
图5双电源电路设计
三、程序设计
程序开始时先对系统初始化,并设置好各种中断。下步操作主要是对时钟芯片进行操作,首先要给时钟芯片设置初值,时钟芯片便自行计数。此时检测是否有按键按下,按键是为了调整时钟。有按键按下则执行按键中断程序,没有按键按下则执行下一步的操作,即取时钟芯片中的时钟值,然后送显示。程序流程图如下。
图6总体流程图
四、源程序
#include <reg51.h>
#include <intrins.h>
#include <math.h>
#define uchar unsigned char /*宏定义*/
#define uint unsigned int
uchar close_date,open_date;
}
void WRSR(void) //写状态寄存器
{
WREN();
zlg7289_cs=1;
SCK=0;
CS=0;
OUTByte(0x01); //发送01H写寄存器命令字
OUTByte(0x00); //发送寄存器值BL0,BL1为0没写保护,WD0=0 W01=1
//WD1=0WD1=0看门狗复位时间1.4S
SCK=0;
CS=1;
zlg7289_cs=1;
WIPCHK(); //判断是否写入
}
unsigned char RSDR(void) //读状态寄存器
{
unsigned char Temp;
zlg7289_cs=1;
SCK=0;
CS=0;
OUTByte(0x05); //发送05H读状态寄存器命令字
Temp = INPUTByte(); //读状态寄存器值
SCK=0;
CS=1;
return Temp;;//这一个调试时没有执行,Temp的值总是0xFF;???????????
zlg7289_cs=1;
}
void WIPCHK(void) //检查WIP位,判断是否写入完成
{
unsigned char Temp,TempCyc;
void RESWDI(void);
void WREN(void);
void WRDI(void);
void WRSR(void);
unsigned char RSDR(void);
void WIPCHK(void);
void OUTByte(unsigned char Byte);
unsigned char INPUTByte(void);
_Nop();
_Nop();
_Nop();
_Nop();
_Nop();
SDA=1; /*发送I2C总线结束信号*/
_Nop();
_Nop();
_Nop();
_Nop();
}
/*******************************************************************
图3时钟芯片电路设计
3.显示芯片电路设计
显示芯片采用ZLG7289,晶振为12MHz。ZLG7289A是广州周立功单片机发展有限公司自行设计的,具有SPI串行接口功能的可同时驱动8位共阴式数码管(或64只独立LED)的智能显示驱动芯片,该芯片同时还可连接多达64键的键盘矩阵,单片即可完成LED显示﹑键盘接口的全部功能。电路如图4所示。
字节数据传送函数
********************************************************************/
void SendByte(uchar c)
{
uchar BitCnt;
for(BitCnt=0;BitCnt<8;BitCnt++) /*要传送的数据长度为8位*/
SO=1;
SI=1;
OUTByte(0x2); //发送写指令02H如要支持000-FFF则要把高位地址左移2位再为02H相或
OUTByte(ADD); //发送低位地址
OUTByte(Byte); //发送数据
SCK=0;
CS=1;
WIPCHK();
zlg7289_cs=1;
}
/********************************************************************
{
Temp = Temp<<1; //右移
SCK = 1;
SCK=0;
if (SO)
Temp = Temp|0x01; //SO为1,则最低位为1
else
Temp&=0xFE;
}
return Temp;;//这一个调试时没有执行,Temp的值总是0
zlg7289_cs=1;
}
unsigned char ReadByte(unsigned char ADD) //读地址中的数据这里不做先导字处理,只能读00-FFH
TL0=0xb0;
RESWDI();
}
void RESWDI(void) ////复位看门狗(喂狗)
{
zlg7289_cs=1;
CS = 1;
CS = 0;
CS = 1;
zlg7289_cs=1;
}
void WREN(void) //写使能复位使用)?
{
zlg7289_cs=1;
SCK=0;
CS=0;
{
if((c<<BitCnt)&0x80)SDA=1; /*判断发送位*/
else SDA=0;
_Nop();
SCL=1; /*置时钟线为高,通知被控器开始接收数据位*/
for(TempCyc=0;TempCyc<50;TempCyc++)
{
Temp = RSDR(); //读状态寄存器
if (Temp&0x01==0)
TempCyc = 50;
}
}
//单字节指令或数据写入X25045
//在SI线上输入的数据在SCK的上升沿被锁存。
void OUTByte(unsigned char Byte) //输出一个定节
结束总线函数
********************************************************************/
void Stop_I2c()
{
SDA=0; /*发送结束条件的数据信号*/
_Nop(); /*发送结束条件的时钟信号*/
SCL=1; /*结束条件建立时间大于4μs*/
CS=1;
return Temp;//这一个调试时没有执行,Temp的
zlg7289_cs=1;
}
void WriteByte(unsigned char Byte,ADD) //向地址写入数据这里同样不做先导字处理,只能写00-FFH
{
WREN();
zlg7289_cs=1;
SCK=0;
CS=0;
void delay(uchar i)
{
while(i--);
}
//******************** TIMER1 interrupt process ***************************//
Biblioteka Baidutimer0 (void) interrupt 1 using 1
{
TH0=0x3c;
sbit zlg7289_dio =P2^7;
sbit zlg7289_key =P3^2;
sbit p07=P0^7;
sbit p06=P0^6;
sbit CS=P2^4;
sbit SCK=P2^2;
sbit SO=P2^5;
sbit SI=P2^3;
sbit p10=P1^0;
sbit SDA=P1^2; /*模拟I2C数据传送位*/
sbit SCL=P1^3; /*模拟I2C时钟控制位*/
uchar buf[9]={0x00,0x00,0x30,0x23,0x15,0x1,0x05,0x04,0x05};
uchar bufdata,bb,date;
ucharSLA=0xA2,SUBA=0x00;
uchar *p; /*接收指针*/
{
unsigned char Temp;
zlg7289_cs=1;
SCK=0;
CS=0;
SO=1;
SI=1;
OUTByte(0x3); //发送读指令03H如要支持000-FFF则要把高位地址左移3位再为03H相或
OUTByte(ADD); //发送低位地址
Temp = INPUTByte();
SCK=0;
_Nop();
_Nop();
_Nop();
_Nop();
SDA=0; /*发送起始信号*/
_Nop(); /*起始条件锁定时间大于4μs*/
_Nop();
_Nop();
_Nop();
_Nop();
SCL=0; /*钳住I2C总线,准备发送或接收数据*/
_Nop();
_Nop();
}
/*******************************************************************
二、原理图设计
1.单片机及其外围电路设计
复位采用X25045芯片,复位电路如图1所示。
图1复位电路设计
单片机采用贴片封装的AT89S51,晶振为11.0592MHz。其中P1.5~P1.7为下载程序使用,电路如图2所示。
图2单片机89S51外围电路设计
2.时钟芯片电路设计
时钟芯片采用PCF8563,晶振采用32.768K,电容使用15pf。PCF8563是PHILIPS公司推出的一款工业级内含I2C总线接口功能的具有极低功耗的多功能时钟/日历芯片。内部时钟电路、内部振荡电路、内部低电压检测电路(1.0V)以及两线制I2C总线通讯方式,不但使外围电路及其简洁,而且也增加了芯片的可靠性。同时每次读写数据后,内嵌的字地址寄存器会自动产生增量。电路如图3所示。
void WriteByte(unsigned char Byte,ADD);
#define _Nop() _nop_() /*定义空指令*/
sbit zlg7289_cs =P1^1;
sbit zlg7289_clk =P2^6;
uchar keychange=0;
uchar key=0; /*键盘值*/
bit keyint=0; /*按键中断标志*/
bit keyok=1; /*数据是否修改好*/
uchar num=0; /*移位键移到哪个LED*/
/****延时函数****************************************/
OUTByte(0x06); //发送06H写使能命令字
SCK=0;
CS=1;
zlg7289_cs=1;
}
void WRDI(void) //写使能复位(禁止写{
{
zlg7289_cs=1;
SCK=0;
CS=0;
OUTByte(0x04); //发送04H写禁止命令字SCK=0;
CS=1;
zlg7289_cs=1;
***************模拟I2C总线传输程序***********************************
********************************************************************/
bit ack; /*应答标志位*/
/*******************************************************************
{
unsigned char TempCyc;
zlg7289_cs=1;
for(TempCyc=0;TempCyc<8;TempCyc++)
{
SCK = 0;
if(Byte&0x80)
SI = 1;
else
SI = 0;
SCK = 1;
Byte = Byte<<1; //右移
}
SI=0; //使SI处于确定的状态
zlg7289_cs=1;
}
//单字节数据从X25045读到单片机
//数据由SCK的下降沿输出到SO线上。
unsigned char INPUTByte(void) //输入一个字节
{
unsigned char Temp=0, TempCyc;
zlg7289_cs=1;
for(TempCyc=0;TempCyc<8;TempCyc++)
起动总线函数
********************************************************************/
void Start_I2c()
{
SDA=1; /*发送起始条件的数据信号*/
_Nop();
SCL=1;
_Nop(); /*起始条件建立时间大于4.7us,延时*/
图4显示芯片电路设计
4.双电源电路设计
系统采用双电源,平时使用V1=10V的外接电源,停电时使用电池,由V2输入。电池有6节,其电压为9V。当电池电压低于6V时,LED亮,说明电池电量不足。电路如图5所示。
图5双电源电路设计
三、程序设计
程序开始时先对系统初始化,并设置好各种中断。下步操作主要是对时钟芯片进行操作,首先要给时钟芯片设置初值,时钟芯片便自行计数。此时检测是否有按键按下,按键是为了调整时钟。有按键按下则执行按键中断程序,没有按键按下则执行下一步的操作,即取时钟芯片中的时钟值,然后送显示。程序流程图如下。
图6总体流程图
四、源程序
#include <reg51.h>
#include <intrins.h>
#include <math.h>
#define uchar unsigned char /*宏定义*/
#define uint unsigned int
uchar close_date,open_date;
}
void WRSR(void) //写状态寄存器
{
WREN();
zlg7289_cs=1;
SCK=0;
CS=0;
OUTByte(0x01); //发送01H写寄存器命令字
OUTByte(0x00); //发送寄存器值BL0,BL1为0没写保护,WD0=0 W01=1
//WD1=0WD1=0看门狗复位时间1.4S
SCK=0;
CS=1;
zlg7289_cs=1;
WIPCHK(); //判断是否写入
}
unsigned char RSDR(void) //读状态寄存器
{
unsigned char Temp;
zlg7289_cs=1;
SCK=0;
CS=0;
OUTByte(0x05); //发送05H读状态寄存器命令字
Temp = INPUTByte(); //读状态寄存器值
SCK=0;
CS=1;
return Temp;;//这一个调试时没有执行,Temp的值总是0xFF;???????????
zlg7289_cs=1;
}
void WIPCHK(void) //检查WIP位,判断是否写入完成
{
unsigned char Temp,TempCyc;
void RESWDI(void);
void WREN(void);
void WRDI(void);
void WRSR(void);
unsigned char RSDR(void);
void WIPCHK(void);
void OUTByte(unsigned char Byte);
unsigned char INPUTByte(void);
_Nop();
_Nop();
_Nop();
_Nop();
_Nop();
SDA=1; /*发送I2C总线结束信号*/
_Nop();
_Nop();
_Nop();
_Nop();
}
/*******************************************************************
图3时钟芯片电路设计
3.显示芯片电路设计
显示芯片采用ZLG7289,晶振为12MHz。ZLG7289A是广州周立功单片机发展有限公司自行设计的,具有SPI串行接口功能的可同时驱动8位共阴式数码管(或64只独立LED)的智能显示驱动芯片,该芯片同时还可连接多达64键的键盘矩阵,单片即可完成LED显示﹑键盘接口的全部功能。电路如图4所示。
字节数据传送函数
********************************************************************/
void SendByte(uchar c)
{
uchar BitCnt;
for(BitCnt=0;BitCnt<8;BitCnt++) /*要传送的数据长度为8位*/
SO=1;
SI=1;
OUTByte(0x2); //发送写指令02H如要支持000-FFF则要把高位地址左移2位再为02H相或
OUTByte(ADD); //发送低位地址
OUTByte(Byte); //发送数据
SCK=0;
CS=1;
WIPCHK();
zlg7289_cs=1;
}
/********************************************************************
{
Temp = Temp<<1; //右移
SCK = 1;
SCK=0;
if (SO)
Temp = Temp|0x01; //SO为1,则最低位为1
else
Temp&=0xFE;
}
return Temp;;//这一个调试时没有执行,Temp的值总是0
zlg7289_cs=1;
}
unsigned char ReadByte(unsigned char ADD) //读地址中的数据这里不做先导字处理,只能读00-FFH
TL0=0xb0;
RESWDI();
}
void RESWDI(void) ////复位看门狗(喂狗)
{
zlg7289_cs=1;
CS = 1;
CS = 0;
CS = 1;
zlg7289_cs=1;
}
void WREN(void) //写使能复位使用)?
{
zlg7289_cs=1;
SCK=0;
CS=0;
{
if((c<<BitCnt)&0x80)SDA=1; /*判断发送位*/
else SDA=0;
_Nop();
SCL=1; /*置时钟线为高,通知被控器开始接收数据位*/
for(TempCyc=0;TempCyc<50;TempCyc++)
{
Temp = RSDR(); //读状态寄存器
if (Temp&0x01==0)
TempCyc = 50;
}
}
//单字节指令或数据写入X25045
//在SI线上输入的数据在SCK的上升沿被锁存。
void OUTByte(unsigned char Byte) //输出一个定节
结束总线函数
********************************************************************/
void Stop_I2c()
{
SDA=0; /*发送结束条件的数据信号*/
_Nop(); /*发送结束条件的时钟信号*/
SCL=1; /*结束条件建立时间大于4μs*/
CS=1;
return Temp;//这一个调试时没有执行,Temp的
zlg7289_cs=1;
}
void WriteByte(unsigned char Byte,ADD) //向地址写入数据这里同样不做先导字处理,只能写00-FFH
{
WREN();
zlg7289_cs=1;
SCK=0;
CS=0;
void delay(uchar i)
{
while(i--);
}
//******************** TIMER1 interrupt process ***************************//
Biblioteka Baidutimer0 (void) interrupt 1 using 1
{
TH0=0x3c;
sbit zlg7289_dio =P2^7;
sbit zlg7289_key =P3^2;
sbit p07=P0^7;
sbit p06=P0^6;
sbit CS=P2^4;
sbit SCK=P2^2;
sbit SO=P2^5;
sbit SI=P2^3;
sbit p10=P1^0;
sbit SDA=P1^2; /*模拟I2C数据传送位*/
sbit SCL=P1^3; /*模拟I2C时钟控制位*/
uchar buf[9]={0x00,0x00,0x30,0x23,0x15,0x1,0x05,0x04,0x05};
uchar bufdata,bb,date;
ucharSLA=0xA2,SUBA=0x00;
uchar *p; /*接收指针*/
{
unsigned char Temp;
zlg7289_cs=1;
SCK=0;
CS=0;
SO=1;
SI=1;
OUTByte(0x3); //发送读指令03H如要支持000-FFF则要把高位地址左移3位再为03H相或
OUTByte(ADD); //发送低位地址
Temp = INPUTByte();
SCK=0;
_Nop();
_Nop();
_Nop();
_Nop();
SDA=0; /*发送起始信号*/
_Nop(); /*起始条件锁定时间大于4μs*/
_Nop();
_Nop();
_Nop();
_Nop();
SCL=0; /*钳住I2C总线,准备发送或接收数据*/
_Nop();
_Nop();
}
/*******************************************************************
二、原理图设计
1.单片机及其外围电路设计
复位采用X25045芯片,复位电路如图1所示。
图1复位电路设计
单片机采用贴片封装的AT89S51,晶振为11.0592MHz。其中P1.5~P1.7为下载程序使用,电路如图2所示。
图2单片机89S51外围电路设计
2.时钟芯片电路设计
时钟芯片采用PCF8563,晶振采用32.768K,电容使用15pf。PCF8563是PHILIPS公司推出的一款工业级内含I2C总线接口功能的具有极低功耗的多功能时钟/日历芯片。内部时钟电路、内部振荡电路、内部低电压检测电路(1.0V)以及两线制I2C总线通讯方式,不但使外围电路及其简洁,而且也增加了芯片的可靠性。同时每次读写数据后,内嵌的字地址寄存器会自动产生增量。电路如图3所示。