万历数字钟及可调时钟标准系统文档格式.docx
- 文档编号:21713466
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:39
- 大小:21.69KB
万历数字钟及可调时钟标准系统文档格式.docx
《万历数字钟及可调时钟标准系统文档格式.docx》由会员分享,可在线阅读,更多相关《万历数字钟及可调时钟标准系统文档格式.docx(39页珍藏版)》请在冰豆网上搜索。
图5双电源电路设计
三、程序设计
程序开始时先对系统初始化,并设置好各种中断。
下步操作主要是对时钟芯片进行操作,首先要给时钟芯片设置初值,时钟芯片便自行计数。
此时检测是否有按键按下,按键是为了调整时钟。
有按键按下则执行按键中断程序,没有按键按下则执行下一步的操作,即取时钟芯片中的时钟值,然后送显示。
程序流程图如下。
图6总体流程图
四、源程序
#include<
reg51.h>
intrins.h>
math.h>
#defineucharunsignedchar/*宏定义*/
#defineuintunsignedint
ucharclose_date,open_date;
voidRESWDI(void);
voidWREN(void);
voidWRDI(void);
voidWRSR(void);
unsignedcharRSDR(void);
voidWIPCHK(void);
voidOUTByte(unsignedcharByte);
unsignedcharINPUTByte(void);
unsignedcharReadByte(unsignedcharADD);
voidWriteByte(unsignedcharByte,ADD);
#define_Nop()_nop_()
sbitzlg7289_cs=P1^1;
sbitzlg7289_clk=P2^6;
sbitzlg7289_dio=P2^7;
sbitzlg7289_key=P3^2;
sbitp07=P0^7;
sbitp06=P0^6;
sbitCS=P2^4;
sbitSCK=P2^2;
sbitSO=P2^5;
sbitSI=P2^3;
sbitp10=P1^0;
sbitSDA=P1^2;
/*模拟I2C数据传送位*/
sbitSCL=P1^3;
/*模拟I2C时钟控制位*/
ucharbuf[9]={0x00,0x00,0x30,0x23,0x15,0x1,0x05,0x04,0x05};
ucharbufdata,bb,date;
ucharSLA=0xA2,SUBA=0x00;
uchar*p;
ucharkeychange=0;
ucharkey=0;
/*键盘值*/
bitkeyint=0;
/*按键中断标志*/
bitkeyok=1;
/*数据是否修改好*/
ucharnum=0;
/*移位键移到哪个LED*/
voiddelay(uchari)
{
while(i--);
}
//********************TIMER1interruptprocess***************************//
timer0(void)interrupt1using1
TH0=0x3c;
TL0=0xb0;
RESWDI();
voidRESWDI(void)////复位看门狗(喂狗)
zlg7289_cs=1;
CS=1;
CS=0;
voidWREN(void)//写使能复位使用)?
SCK=0;
CS=0;
OUTByte(0x06);
//发送06H写使能命令字
CS=1;
voidWRDI(void)//写使能复位(禁止写{
OUTByte(0x04);
//发送04H写禁止命令字SCK=0;
voidWRSR(void)//写状态寄存器
WREN();
OUTByte(0x01);
//发送01H写寄存器命令字
OUTByte(0x00);
//发送寄存器值BL0,BL1为0没写保护,WD0=0W01=1
//WD1=0WD1=0看门狗复位时间1.4S
WIPCHK();
//判断是否写入
unsignedcharRSDR(void)//读状态寄存器
unsignedcharTemp;
OUTByte(0x05);
//发送05H读状态寄存器命令字
Temp=INPUTByte();
//读状态寄存器值
returnTemp;
;
//这一个调试时没有执行,Temp的值总是0xFF;
?
voidWIPCHK(void)//检查WIP位,判断是否写入完成
unsignedcharTemp,TempCyc;
for(TempCyc=0;
TempCyc<
50;
TempCyc++)
Temp=RSDR();
//读状态寄存器
if(Temp&
0x01==0)
TempCyc=50;
//单字节指令或数据写入X25045
//在SI线上输入的数据在SCK的上升沿被锁存。
voidOUTByte(unsignedcharByte)//输出一个定节
unsignedcharTempCyc;
8;
SCK=0;
if(Byte&
0x80)
SI=1;
else
SI=0;
SCK=1;
Byte=Byte<
<
1;
//右移
}
SI=0;
//使SI处于确定的状态
//单字节数据从X25045读到单片机
//数据由SCK的下降沿输出到SO线上。
unsignedcharINPUTByte(void)//输入一个字节
unsignedcharTemp=0,TempCyc;
Temp=Temp<
SCK=1;
if(SO)
Temp=Temp|0x01;
//SO为1,则最低位为1
Temp&
=0xFE;
//这一个调试时没有执行,Temp的值总是0
unsignedcharReadByte(unsignedcharADD)//读地址中的数据这里不做先导字处理,只能读00-FFH
SO=1;
SI=1;
OUTByte(0x3);
//发送读指令03H如要支持000-FFF则要把高位地址左移3位再为03H相或
OUTByte(ADD);
//发送低位地址
//这一个调试时没有执行,Temp的
voidWriteByte(unsignedcharByte,ADD)//向地址写入数据这里同样不做先导字处理,只能写00-FFH
OUTByte(0x2);
//发送写指令02H如要支持000-FFF则要把高位地址左移2位再为02H相或
OUTByte(Byte);
//发送数据
/********************************************************************
***************模拟I2C总线传输程序***********************************
********************************************************************/
bitack;
/*应答标志位*/
/*******************************************************************
起动总线函数
voidStart_I2c()
SDA=1;
/*发送起始条件的数据信号*/
_Nop();
SCL=1;
/*起始条件建立时间大于4.7us,延时*/
SDA=0;
/*发送起始信号*/
/*起始条件锁定时间大于4μs*/
SCL=0;
/*钳住I2C总线,准备发送或接收数据*/
结束总线函数
voidStop_I2c()
/*发送结束条件的数据信号*/
/*发送结束条件的时钟信号*/
/*结束条件建立时间大于4μs*/
/*发送I2C总线结束信号*/
字节数据传送函数
voidSendByte(ucharc)
ucharBitCnt;
for(BitCnt=0;
BitCnt<
BitCnt++)/*要传送的数据长度为8位*/
{
if((c<
BitCnt)&
0x80)SDA=1;
elseSDA=0;
/*置时钟线为高,通知被控器开始接收数据位*/
/*保证时钟高电平周期大于4μs*/
/*8位发送完后释放数据线,准备接收应答位*/
if(SDA==1)ack=0;
elseack=1;
/*判断是否接收到应答信号*/
字节数据接收函数
********************************************************************/
ucharRcvByte()
ucharretc;
retc=0;
/*置数据线为输入方式*/
BitCnt++)
/*置时钟线为低,准备接收数据位*/
/*时钟低电平周期大于4.7s*/
/*置时钟线为高使数据线上数据有效*/
retc=retc<
if(SDA==1)retc=retc+1;
/*读数据位,接收的数据位放入retc中*/
return(retc);
应答子函数
voidAck_I2c(bita)
if(a==0)SDA=0;
/*在此发出应答或非应答信号*/
elseSDA=1;
/*时钟低电平周期大于4μs*/
/*清时钟线,钳住I2C总线以便继续接收*/
向有子地址器件发送多字节数据函数
bitISendStr(ucharsla,ucharsuba,uchar*s)
uchari;
Start_I2c();
/*启动总线*/
SendByte(sla);
/*发送器件地址*/
if(ack==0)return(0);
SendByte(suba);
/*发送器件子地址*/
for(i=0;
i<
9;
i++)
{
SendByte(*s);
/*发送数据*/
s++;
Stop_I2c();
/*结束总线*/
return
(1);
向有子地址器件读取多字节数据函数
bitIRcvStr(ucharsla,ucharsuba,uchar*s)
SendByte(sla+1);
*s=RcvByte();
Ack_I2c(0);
/*发送就答位*/
Ack_I2c
(1);
/*发送非应位*/
/**********模拟I2C程序结束***************************/
voiddisplay(uintdis)
ucharj;
zlg7289_clk=0;
delay(20);
zlg7289_cs=0;
for(j=0;
j<
16;
j++)
if((dis&
0x8000)==0x8000)zlg7289_dio=1;
elsezlg7289_dio=0;
zlg7289_clk=1;
delay(10);
dis=dis<
zlg7289_cs=1;
voiddis_play(ucharaa)
if(_crol_(aa,i)&
zlg7289_dio=1;
zlg7289_dio=0;
zlg7289_clk=1;
zlg7289_clk=0;
voiddisplaymonth()
bufdata=buf[5]&
0x0f;
dis_play(0xc8);
dis_play(bufdata);
delay(70);
0x30;
bufdata=bufdata>
>
4;
bufdata=bufdata&
dis_play(0xc9);
bufdata=buf[7]&
dis_play(0xca);
0x10;
dis_play(0xcf);
voiddisplaytime()
bufdata=buf[3]&
dis_play(0xce);
0x70;
dis_play(0xcd);
bufdata=buf[4]&
dis_play(0xcc);
delay(10
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 万历 数字 可调 时钟 标准 系统