C51-DS1302芯片显示时间

一,DS1302时钟

   DS1302时钟与C51连接通过三个引脚控制数据,分别为CE(片选),SCLK时钟信号线以及I\O数据的输入输出线。

  控制寄存器的格式如下:第六位一般设置低电平,通过1-5位控制是哪个寄存器,比如00000秒寄存器,00001分寄存器,第0位控制读写操作。

  让时间在数码管显示的时候,要先传输进去现在的时间,然后这个芯片在外部接有晶振下,会自己计算时间,这个实验关键是在于①控制单字节的读写,即每个字节传输时候,前期CE和CLK电平设置,传输中,读是下降沿触发,写是上升沿触发,最后后期对这俩信号高低电平的配置。②时间的输入以及读取,关键是其格式怎么在数码管显示,它这个芯片采用的是BCD码形式,因此比如a=25(BCD码),应该在数码管上显示,十位=a/16,个位=a%16,再转化为数码管的显示形式.也可以直接计算这个字节前4位和后四位的值,转化为数码管的格式直接显示,这种方法比较麻烦。

二,软件实现

  读写操作:

#include "ds1302.h"
void ds1302_write_byte(u8 adress,u8 dat)
{
	int i=0;
	ds1302_CE=0;
	_nop_();
	ds1302_sclk=0;
	_nop_();
	ds1302_CE=1;
	_nop_();
	for(i=0;i<8;i++)//写地址
	{
		ds1302_I0=adress&0x01;
		adress>>=1;
		ds1302_sclk=1;
	  _nop_();	
		ds1302_sclk=0;
	  _nop_();
	}
	for(i=0;i<8;i++)//写数据
	{
		ds1302_I0=dat&0x01;
		dat>>=1;
		ds1302_sclk=1;
	  _nop_();	
		ds1302_sclk=0;
	  _nop_();
	}
	ds1302_CE=0;
	_nop_();
}
u8 de1302_read_byte(u8 adress)
{
	u8 de1302_read_byte_result=0,temp=0;
	int i=0;
	ds1302_CE=0;
	_nop_();
	ds1302_sclk=0;
	_nop_();
	ds1302_CE=1;
	_nop_();
	for(i=0;i<8;i++)//要读取的地址
	{
		ds1302_I0=adress&0x01;
		adress>>=1;
		ds1302_sclk=1;
	  _nop_();	
		ds1302_sclk=0;
	  _nop_();
	}
	for(i=0;i<8;i++)//读取数据
	{
		temp=ds1302_I0;
		de1302_read_byte_result=(temp<<7)|(de1302_read_byte_result>>1);
		ds1302_sclk=1;
	  _nop_();	
		ds1302_sclk=0;
	  _nop_();
	}
	ds1302_CE=0;
	_nop_();
	ds1302_sclk=1;
	 _nop_();
	ds1302_I0=0;
	 _nop_();	
	ds1302_I0=1;
	 _nop_();	
	return de1302_read_byte_result;
	
}
void de1302_write_init(void)//时间的初始化
{
	ds1302_write_byte(0x8E,0x00);//打开写寄存器
	ds1302_write_byte(0x80,0x00);//秒寄存器
	ds1302_write_byte(0x82,0x00);//分寄存器
	ds1302_write_byte(0x84,0x00);//小时寄存器
	ds1302_write_byte(0x8E,0x80);//关闭写寄存器,变为不可读
}

主函数:

void main(void)
{
	u8 result[8];
	u8 result_change=0;
	de1302_write_init();//ʱ¼ä³õʼ»¯Ð´Èë
	while(1)
	{
		result_change=de1302_read_byte(0x81);//Ãë¼Ä´æÆ÷
		result[6]=xianshi_shuzhu[result_change/16];
		result[7]=xianshi_shuzhu[result_change%16];
		result[2]=0x40;
		result_change=de1302_read_byte(0x83);//·Ö¼Ä´æÆ÷
		result[3]=xianshi_shuzhu[result_change/16];
		result[4]=xianshi_shuzhu[result_change%16];
		result[5]=0x40;
		result_change=de1302_read_byte(0x85);//Сʱ¼Ä´æÆ÷
		result[0]=xianshi_shuzhu[result_change/16];
		result[1]=xianshi_shuzhu[result_change%16];
		smg_play(result);
	}
}

  总结:对比这三个实验IIC实现EPROM的读写,温度传感器,时钟显示,原理基本上都是通过时钟线,到对应的设备内部的寄存器中,来进行数据的读写操作,每次传输一个字节传输,温度传感器有一些不同,它不通过时钟线控制,直接用数据传输线,初始化,响应,读0读1,写0写1按照特定的格式进行判断,这样相对也比较麻烦,要控制高低电平的响应时间。三个实验都是进行数据的传输,传输的格式各有不同,针对不同格式进行转化,能够表达出来。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值