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