ds1302显示时间.docVIP

  • 5
  • 0
  • 约2.39千字
  • 约 4页
  • 2018-03-07 发布于河南
  • 举报
ds1302显示时间

//在 开发板6个数码管显示 时间,遗憾的是没有调整功能,以后完善 #includereg52.h #includeintrins.h #includestdio.h sbit clk=P3^5; //DS1302的控制端 sbit ce=P1^7; sbit dat=P3^4; unsigned char ledbuf[6]; unsigned char code ledmap[]={0xc0,0xf9,0xa4,0xb0, 0x99,0x92,0x82,0xf8, 0x80,0x90,0x88,0x83, //数码共阳极编码 0xc6,0xa1,0x86,0x8e}; unsigned char timebuf[7]={0x00,0x45,0x14,0x15,0x04,0x00,0x12}; // DS1302存放区 void delay(unsigned int z) { unsigned char i; while(z--) //显示要用的延时程序 for(i=110;i0;i--); } void writebyte(unsigned char date) { unsigned char j; //1302写子程序 for(j=0;j8;j++) { clk=0; dat=date0x01 ; date=1; clk=1; } } unsigned char readbyte() { unsigned char date=0,j; //1302读子程序,时序很严格,注意 for(j=0;j8;j++) { if(dat) date|=0x80; clk=0; date=1; _nop_(); _nop_(); _nop_(); clk=1; } ce=0; _nop_(); //以下为DS1302复位的稳定时间 _nop_(); _nop_(); clk=0; _nop_(); _nop_(); _nop_(); _nop_(); clk=1; _nop_(); _nop_(); dat=0; _nop_(); _nop_(); dat=1; _nop_(); _nop_(); return date; } void writedat(unsigned char addr,unsigned char date) { ce=0; _nop_(); clk=0; _nop_(); ce=1; _nop_(); //1302写某个地址数据子程序 writebyte(addr); writebyte(date); ce=0; } unsigned char readdat(unsigned char addr) { unsigned char x; ce=0; _nop_(); _nop_(); clk=0; _nop_();_nop_(); ce=1; _nop_();_nop_(); //1302读某个地址数据子程序 writebyte(addr); x=readbyte(); return x; } void setds1302() { unsigned char x; writedat(0x8e,0x00); //写保护取消 //设置初始时间子程序,注意开始时设置,以后取消 for(x=0;x7;x++) writedat(0x80+2*x,timebuf[x]); //把timebuf数组的值写到秒分时日月周年 writedat(0x8e,0x80); //写保护有效 } void getds1302() { unsigned char i; //获取时间子程序 for(i=0;i7;i++) { timebuf[i]=readdat(0x81+2*i); //把时间值写进时间缓冲区timebuf[0]~timebuf[6] delay(1); } } void disp() { unsigned char pos,x; pos=0x08; //位选为1 //数码管显示子程序 for(x=0;x6;x++) { P1=0x00; P0=ledbuf[x]; P1=pos; delay(2); pos++; } P1=0x00; } void main() { //主程序 setds1302(); //设置时间初

文档评论(0)

1亿VIP精品文档

相关文档