测试程序7:DS1302时钟芯片。刚开始时间能设置,能读写。后来在单步执行的过程中,一缕烟从DS1302上冒出来。不知是什么原因。芯片很烫。
现在好了。(在DS1302的数据端串入一个电阻可能更好,欢迎指正)。
时间设置与时间读取都用批传送模式。自定义了几个汉字。先上个图。
 
void ds1302wrNb(unsigned char * string)
{
//输入程序代码
 DS1302RST=0;DS1302RST=0;DS1302RST=0;DS1302RST=0;DS1302RST=0;DS1302RST=0;DS1302RST=0;
 DS1302RST=1;DS1302RST=1;DS1302RST=1;DS1302RST=1;DS1302RST=1;DS1302RST=1;DS1302RST=1;DS1302RST=1;
 DS1302CLK=0;
 temp=0xbe;//read:80   write:81
 for(i=0;i<8;i++)                //write command to DS1302
 {
  if(temp&1) DS1302IO=1;else DS1302IO=0;
  temp=temp>>1;
  DS1302CLK=1;DS1302CLK=1;DS1302CLK=1;DS1302CLK=1;DS1302CLK=1;DS1302CLK=1;
  DS1302CLK=0;DS1302CLK=0;DS1302CLK=0;DS1302CLK=0;DS1302CLK=0;DS1302CLK=0;
 }
 while(*string!=0)
 {
 temp=*string;string++;
 for(i=0;i<8;i++)                //write data to DS1302
  {
  if(temp&1) DS1302IO=1;else DS1302IO=0;
  temp=temp>>1;
  DS1302CLK=1;DS1302CLK=1;DS1302CLK=1;DS1302CLK=1;DS1302CLK=1;DS1302CLK=1;
  DS1302CLK=0;DS1302CLK=0;DS1302CLK=0;DS1302CLK=0;DS1302CLK=0;DS1302CLK=0;
  }
 }
 temp=0;//写  保护位
 for(i=0;i<8;i++)                //write data to DS1302
 {
  if(temp&1) DS1302IO=1;else DS1302IO=0;
  temp=temp>>1;
  DS1302CLK=1;DS1302CLK=1;DS1302CLK=1;DS1302CLK=1;DS1302CLK=1;DS1302CLK=1;
  DS1302CLK=0;DS1302CLK=0;DS1302CLK=0;DS1302CLK=0;DS1302CLK=0;DS1302CLK=0;
 }
 DS1302RST=0;
}
void d1302rdN(void)
{
//输入程序代码
 
 DS1302RST=0;DS1302RST=0;DS1302RST=0;DS1302RST=0;DS1302RST=0;DS1302RST=0;DS1302RST=0;
 DS1302RST=1;DS1302RST=1;DS1302RST=1;DS1302RST=1;DS1302RST=1;DS1302RST=1;DS1302RST=1;DS1302RST=1;
 DS1302CLK=0;
 temp=0xbf;//read:80   write:81
 for(i=0;i<8;i++)                //write command to DS1302
 {
  if(temp&1) DS1302IO=1;else DS1302IO=0;
  temp=temp>>1;
  DS1302CLK=1;DS1302CLK=1;DS1302CLK=1;DS1302CLK=1;DS1302CLK=1;DS1302CLK=1;
  DS1302CLK=0;DS1302CLK=0;DS1302CLK=0;DS1302CLK=0;DS1302CLK=0;DS1302CLK=0;
 }
 DS1302IO=1;
 for(j=0;j<7;j++)
 { temp=0;
  for(i=0;i<8;i++)
  { temp>>=1;
   if (DS1302IO) temp+=128; 
   DS1302CLK=1;DS1302CLK=1;DS1302CLK=1;DS1302CLK=1;DS1302CLK=1;DS1302CLK=1;
   DS1302CLK=0;DS1302CLK=0;DS1302CLK=0;DS1302CLK=0;DS1302CLK=0;DS1302CLK=0;
  }
  dispbuf[j]=temp;
 }
DS1302RST=0;
}
/*
func:0: time stop
  1: time start
  2: write protect
  3: write free
  4: charge mode 1
  5: charge mode 2
*/
void ds1302ctr(unsigned char func)
{
//输入程序代码
 if (func==0) {temp=ds1302read(0); temp|=0x80;ds1302write(0,temp); } //time stop
 if (func==1) {temp=ds1302read(0); temp&=0x7f;ds1302write(0,temp); }  //time start
 if (func==2) {ds1302write(7,0x80);   }
 if (func==3) {ds1302write(7,0x0);   }
}