查看: 1175|回复: 0
打印 上一主题 下一主题

51驱动DS1302_自己写的代码_献丑了

[复制链接]
跳转到指定楼层
沙发
发表于 2015-9-24 08:42:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我上大四了,现在在北京某公司实习,硬件工程,
代码拖拖拉拉写了两个月的时间,年前考试之前就开始写了,由于考试和找工作的事,耽搁了 ,年后,实习,发现,软件搞好很有必要,所以我以后一码一字都要自己写,以后才能成长
所以又把它拿起来了。今天终于成功了。
亲测能用。里面内嵌了串口调试程序,也就是说时间不仅通过数码管显示,还会把读取出的时分秒发到PC上去,方便调试!
测试时有一个小插曲:就是DS1302运行起来后,走时不准,不像网上说的那个走时不准还比较靠谱的,一分钟差几秒,我这个是实际走十多秒,它才走一秒。用开发板带的例程烧进去也是很不准。大概实际走五秒才走一秒
最后我把纽扣电池卸下了,重新安装回去就好了。解决问题!


献丑了,献给后来人







/*
DS1302时钟芯片数码管显示
zhanglei
2014年1月28日7:40:14







*/
#include <reg52.h>
#include <intrins.h>

#define  SECR  0x81 //对秒寄存器进行读操作
#define  SECW  0x80 //对秒寄存器进行写操作
#define  MINW  0x82 //对分寄存器进行写操作
#define  MINR  0x83 //对分寄存器进行读操作
#define  HOUW  0x84 //对小时寄存器进行写操作
#define  HOUR  0x85 //对小时寄存器进行读操作



unsigned char code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
//数码管显示0~9的段码表
unsigned char code sheet[1]={0x00};
unsigned char h,m,s;
sbit SCLK=P1^0;
sbit IO=P1^1;
sbit RST=P1^2;
sbit ACC7=ACC^7;
//显示延时函数
void delayms(unsigned char i)
{
    unsigned char j;
    for(;i>0;i--)
        {
          for(j=0;j<200;j++);
        }




}
//函数功能:通过串口中断测试读取出来的时,分,秒
//入口参数:读取出来的数据m,h,s
//返回值:无
void Com_Init()
{
   SCON= 0x40;                //串口方式1
   PCON=0;                     //SMOD=0
   REN=1;                     //允许接收
   TMOD= 0x20;                //定时器1定时方式2
   TH1= 0xfd;                //11.0592M 9600波特率
   TL1= 0xfd;
   TR1= 1;                  //启动定时器   
}


//函数功能:SPI总线字节写函数
//入口参数:寄存器地址addr,写入寄存器的数据dat
//返回值:无

void writedata(unsigned char addr,unsigned char dat)
{
   unsigned char i;
   unsigned char j;
     RST=0;
         SCLK=0;
         RST=1;
         for(i=0;i<8;i++)
         {
                SCLK=0;
        IO=(bit)(addr&0x01);
                addr>>=1;
                SCLK=1;
                _nop_();
                _nop_();
          }
          for(j=0;j<8;j++)
          {
            SCLK=0;
                IO=(bit)(dat&0x01);
                dat>>=1;
                SCLK=1;
                _nop_();
                _nop_();
          }
          RST=0;
          SCLK=1;
}

//SPI总线读取数据函数
//入口参数:addr 存储数据的地址
//返回值:返回SPI总线上的数据

unsigned char readdata(unsigned char addr)
{
   unsigned char i;
   unsigned char date;
   RST=0;
   SCLK=0;
   IO=0;
   RST=1;
         for(i=0;i<8;i++)
         {
            SCLK=0;
                IO=(bit)(addr&0x01);
                addr>>=1;
                SCLK=1;
                _nop_();
                _nop_();
          }

   for(i=0;i<8;i++)
   {
    ACC7=IO;//数据是从低位开始读取的
    SCLK=1;        
        SCLK=0;
    ACC>>=1;
   }
   SCLK=1;
   RST=0;
   date=ACC;
   return date;
}



//函数功能:读取小时,分,秒数据并显示
//入口参数:无
//返回值:无
void ledshow()
{

   h=readdata(HOUR);//读取小时  
   m=readdata(MINR);//读取分钟
   s=readdata(SECR);//读取秒
   //打印时,分,秒
   SBUF=h;
   while(TI==0);
   TI=0;
   SBUF=m;
   while(TI==0);
   TI=0;
   SBUF=s;
   while(TI==0);
   TI=0;
   SBUF=sheet[0];
   while(TI==0);
   TI=0;


/***

*******zhanglei  test ledshow
//   h=0x20;
//   m=0x24;
//   s=0x22;
******/
   P2=0xfd;
   P0=tab[(h&0x0f)];
   delayms(5);
   P2=0xfe;
   P0=tab[((h>>4)&0x07)];
   delayms(5);
   P2=0xf7;
   P0=tab[(m&0x0f)];
   delayms(5);
   P2=0xfb;
   P0=tab[((m>>4)&0x07)];
   delayms(5);
   P2=0xdf;
   P0=tab[(s&0x0f)];
   delayms(5);
   P2=0xef;
   P0=tab[((s>>4)&0x07)];
   delayms(5);

}



void main(void)
{
     Com_Init();
         writedata(0x8e,0x00);//对0x8e寄存器操作,去掉写保护,对最高位WP写0        ·
         //对DS1302写入时间 20:24:22
         writedata(HOUW,0x20);//设置小时,模式24h制,
         writedata(MINW,0x58);//设置分钟
         writedata(SECW,0x22);//设置秒并且使DS1302开始走时
         writedata(0x8e,0x80);//进行写保护
         while(1)
         {
           delayms(3);
           ledshow();
         }

}






复制代码转载

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入因仑

本版积分规则

快速回复 返回顶部 返回列表