51单片机ds1302时钟显示
时间:10-02
整理:3721RD
点击:
ds1302时钟模块,并在数码管上显示时,分,秒,所用单片机是stc89c52。但程序貌似有点问题,显示不了,麻烦各位帮我看下程序哪里错了,不胜感激!
#include <reg52.h>
#include <intrins.h>
#include "ds1302.h"
unsigned char code table[]={
0x3f , 0x06 , 0x5b , 0x4f ,
0x66 , 0x6d ,0x7d , 0x07 ,
0x7f , 0x6f , 0x77 , 0x7c ,
0x39 , 0x5e , 0x79 , 0x71 ,0xbf
};
void main()
{
uchar hour,minute,second;
write(0x8e,0x00);//开
write(0x80,0x00);//写秒钟值
write(0x82,0x00);//写分钟值
write(0x84,0x00);//写小时值
write(0x8e,0x80);//关
while(1)
{
hour=read(0x85);
minute=read(0x83);
second=read(0x81);
display(table[hour],table[minute],table[second]);
}
}
ds1302.h头文件的内容如下:
#ifndef DS1302#define DS1302
#define uchar unsigned char#define uint unsigned int
sbit sclk= P2^1; //实时时钟时钟线引脚 sbit io = P2^0; //实时时钟数据线引脚 sbit rst = P2^5; //实时时钟复位线引脚 sbit we=P2^7;sbit du=P2^6;
delay(uchar i){ uchar j; for(i;i>0;i--) for(j=100;j>0;j--);}
//*********发送一个字节(8位)**********void send(uchar dt){ uchar i; for(i=0;i<8;i++) { sclk=0; io=dt&0x01;//取第一位 dt>>=1;//左移一位 sclk=1;//上升沿有效 }}
//*******写地址、数据*********void write(uchar addr,uchar dat){ rst=0;sclk=0;rst=1; send(addr);//发送地址 send(dat);//发送数据 rst=0;}
//*****读取8位*******uchar receive(){ uchar i; uchar dat=0; //循环8次 for(i=0;i<8;i++) { sclk=1; dat>>=1; sclk=0;//下降沿读取 io=1;//读引脚前置一 if(io==1)dat|=0x80;
}//此时dat为16进制比如说0x10 dat=(dat/16)*10+dat%16; //转化为10进制,现在是10; return(dat);//返回值
}
//******读时钟*******uchar read(uchar addr){ uchar dat=0; rst=0;sclk=0;rst=1; send(addr); //发送地址 dat=receive(); //接收 rst=0; return(dat);
}
void display(uchar hour,uchar minute,uchar second){ we=1; P0=0xfe; we=0; P0=0; du=1; P0=hour; du=0; delay(100);
we=1; P0=0xfd; we=0; P0=0; du=1; P0=minute; du=0; delay(100);
we=1; P0=0xfb; we=0; P0=0; du=1; P0=second; du=0; delay(100); }
#endif
#include <reg52.h>
#include <intrins.h>
#include "ds1302.h"
unsigned char code table[]={
0x3f , 0x06 , 0x5b , 0x4f ,
0x66 , 0x6d ,0x7d , 0x07 ,
0x7f , 0x6f , 0x77 , 0x7c ,
0x39 , 0x5e , 0x79 , 0x71 ,0xbf
};
void main()
{
uchar hour,minute,second;
write(0x8e,0x00);//开
write(0x80,0x00);//写秒钟值
write(0x82,0x00);//写分钟值
write(0x84,0x00);//写小时值
write(0x8e,0x80);//关
while(1)
{
hour=read(0x85);
minute=read(0x83);
second=read(0x81);
display(table[hour],table[minute],table[second]);
}
}
ds1302.h头文件的内容如下:
#ifndef DS1302#define DS1302
#define uchar unsigned char#define uint unsigned int
sbit sclk= P2^1; //实时时钟时钟线引脚 sbit io = P2^0; //实时时钟数据线引脚 sbit rst = P2^5; //实时时钟复位线引脚 sbit we=P2^7;sbit du=P2^6;
delay(uchar i){ uchar j; for(i;i>0;i--) for(j=100;j>0;j--);}
//*********发送一个字节(8位)**********void send(uchar dt){ uchar i; for(i=0;i<8;i++) { sclk=0; io=dt&0x01;//取第一位 dt>>=1;//左移一位 sclk=1;//上升沿有效 }}
//*******写地址、数据*********void write(uchar addr,uchar dat){ rst=0;sclk=0;rst=1; send(addr);//发送地址 send(dat);//发送数据 rst=0;}
//*****读取8位*******uchar receive(){ uchar i; uchar dat=0; //循环8次 for(i=0;i<8;i++) { sclk=1; dat>>=1; sclk=0;//下降沿读取 io=1;//读引脚前置一 if(io==1)dat|=0x80;
}//此时dat为16进制比如说0x10 dat=(dat/16)*10+dat%16; //转化为10进制,现在是10; return(dat);//返回值
}
//******读时钟*******uchar read(uchar addr){ uchar dat=0; rst=0;sclk=0;rst=1; send(addr); //发送地址 dat=receive(); //接收 rst=0; return(dat);
}
void display(uchar hour,uchar minute,uchar second){ we=1; P0=0xfe; we=0; P0=0; du=1; P0=hour; du=0; delay(100);
we=1; P0=0xfd; we=0; P0=0; du=1; P0=minute; du=0; delay(100);
we=1; P0=0xfb; we=0; P0=0; du=1; P0=second; du=0; delay(100); }
#endif
不错的资料,值得收藏
不错的资料,值得收藏