/*程序效果:通过DS1302芯片显示时间,本程序主要是要理解 DS1302芯片的协议,这样便于编写程序。 当然时间显示也可以用单片机的定时器来控制,比起延时 子函数来说较精准。*/#include<reg52.h> //头文件#include<intrins.h>#define uchar unsigned char //宏定义sbit scl2=P1^3; //位声明sbit sda2=P1^4;sbit rst2=P1^5;uchar tmpdata[8]={0x00,0x3b, //显示的时间值0x17,0x1f,0x0c,0x08,0x09,0x00};uchar tmpdisplay[8];code uchar write_rtc_address[7]={ //写入时间的地址0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};code uchar read_rtc_address[7]={ //读取时间的地址0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};code unsigned char table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f, //共阴数码管 0-90x40,0x00}; // '-' '熄灭‘表void delay();void display(uchar *lp,uchar lc); //显示子函数void write_ds1302(uchar address,uchar dat); //写子函数uchar read_ds1302(uchar address);//读子函数void read_rtc();void set_rtc();void main(){ rst2=0; set_rtc(); while(1) { read_rtc(); switch(tmpdata[0]/5) // 设计每隔5秒交替显示年月日 时分秒 { case 0: //显示时分秒 case 2: case 4: case 6: case 8: case 10: tmpdisplay[0]=tmpdata[2]/16; tmpdisplay[1]=tmpdata[2]&0x0f; tmpdisplay[2]=10; //在时与分之间加一个“-” tmpdisplay[3]=tmpdata[1]/16; tmpdisplay[4]=tmpdata[1]&0x0f; tmpdisplay[5]=10; tmpdisplay[6]=tmpdata[0]/16; tmpdisplay[7]=tmpdata[0]&0x0f; break; case 1: //显示年月日 case 3: case 5: case 7: case 9: case 11: tmpdisplay[0]=tmpdata[6]/16; tmpdisplay[1]=tmpdata[6]&0x0f; tmpdisplay[2]=10; tmpdisplay[3]=tmpdata[4]/16; tmpdisplay[4]=tmpdata[4]&0x0f; tmpdisplay[5]=10; tmpdisplay[6]=tmpdata[3]/16; tmpdisplay[7]=tmpdata[3]&0x0f; break; default : break; } display(tmpdisplay,8); }}void display(uchar *lp,uchar lc) //lp为数组的首地址,lc为显示的个数{ uchar i; //定义局部变量 P2=0; //清零端口,准备显示 P1=P1&0xf8; //不影响P1口的高5位,低三位用于控制哪个数码管亮 for(i=0;i<lc;i++) //循环显示 { P2=table[lp[i]];//查表获得相应的数值 delay(); //延时,使数码管更加亮 P2=0; //清零端口,准备显示下一位 P1++; //点亮下一个数码管 }}void delay() //延时子函数{ uchar i; //i的值的大小可以决定数码管的亮暗的程度 for(i=20;i>0;i--); //但i的值要适中,并不是越大越好}void write_ds1302_byte(uchar temp) //写子函数{ uchar i; for(i=0;i<8;i++) //循环8次,写入数据 { scl2=0; sda2=temp&0x01; //每次传输低字节 temp>>=1; //右移一位 scl2=1; }}void write_ds1302(uchar address,uchar dat) //根据ds1302协议编写的程序{ rst2=0; _nop_(); scl2=0; _nop_(); rst2=1; _nop_(); //从此后开始发送数据 write_ds1302_byte(address);//发送地址 write_ds1302_byte(dat); //发送数据 rst2=0; //停止发送数据}uchar read_ds1302(uchar address) //根据ds1302编写的程序{ uchar i,temp=0; rst2=0; _nop_(); scl2=0; _nop_(); rst2=1; _nop_(); write_ds1302_byte(address); for(i=0;i<8;i++) //循环8次,读取数据 { scl2=1; _nop_(); if(sda2) temp|=0x80;//每次传输低字节 scl2=0; temp>>=1; // 右移一位 } rst2=0; _nop_(); scl2=1; sda2=0; return temp; //返回 temp值}void read_rtc() //读取日历{ uchar i,*p; p=read_rtc_address; //传递地址 for(i=0;i<7;i++) //分七次读取年月日 时分秒 星期 { tmpdata[i]=read_ds1302(*p); p++; }}void set_rtc() //设定日历{ uchar i,*p,tmp; for(i=0;i<7;i++) { tmp=tmpdata[i]/10; tmpdata[i]=tmpdata[i]%10; tmpdata[i]=tmpdata[i]+tmp*16; } write_ds1302(0x8e,0x00); p=write_rtc_address; //传递地址 for(i=0;i<7;i++) //分七次写入年月日 时分秒星期 { write_ds1302(*p,tmpdata[i]); p++; } write_ds1302(0x8e,0x80);}如果程序无法编译,请删除所有前导空白.
导读:目前正在解读《DS1302时钟芯片显示时间C51程序》的相关信息,《DS1302时钟芯片显示时间C51程序》是由用户自行发布的知识型内容!下面请观看由(电工技术网 - www.9ddd.net)用户发布《DS1302时钟芯片显示时间C51程序》的详细说明。
简介:在这里和大家分享一个DS1302时钟芯片显示时间C51的程序。
提醒:《DS1302时钟芯片显示时间C51程序》最后刷新时间 2024-03-14 01:00:02,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《DS1302时钟芯片显示时间C51程序》该内容的真实性请自行鉴别。