我去年使用DS1307郁闷了几天.<br />基于I2C总线,时钟没有工作.结果是软件配置问题.<br /><br />下面为一参考程序.百分百可以跑.<br /><br />//*******************************************************************<br />//***此程序为调试通过的源程序<br />//***文件名:SY1126.C***//<br />//***是51系例单片机的最小系统<br />//***有AT89S8252/AT89S51/52的在线下载功能<br />//***IIC总线芯片为24C02,记存密码<br />//*******************************************************************<br />#include"at89x52.h"<br />#include<intrins.h><br />#define uchar unsigned char <br />#define uint unsigned int<br />#define nop _nop_() /* 定义空操作指令 */<br />#define VAR P1<br />sbit clk=P2^0; /*DTLED-6显示芯片/时钟芯片DS1302时钟输入端*/<br />sbit dout=P2^1; /*DTLED-6显示芯片数据读入端*/<br />sbit en =P2^2; /*DTLED-6显示芯片使能端*/ <br />sbit RST=P2^3; /*DS1302芯片复位起始端*/<br />sbit DINOUT=P2^4; /*DS1302时钟芯片数据输入输出端*/ <br />sbit enable=P2^5; /*LCD模块用*/<br />sbit rw=P2^6; /*LCD模块用*/<br />sbit rs=P2^7; /*LCD模块用*/<br /><br />sbit SCL=P3^4; /*24C01 CSL接脚=89C51 T0 P3.4*/<br />sbit SDA=P3^5; /*24C01 SDA接脚=89C51 T1 P3.5*/<br /><br />bit FLAG0=0; /*位标号FLAG0=1键盘扫描回应*/<br />bit FLAG1=1; /*位标号20H.1比较密码回应旗号*/<br />bit FLAG2=1; /*位标号FLAG2=0时,进入键盘操作*/<br />bit FLAG3=1; /*位标号FLAG3=0时,键盘操作*/<br />bit FLAG4=0; /*位标号FLAG4=0时,键盘操作*/<br />bit FLAG5=0; /*位标号FLAG5=1时,存储*键按下*/<br />bit FLAG6=0; /*位标号FLAG6=1时,有串行信号输入*/<br />bit TSendAddress(uchar slaaddress,uchar subaddress,uchar * s,uchar no); /* 向有子地址器件写入6字节数据函数 */<br />bit TRcvAddress(uchar slaaddress,uchar subaddress,uchar * s,uchar no); /* 向有子地址器件读取6字节数据函数 */<br />bit acknow; /* 应答标志位 acknow=1 表示正常响应 acknow=0 表示未响应 */<br />static const char tab[16]={0x01,0x02,0x03,0x0c, /*键盘码00,01,02,03,*/<br /> 0x04,0x05,0x06,0x0d, /*键盘码04,05,06,07,*/<br /> 0x07,0x08,0x09,0x0e, /*键盘码08,09,0a,0b,*/<br /> 0x0a,0x00,0x0b,0x0f};/*键盘码0c,0d,0e,0f*/<br />//static const char tab1[6]={0x01,0x01,0x01,0x01,0x01,0x01};/*内定密码"888888"*/<br />uchar char1[]="Syber Nanjing.Co";<br />uchar char2[]="Password:";<br />uchar dispbuf[9]; /*显示值存放阵列*/<br />uchar clocktmp[3]; /*显示值存放阵列*/<br />uchar bufdata[9]; <br />uchar bufuart[6]; /*串口接收值存放阵列*/<br />uchar a1=0,clockbak,b1=100,stand=0,m=0,busy,count=10; <br />char ww=0,ptr=0,ptr1=0; /*PTR键盘扫描指标,ptr1显示器扫描指标*/<br />void delay (unsigned int value) /*延时副程式*/<br /> {<br /> while (value!=0) value--; /*10US延时*/<br /> }<br />void Enable(uchar c);<br />void Write1(char *c1); <br />void Write2(char c2); <br />void Write3(void); /* 显示密码字符串 */<br />void Initial(); /*LCD模块初始化*/<br />void tsled(void); /*串行发送到DTLED-6副程式*/ <br />void BCD(void); /*BCD码转换副程式*/<br />void scan(void); /*键盘扫描副程式*/<br />void clear(void); /*清除按键存放/显示器阵列dispbuf[]副副程式*/<br />void open(void); /*开门比较密码副程式*/ <br />void read24c02(); /*读24c02的存储值*/<br />void write24c02(); /*写24c02的存储值*/<br />void IICSAVE(void); /*设定密码并存入buft[]阵列副程式*/<br />void disp(void); /*显示存放在dispbuf[]阵列的密码副程式*/ <br />void tserial(void); /*串口serial发送副程式*/ <br />void rserial(void); /*串口serial接收副程式*/ <br />void temp(void);<br />void Rd1302st(void); /*读时钟芯片DS1302*/<br />void Rd1302(void); /*读时钟芯片DS1302*/<br />void Wr1302(void); /*写时钟芯片DS1302*/<br />void Start(); /* 起动总线函数 */<br />void Stop(); /* 结束总线函数 */<br />void SendByte(uchar c); /* 8951发数据或地址给8583 字节数据发送函数 */<br />uchar RcvByte(); /* 8951从24C01读数据字节数据接收函数 */<br />void Ack(bit a); /* 主机8951应答子函数 */<br />void xch(void); /*宣告按键存放/显示器阵列dispbuf[]右键滚入副程式*/ <br />void wxb1(void); /*0~9计数,秒*/ <br />void wxb2(void); /*0~9计数,分*/ <br />void wxb3(void); /*0~9计数,时*/ <br />void save_clocks(void); /*按显示时间更改时钟*/<br />void speekclose(void);<br />void LCD_disple(void); /*液晶显示*/<br />/***********************************************************************/<br />main() /*主程式*/<br />{<br /> TMOD=0x11; /*TIMER0工作在案MODE1,16位定时器*/<br /> /*TIMER1工作在MODE2,自动重新装载模式*/<br /> /*方式寄存器TMOD___________________________*/<br /> /*| 定时器1 | 定时器1 |*/<br /> /*| GATE|C/T| M1 | M0 | GATE|C/T| M1 | M0 |*/<br /> /*|___________________|___________________|*/<br /> TH1=256-(28800/9600); /*设定传输波特率9600,晶体振荡器=11.059Mhz*/<br /> /*|波特率9600时|SMOD=0|C/T=0|模式=2|自动载入TH1=FD|*/ <br /> /*|波特率4800时|SMOD=0|C/T=0|模式=2|自动载入TH1=FA|*/<br /> /*|波特率2400时|SMOD=0|C/T=0|模式=2|自动载入TH1=F4|*/<br /> /*|波特率1200时|SMOD=0|C/T=0|模式=2|自动载入TH1=E8|*/<br /> TR1=1; /*启动TEMER0*/<br />// T2MOD=0x02; /*定时器2工作在输出模式*/<br /> T2CON=0x38; /*定时器2工作控制寄存器T2CON_________________*/<br /> /*| TF2|EXF2|RCLK|TCLK|EXEN2|TR2|C/T2|CP/RL2|*/<br /> /*|___________________|_____________________|*/<br /> TL2=0xfd; /*设定传输波特率9600,晶体振荡器=11.059Mhz*/<br /> TH2=0xff; /*设定传输波特率9600,晶体振荡器=11.059Mhz*/<br /> RCAP2L=0xdc; /*设定传输波特率9600,晶体振荡器=11.059Mhz*/<br /> RCAP2H=0xff; /*设定传输波特率9600,晶体振荡器=11.059Mhz*/<br /> TH2=256-(28800/9600); /*设定传输波特率9600,晶体振荡器=11.059Mhz*/<br /> /*|波特率9600时|SMOD=0|C/T=0|模式=2|自动载入TH1=FD|*/ <br /> /*|波特率4800时|SMOD=0|C/T=0|模式=2|自动载入TH1=FA|*/<br /> /*|波特率2400时|SMOD=0|C/T=0|模式=2|自动载入TH1=F4|*/<br /> /*|波特率1200时|SMOD=0|C/T=0|模式=2|自动载入TH1=E8|*/<br /> TR2=1; /*启动TEMER2*/<br /> SCON=0x50; /*设定UART工作在MODE3模式,可传送和接收数据 REN=1*/<br /> /*串列控制寄存器SCON_______________________*/<br /> /*| 7 6 5 4 | 3 2 1 0 |*/<br /> /*| SM0| SM1| SM2| REN| TB8| RB8| TI | RI |*/<br /> /*|___________________|___________________|*/<br /> IE=0x98; /*8是允许中断,a是TIMER0,TIMER1中断致能位*/<br /> /*| 7 6 5 4 | 3 2 1 0 |*/<br /> /*| EA | | ET2| ES | ET1| EX1| ET0| EX0|*/<br /> /*|___________________|___________________|*/<br /> IP=0x18; /*中断优先级寄存器IP_______________________*/<br /> /*| | | PT2| PS | PT1| PX1| PT0| PX0|*/<br /> /*|___________________|___________________|*/<br /> read24c02(); /*呼叫读取密码存放在DATE1[]副程式*/<br /> dispbuf[0]=0x03; /*小数点位*/<br /> dispbuf[7]=0x01; /*ID号码*/<br /> dispbuf[8]=0x01; /*蜂鸣器设定开/二次分频*/<br /> Rd1302st(); /*读时钟芯片DS1302*/<br /> LCD_disple(); /*液晶显示*/<br /> P0=0xff;<br />while(1)<br /> {<br /> scan(); /*呼叫键盘扫描副程式有按FLAG0会为1*/<br /> if(FLAG0==1) <br /> {<br /> temp(); /*判断有按键输入否?*/<br /> }<br /> else<br /> {FLAG4=FLAG5=0;<br /> if(FLAG2==1)<br /> {<br /> Rd1302(); /*读时钟芯片DS1302*/<br /> if(dispbuf[1]!=clockbak) /*秒加一*/ <br /> {<br /> clockbak=dispbuf[1];<br /> tsled(); /*串行发送到DTLED-6副程式*/ <br /> tserial(); /*宣告串口serial发送副程式*/ <br /> }<br /> }<br /> }<br /> }<br />}<br />//*********************************************************************/<br />//串行发送DTLED-6显示<br />//dispbuf0-dispbuf1-dispbuf2-dispbuf3-dispbuf4-dispbuf5-dispbuf6-dispbuf7-dispbuf8<br />// 小数点 - 数码管1- 数码管2- 数码管3- 数码管4- 数码管5- 数码管6-ID识别码-BZ识别码<br />//00000xxx-0000xxxx-0000xxxx-0000xxxx-0000xxxx-0000xxxx-0000xxxx-0000xxxx-0000xxxx<br />//小数点=1~6,其它为不显示 <br />//数码管1-6=0~15,<br />//ID识别码=0~15 <br />//BZ识别码=BZ.3为蜂鸣输出控制位,0=关闭,1=打开<br />// BZ0~2为蜂鸣频率输出设定为,000=不分频, 最高频率输出=4800Hz;<br />// 001=一次分频,频率输出=4800/ 2 =2400Hz;<br />// 010=二次分频,频率输出=4800/ 4 =1200Hz;<br />// 011=三次分频,频率输出=4800/ 8 =600Hz;<br />// 100=四次分频,频率输出=4800/ 16=300Hz;<br />// 101=五次分频,频率输出=4800/ 32=150Hz;<br />// 110=六次分频,频率输出=4800/ 64=75Hz; <br />// 111=七次分频,频率输出=4800/128=38Hz; <br />//======================================================================<br />void tsled(void) /*串行发送DTLED-6显示副程式*/ <br />{ char ts0,i,j;<br /> clk=0;<br /> en=0;<br /> delay(10);<br /> for(j=0;j<9;j++)<br /> { ts0=dispbuf[j];<br /> for(i=0;i<4;i++) /*发小数点码8,4,2,1*/<br /> {<br /> clk=1;<br /> ts0=ts0<<1; <br /> if(AC==1) <br /> dout=1;<br /> else dout=0;<br /> clk=0;<br /> nop;<br /> delay(3);<br /> }<br /> } <br /> en=1;<br />} /*返回主程式*/<br />/***********************************************************************/<br />// 设定 字符型LCD模块, 使用DB0--DB7,显示两行,<br />// 使用5*7字型 显示器要显示 光标要显示但不闪烁 */<br />//======================================================================<br />void LCD_disple() /*液晶显示*/<br />{ delay(1000);<br /> Initial();<br /> Enable(0x80); /* 从第1行第1列开始显示 */<br /> Write1(char1); /* 显示第1行字符串 */<br /> Enable(0xc0); /* 从第2行第1列开始显示 */<br /> Write1(char2); /* 显示第2行字符串 */<br /> Enable(0xc9); /* 从第2行第1列开始显示 */<br /> Write3(); /* 显示第2行字符串 */<br />}<br />//======================================================================<br />void Initial() /*LCD模块初始化*/<br />{<br /> Enable(0x01); /*清除显示*/ <br /> delay(300); /*清除需大于1.64ms*/<br /> Enable(0x38); /*LCD功能设定,8位元数据传送,2行显示*/<br /> Enable(0x0f); /*屏幕设定,游标ON,游标闪烁*/ <br /> Enable(0x06); /*加一状态,游标向右移*/<br />} <br />//======================================================================<br />void Write1(char *c1) <br />{while(*c1!=0)<br /> {Write2(*c1);<br /> c1++;<br /> }<br />}<br />//======================================================================<br />void Write3(void) <br />{uchar i=6; <br />while(i>0)<br /> { P0=bufdata|0x30;<br /> rs=1;rw=0;<br /> enable=1;<br /> delay(2);<br /> enable=0;<br /> i--;<br /> }<br />}<br />//======================================================================<br />void Write2(char c2) <br />{P0=c2;<br />rs=1;rw=0;enable=1;<br />delay(2);<br />enable=0;<br />}<br />//======================================================================<br />void Enable(uchar c)<br />{<br />P0=c;<br />rs=0;<br />rw=0;<br />enable=1;<br />delay(2);<br />enable=0; <br />}<br /><br />/***********************************************************************/<br />void temp(void)<br />{ FLAG2=0;<br /> if(tab[ptr]==0x0e) <br /> {disp(); /*如果是按“C”则呼叫显示密码DISP*/<br /> while(m==P1); /*按钮放开否?*/<br /> dispbuf[0]=0x03; /*小数点位*/<br /> }<br /> else /*否则往下执行*/<br /> {<br /> switch(tab[ptr]) /*是则测试ptr键盘扫描计数器指标至TAB[]取到的键盘码*/<br /> {<br /> case 0x0a: <br /> write24c02(); /*是否按“*”是则呼叫设定密码SET*/<br /> clear(); /*是否按“#”是则呼叫清除显示器CLEAR*/<br /> while(m==P1); /*按钮放开否?*/<br /> break; /*跳出此循环*/<br /> case 0x0b: <br /> clear(); /*是否按“#”是则呼叫清除显示器CLEAR*/<br /> while(m==P1); /*按钮放开否?*/<br /> break; /*跳出此循环*/<br /> case 0x0c: /*是否按“A”,未规划键待用户自己定义*/<br /> FLAG2=1; P3_2=1; <br /> dispbuf[0]=0x03; /*小数点位*/<br /> break; /*跳出此循环*/<br /> case 0x0d: /*是否按“B”,未规划键待用户自己定义*/ <br /> break; /*跳出此循环*/<br /> case 0x0e: /*是否按“C”,已侦测过*/ <br /> read24c02(); /*呼叫读取密码存放在DATE1[]副程式*/<br /> break; /*跳出此循环*/ <br /> case 0x0f: <br /> while(m==P1); /*按钮放开否?*/<br /> open(); /*是否按“D”,是则呼比较密码开门副程式*/<br /> dispbuf[0]=0x03; /*小数点位*/<br /> goto openend;<br /> break; /*跳出此循环*/<br /> default: <br /> xch(); /*以上均不是则为数字键呼叫XCH作右键滚入*/<br /> break; /*跳出此循环*/<br /> } /*跳出SWITCH*/<br /> delay(100); /*按钮抗机械反弹跳*/<br /> while(m==P1); /*按钮放开否?*/<br /> tsled(); /*串行发送到DTLED-6副程式*/<br />openend: nop;<br /> } <br />} /*返回上一层程式*/<br />/****************************************************/<br />void temp_setclock(void) /*判断有按键输入否?*/<br />{<br />switch(dispbuf[0]) /*是则测试ptr键盘扫描计数器指标至TAB[]取到的键盘码*/<br /> {<br /> case 0x01: <br /> wxb1(); /*0~9计数*/ <br /> break; /*跳出此循环*/<br /> case 0x03: <br /> wxb1(); /*0~9计数*/ <br /> break; /*跳出此循环*/<br /> case 0x05: <br /> wxb2(); /*0~2,0~4计数*/ <br /> break; /*跳出此循环*/<br /> default: /*以上均不是*/<br /> break; /*跳出此循环*/<br /> } <br /> delay(100); /*按钮抗机械反弹跳*/<br /> while(m==P1); /*按钮放开否?*/<br /> tsled(); /*串行发送到DTLED-6副程式*/<br />} /*返回上一层程式*/<br />/****************************************************/<br />void wxb1(void)<br />{<br /> switch(tab[ptr]) /*是则测试ptr键盘扫描计数器指标至TAB[]取到的键盘码*/<br /> {<br /> case 0x02: <br /> dispbuf[dispbuf[0]]++; /*是按“上”,是则呼叫设定密码SET*/<br /> if(dispbuf[dispbuf[0]]>9)<br /> {dispbuf[dispbuf[0]+1]++; <br /> dispbuf[dispbuf[0]]=0;<br /> } <br /> if(dispbuf[dispbuf[0]+1]==6)<br /> {dispbuf[dispbuf[0]+1]=dispbuf[dispbuf[0]]=0;<br /> } <br /> break; /*跳出此循环*/<br /> case 0x08: <br /> if(dispbuf[dispbuf[0]]==0) /*是按“下”,是则呼叫清除显示器CLEAR*/<br /> {if(dispbuf[dispbuf[0]+1]==0) <br /> dispbuf[dispbuf[0]+1]=6;<br /> dispbuf[dispbuf[0]]=10; <br /> dispbuf[dispbuf[0]+1]--;<br /> } <br /> dispbuf[dispbuf[0]]--; <br /> break; /*跳出此循环*/<br /> case 0x04: /*是按“左”,未规划键待用户自己定义*/<br /> dispbuf[0]=dispbuf[0]+2; /*小数点左移一位*/<br /> if(dispbuf[0]>6)<br /> dispbuf[0]=1;<br /> break; /*跳出此循环*/<br /> case 0x06: /*是按“右”,未规划键待用户自己定义*/ <br /> if(dispbuf[0]<3)<br /> dispbuf[0]=7;<br /> dispbuf[0]=dispbuf[0]-2; /*小数点右移一位*/<br /> break; /*跳出此循环*/<br /> case 0x0a: /*是按“*”,已侦测过*/ <br /> FLAG5=1;<br /> break; /*跳出此循环*/ <br /> case 0x0c: /*是否按“A”,未规划键待用户自己定义*/<br /> FLAG4=FLAG5=P3_2=1; <br /> dispbuf[0]=0x03; /*小数点位*/<br /> break; /*跳出此循环*/<br /> default: /*以上均不是*/<br /> break; /*跳出此循环*/<br /> } <br />} /*返回上一层程式*/<br />/****************************************************/<br />void wxb2(void)<br />{switch(tab[ptr]) /*是则测试ptr键盘扫描计数器指标至TAB[]取到的键盘码*/<br /> {case 0x02: <br /> dispbuf[dispbuf[0]]++; /*是按“上”,是则呼叫设定密码SET*/<br /> if(dispbuf[dispbuf[0]+1]==2)<br /> {if(dispbuf[dispbuf[0]]>4)<br /> {dispbuf[dispbuf[0]+1]=dispbuf[dispbuf[0]]=0;} <br /> }<br /> else<br /> {if(dispbuf[dispbuf[0]]>9)<br /> {dispbuf[dispbuf[0]+1]++; dispbuf[dispbuf[0]]=0;} <br /> if(dispbuf[dispbuf[0]+1]>2)<br /> {dispbuf[dispbuf[0]+1]=dispbuf[dispbuf[0]]=0;} <br /> }<br /> break; /*跳出此循环*/<br /> case 0x08: <br /> if(dispbuf[dispbuf[0]]==0) /*是按“下”,是则呼叫清除显示器CLEAR*/<br /> {if(dispbuf[dispbuf[0]+1]==0) <br /> {dispbuf[dispbuf[0]+1]=2;<br /> dispbuf[dispbuf[0]]=5; <br /> } <br /> else <br /> {dispbuf[dispbuf[0]]=10; dispbuf[dispbuf[0]+1]--;<br /> } <br /> }<br /> dispbuf[dispbuf[0]]--; <br /> break; /*跳出此循环*/<br /> case 0x04: /*是按“左”,未规划键待用户自己定义*/<br /> dispbuf[0]=dispbuf[0]+2; /*小数点左移一位*/<br /> if(dispbuf[0]>6)<br /> dispbuf[0]=1;<br /> break; /*跳出此循环*/<br /> case 0x06: /*是按“右”,未规划键待用户自己定义*/ <br /> if(dispbuf[0]<3)<br /> dispbuf[0]=7;<br /> dispbuf[0]=dispbuf[0]-2; /*小数点右移一位*/<br /> break; /*跳出此循环*/<br /> case 0x0a: /*是按“*”,已侦测过*/ <br /> FLAG5=1;<br /> break; /*跳出此循环*/ <br /> case 0x0c: /*是否按“A”,未规划键待用户自己定义*/<br /> FLAG4=FLAG5=P3_2=1; <br /> dispbuf[0]=0x03; /*小数点位*/<br /> break; /*跳出此循环*/<br /> default: /*以上均不是*/<br /> break; /*跳出此循环*/<br /> } <br />} /*返回上一层程式*/<br />/****************************************************/<br />void save_clocks(void) /*按显示时间更改时钟*/<br />{clocktmp[0]=dispbuf[1]|(dispbuf[2]<<4);<br /> clocktmp[1]=dispbuf[3]|(dispbuf[4]<<4);<br /> clocktmp[2]=dispbuf[5]|(dispbuf[6]<<4);<br /> Wr1302();<br /> FLAG2=1; <br /> nop;<br />}<br />/****************************************************/<br />void xch(void) /*显示向右移动副程式*/<br />{char c; /*宣告变数*/<br /> for(c=6;c>0;c--)<br /> {dispbuf[c]=dispbuf[c-1];/*将显示器dispbuf[]移位交换,dispbuf[3]->dispbuf[4]->dispbuf[5]...*/<br /> }<br /> dispbuf[0]=0; /*有安键时,小数点不亮*/<br /> dispbuf[1]=tab[ptr]; /*新的按键值存入dispbuf[1],最低位*/<br />} /*返回上一层程式*/<br />/****************************************************/<br />void open(void) /*开门比较密码副程式*/<br />{char c; /*宣告变数*/<br /> FLAG1=1; /*设开门标号为1*/<br />for(c=1;c<6;c++) /*比较六个密码*/<br /> {if(dispbuf[c]!=bufdata[c]) /*显示值(按键值disbuf[])与密码TAB[]比较是否相等*/<br /> FLAG1=0;<br /> if(FLAG1==0) /*FLAG1=0 表示不相等*/<br /> break; /*跳出此循环*/<br /> }<br /> if(FLAG1==1) /*如FLAG1=1 表示密码相等,令电锁P2.0置0动作*/<br /> { /*密码正确*/<br /> dispbuf[8]=0x09; /*蜂鸣器设定开/二次分频*/<br /> dispbuf[0]=0x01; /*小数点到最高位位*/<br /> P3_2=0; /*P3.2置0,使绿色下载指示灯亮(喇叭响)*/ <br />// TMOD=0x11;<br /> TR1=1; /**/<br /> TF1=0;<br /> IE=0x9f; /*8是允许中断,a是TIMER0,TIMER1中断致能位*/<br /> tsled(); /*串行发送到DTLED-6副程式*/ <br /> while(FLAG5==0) /*等待设置死循环*/<br /> {<br /> scan(); /*呼叫键盘扫描副程式有按FLAG0会为1*/<br /> if(FLAG0==1) <br /> {<br /> temp_setclock(); /*判断有按键输入否?*/<br /> }<br /> if(FLAG6==1) <br /> {tsled(); /*串行发送到DTLED-6副程式*/ <br /> FLAG6=0;<br /> }<br /> }<br /> if(FLAG4==0)<br /> save_clocks(); /*按显示时间更改时钟*/<br /> } <br /> else P3_2=1; /*密码错,P3.2置1,关闭绿色下载指示灯灭(喇叭不响)*/ <br />} /*返回上一层程式*/<br />/******************************************************/<br />void clear(void) /*清除显示器dispbuf[]为00副程式*/<br />{char c; /*宣告变数*/<br /> for(c=1;c<7;c++) /*将00存入显示阵列dispbuf[]*/<br /> {dispbuf[c]=0x00;<br /> } <br />} /*返回上一层程式*/<br />/******************************************************/<br />void Wr1302(void) /*写时钟芯片DS1302*/<br />{char i,j,ts0,conb,conbyt;<br /> conb=0x80;<br /> ts0=conb;<br />//<br />for(j=0;j<3;j++) /*写秒,分,时三次循环*/<br /> {clk=RST=0; /*DS1302系统初始化*/<br /> nop;nop;<br /> RST=1;<br /> for(i=0;i<8;i++) /*写控制字到DS1302*/<br /> {clk=0; /*清时钟*/<br /> if(conb&0x01) <br /> DINOUT=1;<br /> else DINOUT=0;<br /> clk=1; /*时钟上升沿,发送数据有效*/<br /> conb=conb>>1; <br /> nop;<br /> }<br /> clk=0; /*清时钟*/<br /> conb=ts0+2+j*2;<br /> conbyt=clocktmp[j]&0x7f;<br /> for(i=0;i<8;i++) /*写设定值到DS1302*/<br /> {clk=0; /*清时钟*/<br /> if(conbyt&0x01) <br /> DINOUT=1;<br /> else DINOUT=0;<br /> &n
|