DS1302时钟芯片显示时间C51程序

来源:本站
导读:目前正在解读《DS1302时钟芯片显示时间C51程序》的相关信息,《DS1302时钟芯片显示时间C51程序》是由用户自行发布的知识型内容!下面请观看由(电工技术网 - www.9ddd.net)用户发布《DS1302时钟芯片显示时间C51程序》的详细说明。
简介:在这里和大家分享一个DS1302时钟芯片显示时间C51的程序。

/*程序效果:通过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程序》最后刷新时间 2024-03-14 01:00:02,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《DS1302时钟芯片显示时间C51程序》该内容的真实性请自行鉴别。