打印

关于DS1302,怎么实现不了按键加数的功能,其他能正常运行

[复制链接]
2374|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
张永标张标|  楼主 | 2012-9-16 12:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
TE, ck, ST, RS, AD
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
unsigned char code duan[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};
unsigned char code wei[]={0x1,0x2,0x4,0x8,0x10,0x20,0x40,0x80};
unsigned char temp[8]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
uchar timedata[7]={10,6,4,17,11,58,30}; //年周月日时分秒
uchar write_add[7]={0x8c,0x8a,0x88,0x86,0x84,0x82,0x80};//写时间地址
uchar read_add[7]={0x8d,0x8b,0x89,0x87,0x85,0x83,0x81};//读时间地址
sbit P20=P2^0;
sbit P21=P2^1;
sbit P35=P3^5;
sbit sck=P0^0;
sbit io=P0^1;
sbit rst=P0^2;
sbit P30=P3^0;
sbit P32=P3^2;
uchar num=0;
uchar flag=0;
void delay(int z)
{
  int x,y;
  for(x=z;x>0;x--)
  for(y=110;y>0;y--);
}
void write_byte(uchar dat)//写一个字节
{
  uchar i;
  for(i=0;i<8;i++)
  {
     sck=0;
     io=dat&0x01;
     dat=dat>>1;
     sck=1;
  }
}
void write(uchar add,uchar date)//写一个地址,写一个数据
{
rst=0;
_nop_();
sck=0;
_nop_();                 
rst=1;
//_nop_();
write_byte(add);
write_byte(date);
rst=0;
_nop_();
sck=0;
_nop_();
sck=1;
io=1;
}
uchar read(uchar a)// 写入一个地址,读出一个数据
{
  uchar i,value;
  rst=0;
_nop_();
sck=0;
_nop_();                 
rst=1;
//_npo_();
write_byte(a);
for(i=0;i<8;i++)
{
        value=value>>1;
    sck=0;
   //    value=value>>1;
    if(io)
    {
    value=value|0x80;
    }
    sck=1;     
}
rst=0;
_nop_();
sck=0;
_nop_();
sck=1;
io=1;
return value;
}
void settime()//设定时间
{               
  uchar i,j;
  for(i=0;i<7;i++)     //bcd转化
  {
   j=timedata[i]/10;
   timedata[i]=timedata[i]%10;
   timedata[i]=timedata[i]+j*16;
  }
   write(0x8e,0x00); //去除写保护
   for(i=0;i<7;i++)
   {
     write(write_add[i],timedata[i]);
   }
    write(0x8e,0x80); //写保护
}
void readtime()//读出时间
{
   uchar i;
  for(i=0;i<7;i++)
  {
   timedata[i]=read(read_add[i]);
  }
}
void time_pros(void)//BCD处理,两个显示内容
{
  if(num==1)
  {
temp[0]=duan[timedata[6]/16];
temp[1]=duan[timedata[6]%16];
temp[2]=duan[10];
temp[3]=duan[timedata[2]/16];
temp[4]=duan[timedata[2]%16];
temp[5]=duan[10];
temp[6]=duan[timedata[3]/16];
temp[7]=duan[timedata[3]%16];
  }
  else
  {
temp[0]=duan[timedata[4]/16];
temp[1]=duan[timedata[4]%16];
temp[2]=duan[10];
temp[3]=duan[timedata[5]/16];
temp[4]=duan[timedata[5]%16];
temp[5]=duan[10];
temp[6]=duan[timedata[6]/16];
temp[7]=duan[timedata[6]%16];
}
}
void dis() //数码管显示
{
uchar i;

  for(i=0;i<8;i++)
   {
      P1=0xff;
     P20=1;
     P20=0;
    P1=wei[i];
     P21=1;
     P21=0;
     P1=temp[i];
    P20=1;
    P20=0;
    delay(3);
   }
}
void key()//按键切换内容
{
// uchar num;
  if(!P30)
  {
   delay(10);
   if(!P30)
   {
     while(!P30);
     num++;
     if(num==2)
     {
     num=0;
     }
   }
  }
}     
void key_key()//按键加数
{
  if(!P32)
  {
  delay(10);
  if(!P32)
  {
    while(!P32);
    timedata[6]++;
    flag=1;
  }
  }
}
void main()
{
  settime();
  P35=0;//点阵熄灭
  while(1)
  { key_key();
   if(flag)
   {  flag=0;
     settime();
   }
   readtime();
   key();
   
   time_pros();
   //display(0,8);
   dis();
  }
}

相关帖子

沙发
wjzx111056| | 2012-9-16 20:29 | 只看该作者
LZ:
     对于本人DS1302,在调试中遇到的问题的总结,特作如下说明:     DS1302 与微处理器进行数据交换时,首先由微处理器向电路发送命令字节,命令字节最高位MSB(D7)必须为逻辑1,如果D7=0,则禁止写DS1302,即写保护;D6=0,指定时钟数据,D6=1,指定RAM数据;D5~D1指定输入或输出的特定寄存器;最低位LSB(D0)为逻辑0,指定写操作(输入), D0=1,指定读操作(输出)。     在DS1302的时钟日历或RAM进行数据传送时,DS1302必须首先发送命令字节。若进行单字节传送,8位命令字节传送结束之后,在下2个SCLK周期的上升沿输入数据字节,或在下8个SCLK周期的下降沿输出数据字节。     DS1302与RAM相关的寄存器分为两类:一类是单个RAM单元,共31个,每个单元组态为一个8位的字节,其命令控制字为C0H~FDH,其中奇数为读操作,偶数为写操作;再一类为突发方式下的RAM寄存器,在此方式下可一次性读、写所有的RAM的31个字节。     要特别说明的是备用电源B1,可以用电池或者超级电容器(0.1F以上)。虽然DS1302在主电源掉电后的耗电很小,但是,如果要长时间保证时钟正常,最好选用小型充电电池。可以用老式电脑主板上的3.6V充电电池。如果断电时间较短(几小时或几天)时,就可以用漏电较小的普通电解电容器代替。100 μF就可以保证1小时的正常走时。DS1302在第一次加电后,必须进行初始化操作。初始化后就可以按正常方法调整时间。

使用特权

评论回复
板凳
happy啦啦啦| | 2012-9-16 21:04 | 只看该作者
楼主的程序也太长了吧,这个需要慢慢调试才能知道的啊。设置几个断点,用串口调试就会出来的

使用特权

评论回复
地板
springspring| | 2012-9-16 21:16 | 只看该作者
没看懂,这么长的

使用特权

评论回复
5
figo20042005| | 2012-9-18 18:03 | 只看该作者
仿真下吧,看有没有增长

使用特权

评论回复
6
张永标张标|  楼主 | 2012-9-18 20:32 | 只看该作者
need to study a

使用特权

评论回复
7
张永标张标|  楼主 | 2012-9-18 20:33 | 只看该作者
谁有这方面模块化的程序呢?

使用特权

评论回复
8
happy啦啦啦| | 2012-9-18 20:38 | 只看该作者
程序跑飞了啊

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

19

主题

88

帖子

0

粉丝