高级会员 
 
主题
回帖0
积分603
阅读权限30
注册时间2012-10-23
最后登录1970-1-1
在线时间 小时
 
 
 
 
 | 
 
编了一个ds1302  +74hc573 +89c52 的钟  带整点报时,  现在的问题是一旦整点了一报时  这个报时的1秒里  显示不正常,  我现在的意思是想  在报时(蜂鸣器响1秒)的1,秒里  他能正常显示   上程序: 
#include"89.h" 
#include"INTRINS.h" 
#define uchar unsigned char 
#define uint unsigned int 
sbit T_CLK=P2^5; 
sbit T_IO=P2^6; 
sbit T_RST=P2^7; 
//数码管显示 定义 
sbit k1=P1^5;   //实现复位(就是ds1302初始化) 
sbit wei1=P2^0;  //四位数码管 
sbit wei2=P2^1; 
sbit wei3=P2^2; 
sbit wei4=P2^3; 
sbit k2=P1^2;  //实现设置键 
sbit jia=P1^3;   //实现加 
sbit jian=P1^4;//实现减 
sbit duan=P2^4;//74hc573  高允许,低不允许。 
sbit led=P1^1;//  实现两个LED灯 每秒闪一下 
sbit fmq=P1^0;//蜂鸣器 
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; 
uchar a,b,c,d,n,x,s,zs,za; 
char z,m; 
void ys1s(void)   //误差 0us 
{ 
    unsigned char a,b,c; 
    for(c=167;c>0;c--) 
        for(b=171;b>0;b--) 
            for(a=16;a>0;a--); 
    _nop_();  //if Keil,require use intrins.h 
} 
void baoshi()             //报时,为了美观 我这里把位  全开了  
{ 
 fmq=0; 
 wei1=0; 
 wei2=0; 
 wei3=0; 
 wei4=0; 
 ys1s(); 
 fmq=1; 
} 
/******************蜂鸣器延时*********************/ 
void fmq50ms(void)   //误差 0us 
{ 
 unsigned char a,b; 
 for (b=173;b>0;b--) 
  for (a=143;a>0;a--); 
} 
/******************按键延时*********************/ 
void aj10ms(void)   //误差 0us 
{ 
 unsigned char a,b,c; 
 for (c=1;c>0;c--) 
  for (b=38;b>0;b--) 
   for (a=130;a>0;a--); 
} 
/******************DS1302:写入操作(上升沿)*********************/ 
void write_byte(unsigned char da) 
{ 
 unsigned char i; 
 ACC=da; 
 for (i=8;i>0;i--) 
 { 
  T_IO=ACC0; 
  T_CLK=0; 
  T_CLK=1; 
  ACC=ACC>>1; 
 } 
} 
/******************DS1302:读取操作(下降沿)*****************/ 
unsigned char read_byte(void) 
{ 
 unsigned char i; 
 for (i=0;i<8;i++) 
 { 
  ACC=ACC>>1; 
  T_CLK = 1; 
  T_CLK = 0; 
  //delay(1); 
  ACC7 = T_IO; 
 } 
 return(ACC); 
} 
/******************DS1302:写入数据(先送地址,再写数据)***************************/ 
void write_1302(unsigned char addr,unsigned char da) 
{ 
 T_RST=0;             //停止工作 
 T_CLK=0; 
 T_RST=1;            //重新工作 
 write_byte(addr);          //写入地址 
 write_byte(da); 
 T_RST=0; 
 T_CLK=1; 
} 
/******************DS1302:读取数据(先送地址,再读数据)**************************/ 
unsigned char read_1302(unsigned char addr) 
{ 
 unsigned char temp; 
 T_RST=0;                                    //停止工作 
 T_CLK=0; 
 T_RST=1;                            //重新工作 
 write_byte(addr);          //写入地址 
 temp=read_byte(); 
 T_RST=0; 
 T_CLK=1;             //停止工作 
 return(temp); 
} 
/******************数码管显示延时程序1ms*********************************************/ 
void xs1ms(void) 
{ 
 unsigned char a,b,c; 
 for (c=1;c>0;c--) 
  for (b=142;b>0;b--) 
   for (a=2;a>0;a--); 
} 
/******************数码管显示程序*********************************************/ 
void xs() 
{ 
 duan=0; 
 wei4=1; 
 //第一位 
 duan=1; 
 P0=table[d]; 
 duan=0; 
 wei1=0; 
 xs1ms(); 
 //第二位 
 wei1=1; 
 duan=1; 
 P0=table[c]; 
 duan=0; 
 wei2=0; 
 xs1ms(); 
 //第三位 
 wei2=1; 
 duan=1; 
 P0=table[b]; 
 duan=0; 
 wei3=0; 
 xs1ms(); 
 //第四位 
 wei3=1; 
 duan=1; 
 P0=table[a]; 
 duan=0; 
 wei4=0; 
 xs1ms(); 
} 
/******************复位(初始化)程序*********************************************/ 
void init() 
{ 
 write_1302(0x8e,0x00);                 //WP=0 写操作 
 write_1302(0x80,0x00);                 //写秒 
 write_1302(0x82,0x00);                 //写分 
 write_1302(0x84,0x00);                 //写时 
 write_1302(0x90,0xaa);                 //设置电池参数! 
 write_1302(0x8e,0x80);                 //WP=1 写保护 
} 
/******************数据读取后处理分配*********************************************/ 
void chuli() 
{ 
 s=(read_1302(0x81))%16;     //读秒个 
 //c=(read_1302(0x81))/16;     //读秒个 
 d=(read_1302(0x83))%16;     //读分个 
 c=(read_1302(0x83))/16;     //读分个 
 b=(read_1302(0x85))%16;     //读时个 
 a=(read_1302(0x85))/16;     //读时个 
 za=read_1302(0x81); 
  
 zs=read_1302(0x83); 
} 
/******************设置显示分*********************************************/ 
void xsfen() 
{ 
 duan=0; 
 wei2=1; 
 wei4=1; 
 //第一位 
 duan=1; 
 P0=table[(m%10)]; 
 duan=0; 
 wei1=0; 
 xs1ms(); 
 //第二位 
 wei1=1; 
 duan=1; 
 P0=table[(m/10)]; 
 duan=0; 
 wei2=0; 
 xs1ms(); 
} 
/******************设置显示时*********************************************/ 
void xsshi() 
{ 
 duan=0; 
 wei4=1; 
 //第三位 
 wei2=1; 
 duan=1; 
 P0=table[(z%10)]; 
 duan=0; 
 wei3=0; 
 xs1ms(); 
 //第四位 
 wei3=1; 
 duan=1; 
 P0=table[(z/10)]; 
 duan=0; 
 wei4=0; 
 xs1ms(); 
} 
/******************主函数*********************************************/ 
void main() 
{ 
 uchar mu; 
 mu=0; 
 m=0; 
 n=0; 
 while (1) 
 { 
  if (k1==0)   //按键复位 
  { 
   aj10ms(); 
   if (k1==0) 
   { 
    fmq=1; 
    fmq=0; 
    fmq50ms(); 
    fmq=1; 
    while (!k1); 
    init(); 
   } 
  } 
  if (k2==0) 
  { 
   aj10ms(); 
   if (k2==0) 
   { 
    while (!k2); 
    mu++; 
   } 
   if (mu==3) 
   { 
    mu=0; 
   } 
  } 
  if (mu>0&&mu<3) 
  { 
   switch (mu) 
   { 
   case 1: 
    if (jia==0) 
    { 
     aj10ms(); 
     if (jia==0) 
     { 
      fmq=0; 
      fmq50ms(); 
      fmq=1; 
      while (!jia); 
      m++; 
      if (m==60) 
      { 
       m=0; 
      } 
     } 
    } 
    if (jian==0) 
    { 
     aj10ms(); 
     if (jian==0) 
     { 
      fmq=0; 
      fmq50ms(); 
      fmq=1; 
      while (!jian); 
      m--; 
      if (m<0) 
      { 
       m=59; 
      } 
     } 
    } 
    xsfen(); 
    n=m%10+m/10*16; 
    write_1302(0x8e,0x00);                 //WP=0 写操作 
    write_1302(0x82,n); 
    write_1302(0x8e,0x80);                 //WP=1 写保护 
    break; 
   case 2: 
    if (jia==0) 
    { 
     aj10ms(); 
     if (jia==0) 
     { 
      fmq=0; 
      fmq50ms(); 
      fmq=1; 
      while (!jia); 
      z++; 
      if (z==24) 
      { 
       z=0; 
      } 
     } 
    } 
    if (jian==0) 
    { 
     aj10ms(); 
     if (jian==0) 
     { 
      fmq=0; 
      fmq50ms(); 
      fmq=1; 
      while (!jian); 
      z--; 
      if (z<0) 
      { 
       z=23; 
      } 
     } 
    } 
    xsshi(); 
    x=z%10+z/10*16; 
    write_1302(0x8e,0x00);                 //WP=0 写操作 
    write_1302(0x84,x); 
    write_1302(0x8e,0x80);                 //WP=1 写保护 
    break; 
   } 
  } 
  else 
  { 
   chuli(); 
   xs(); 
   if (s%2==0) 
    led=0; 
   else 
    led=1; 
   if ((zs==0)&&(za==0)) 
   { 
    baoshi();  
    fmq50ms(); 
   } 
  } 
 } 
} |   
 
 
 
 |