51单片机电子时钟(C语言)

硬件仿真

 全部硬件电路分为四大部分:

  1. 控制模块51单片机;
  2. 显示模块LCD1602,由P0口控制;
  3. 计时模块DS1302,由P1口控制;
  4. 输入按键,由P3口控制。

        实际设计硬件电路时应考虑到51单片机的电源、复位电路以及外接晶振,时钟芯片DS1302的备用电源等。

ff7b7f49aede467aa811dc17083f6ac8.png

51单片机动态功能

  1. 从1302的寄存器中读取数据(8421BCD码),转换后(2进制)送至1602显示
  2. 判断是否有按键输入,根据按键输入将数据写入1302寄存器

LCD1602

  1. 设置显示模式
  2. 接收数据,根据命令字显示

DS1302

  1. 自动计时
  2. 发送/接收数据

 程序源码

#include<reg51.h>
#include<intrins.h>

//时钟芯片1302寄存器读写命令字
#define SEC_write 0x80
#define SEC_read 0x81
#define MIN_write 0x82
#define MIN_read 0x83
#define HR_write 0x84
#define HR_read 0x85
#define DAY_write 0x86
#define DAY_read 0x87
#define MONTH_write 0x88
#define MONTH_read 0x89
#define YEAR_write 0x8c
#define YEAR_read 0x8d

//时钟芯片1302数据传输接口
sbit SCLK=P2^0;
sbit DATA=P2^1;
sbit RST=P2^2;

//向1302写一个字节数据
void Write1302(unsigned char dat)
{
	unsigned char i;
	SCLK=0;
	_nop_();
	for(i=0;i<8;i++)
	{
		DATA=dat&0x01;
		_nop_();
		SCLK=1;
		_nop_();
		SCLK=0;
		dat>>=1;
	}
}

//根据命令字,向1302写一个字节数据
void WriteSet1302(unsigned char Cmd,unsigned char dat)
{
	RST=0;
	SCLK=0;
	RST=1;
	_nop_();
	Write1302(Cmd);
	Write1302(dat);
	SCLK=1;
	RST=0;
}

//从1302读一个字节数据
unsigned char Read1302(void)
{
	unsigned char i,dat;
	_nop_();
	for(i=0;i<8;i++)
	{
		dat>>=1;
		if(DATA==1)
		dat|=0x80;
		SCLK=1;
		_nop_();
		SCLK=0;
		_nop_();
	}
	return dat;
}

//根据命令字,从1302读一个字节数据
unsigned char ReadSet1302(unsigned char Cmd)
{
	unsigned char dat;
	RST=0;
	SCLK=0;
	RST=1;
	Write1302(Cmd);
	dat=Read1302();
	SCLK=1;
	RST=0;
	return dat;
}

//1302进行初始化设置
void Init_DS1302(void)
{
	WriteSet1302(0x8E,0x00);
	WriteSet1302(SEC_write,((0/10)&
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值