51单片机对DS1302(实时时钟芯片)的仿真

Posted perseverance52

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了51单片机对DS1302(实时时钟芯片)的仿真相关的知识,希望对你有一定的参考价值。

51单片机对DS1302(实时时钟芯片)的仿真

  • 仿真效果
    在这里插入图片描述

  • 源代码

#include <reg51.h>
#include <intrins.h>  //因为要调用nop函数,所以添加了这个库NOP,延时作用
sbit RS=P3^0;    //NOP指令本身的含义是空操作,即此时CPU什么也不做,仅仅是等待,直到下一个机器周期的到来。
sbit RW=P3^1;
sbit E=P3^2;
sbit T_RST=P3^3;
sbit T_CLK=P3^4;
sbit T_IO=P3^5;
unsigned char datechar[]={"DATE:"};
unsigned char timechar[]={"TIME:"};
unsigned char datebuffer[10]={0x32,0x30,0,0,0x2d,0,0,0x2d,0,0};//0x32表示2,0x30表示0,0x2d表示—
unsigned char timebuffer[8]={0,0,0x3a,0,0,0x3a,0,0};//0x3a表示:
unsigned char weekbuffer={0x30};

void  WriteB(unsigned char  dat)//单字节写
{ 
   unsigned char  i;
   for(i=8; i>0; i--)
  {
        T_IO=dat&0x01;
        T_CLK = 1;
        T_CLK = 0;
        dat = dat >> 1; 
   } 
}

unsigned char  ReadB(void) //单字节读
{ 
	unsigned char i,readdat=0;
	for(i=8; i>0; i--)
	{
		readdat=readdat>>1;
		if(T_IO)
		{
			readdat|=0x80;
		}
		T_CLK = 1;
		T_CLK = 0;            
	} 
	return(readdat); 
}

void  W1302(unsigned char address,unsigned char dat)
{
	T_RST = 0;
	T_CLK = 0;
	_nop_();
	_nop_();
	T_RST = 1;
	_nop_();
	_nop_();
	WriteB(address);         
	WriteB(dat);           
	T_CLK = 1;
	T_RST =0;
} 

unsigned char  R1302(unsigned char  address)//上面的是DS1302的函数
{
	unsigned char dat=0;
	T_RST = 0;
	T_CLK = 0;
	T_RST = 1;
	WriteB(address);           
	dat = ReadB();           
	T_CLK = 1;
	T_RST =0;
	return(dat);
}

void delay(unsigned int n)//延时函数
{
  unsigned i=0,j=0;
	for(i=0;i<n;i++)
	{
	  for(j=0;j<120;j++);
	}
}
void writedat(unsigned char dat)//写数据函数lcd的下面这些函数
{
  RS=1;  //  RS:数据/命令选择端
	RW=0;  //  R/W :读/写选择端 
	E=0;   //  使能端:下降沿有效 
	P2=dat;
	delay(5);
	E=1;
	E=0;
}

void writecom(unsigned char com)//写命令函数 
{
  RS=0;  //  RS:数据/命令选择端 
	RW=0;  //  R/W :读/写选择端  
	E=0;   //使能端:下降沿有效 
	P2=com;
	delay(5);
	E=1;
	E=0; 
}
void initlcd()//初始化LCD1602
{
  writecom(0x38);  //0x38;设置16×2显示
	writecom(0x0c);  //0x0C:设置开显示,不显示光标
	writecom(0x06);  //0x06:写一个字符后地址指针加1
	writecom(0x01);  //0x01:显示清0,数据指针清0
}


void display()//显示函数
{
	int i=0,temp=0;
	temp=R1302(0x8d);  //读年
	datebuffer[2]=0x30+temp/16;
	datebuffer[3]=0x30+temp%16;
	
	temp=R1302(0x8b);  //读星期
	weekbuffer=0x30+temp;
	
	temp=R1302(0x89);  //读月
	datebuffer[5]=0x30+temp/16;
	datebuffer[6]=0x30+temp%16;
	
	temp=R1302(0x87);  //读日
	datebuffer[8]=0x30+temp/16;
	datebuffer[9]=0x30+temp%16;
	
	temp=R1302(0x85);  //读时
  temp=temp&0x7f;
	timebuffer[0]=0x30+temp/16;
	timebuffer[1]=0x30+temp%16;
	
	temp=R1302(0x83);  //读分
	timebuffer[3]=0x30+temp/16;
	timebuffer[4]=0x30+temp%16;
	
	temp=R1302(0x81);  //读秒
	temp=temp&0x7f;
	timebuffer[6]=0x30+temp/16;
	timebuffer[7]=0x30+temp%16;
	
	writecom(0x80);  //0x80:LCD第一行的起始地址
	for(i=0;i<5;i++)
	{
	  writedat(datechar[i]);
	}
	writecom(0xc0);
	for(i=0;i<5;i++)
	{
	  writedat(timechar[i]);
	}
	
	writecom(0x86);//显示日历
	for(i=0;i<10;i++)
	{
	  writedat(datebuffer[i]);
	}
	writecom(0xc6);//显示时间
	
	for(i=0;i<8;i++)
	{
	  writedat(timebuffer[i]);
	}
	writedat(' ');
	writedat(weekbuffer);//显示星期
}


void main()
{
	initlcd();
	W1302(0x8e,0);   //打开写保护
	W1302(0x8c,0x21);//打开年,BCD码
	W1302(0x8a,0x04);//写入星期
	W1302(0x88,0x07);//写入月
	W1302(0x86,0x15);//写入日
	W1302(0x84,0x22);//写入时
	W1302(0x82,0x42);//写入分
	W1302(0x80,0x30);//写入秒
	W1302(0x8e,0x80);//关闭写保护
	while(1)
	{
	  display();
	}
}

以上是关于51单片机对DS1302(实时时钟芯片)的仿真的主要内容,如果未能解决你的问题,请参考以下文章

51单片机 1602液晶显示的DS1302实时时钟+Proteus仿真

51单片机 1602液晶显示的DS1302实时时钟+Proteus仿真

4.7 51单片机-DS1302 实时时钟芯片

4.7 51单片机-DS1302 实时时钟芯片

51单片机DS1302+ DS18b20+LCD1602时钟仿真

基于51单片机+DS1302时钟模块+LCD1602显示