基于单片机DS1302电子时钟闹钟控制系统

文章描述了一个使用STC89C52作为主控制器,DS1302计时,液晶1602显示的电子钟设计方案。软件设计包括系统初始化、定时器中断服务程序、按键检测和核心算法。此外,还利用Proteus软件进行了硬件仿真以验证设计的正确性,强调了仿真在减少开发成本和时间上的重要性。
摘要由CSDN通过智能技术生成

一、系统方案

本设计采用STC89C52作为主控制器,DS1302计时,液晶1602显示,按键设置时分秒,闹钟,实际时间走时达到闹钟时间,蜂鸣器报警提醒。
在这里插入图片描述

二、硬件设计
原理图如下:

在这里插入图片描述

三、单片机软件设计
1、首先是系统初始化:
/定时器0初始化程序**/
void init_time0()
{
EA = 1; //开总中断
TMOD = 0X12; //定时器0、工作方式1
TH1= 0X3C;
TL1 = 0XB0; //50ms
ET1 = 1; //开定时器0中断
TR1 = 1; //允许定时器0定时
TH0=0x00; //重载值
TL0=0x00; //初始化值
ET0=1; //开中断
TR0=1;
PT1=1;

}

2、中断服务程序
/定时器0中断程序***/
void time1() interrupt 3
{
static uchar value;
TH1= 0X3C;
TL1 = 0XB0; //50ms
value ++;
if((value % 2) == 0) //100ms
flag_100ms = 1;
if(value >= 6) //200ms
{
value = 0;
flag_200ms = 1;
}

}

3、按键检测程序
void key() //独立按键程序
{

if(s1==0)					  
{
	delay_1ms(5);
	if(s1==0)			 
	{
		while(!s1);
		key_can = 4; 
	}
 }
 if(s2==0)					  
{
	delay_1ms(5);
	if(s2==0)			 
	{
			while(!s2);
			key_can = 3; 
							
	}
 }
if(s3==0)					  
{
	delay_1ms(5);
	if(s3==0)			
	{
			while(!s3);
			key_can = 2; 
	}
 }
if(s4==0)					  
{
	delay_1ms(5);
	if(s4==0)			
	{
			while(!s4);
			key_can = 1; 
				
	}
 }
	if(s5==0)					  
{
	delay_1ms(5);
	if(s5==0)			
	{
			while(!s5);
			key_can = 5; 
			flag=!flag;	
	}
 }

}
4、核心算法程序
void main()
{
P0 = P1 = P2 = P3 = 0xff; //单片机IO口初始化为1
init_time0(); //初始化定时器
init_1602(); //lcd1602初始化
init_1602_dis_csf(); //lcd1602初始化显示
while(1)
{
key(); //按键程序

	if(key_can < 10)
	{
		key_with();	
		
		key_can = 20;                   //按键值还原
	}
	
	if(flag_200ms == 1)
	{	
		flag_200ms = 0;
		if(menu_1 == 0)
		{
			read_time();		  //读时间

			init_1602_ds1302();   //显示时钟
		}
			
	}
	menu_dis();	   //闹钟报警函数
	delay_1ms(1);
}

}

四、proteus仿真设计
Proteus软件是一款应用比较广泛的工具,它可以在没有硬件平台的基础上通过自身的软件仿真出硬件平台的运行情况,这样就可以通过软件仿真来验证我们设计的方案有没有问题,如果有问题,可以重新选择器件,连接器件,直到达到我们设定的目的,避免我们搭建实物的时候,如果当初选择的方案有问题,我们器件都已经焊接好了,再去卸载下去,再去焊接新的方案的器件,测试,这样会浪费人力和物力,也给开发者带来一定困惑,Proteus仿真软件就很好的解决这个问题,我们在设计之初,就使用该软件进行模拟仿真,测试,选择满足我们设计的最优方案。最后根据测试没问题的仿真图纸,焊接实物,调试,最终完成本设计的作品。
在这里插入图片描述

51单片机可以使用DS1302时钟芯片制作电子时钟闹钟。以下是基本的硬件接线和程序示例: 硬件接线: DS1302时钟芯片的引脚与51单片机的引脚连接如下: DS1302引脚 单片机引脚 RST P2.0 DAT P2.1 CLK P2.2 程序示例: #include <reg51.h> #include <intrins.h> #define uchar unsigned char #define uint unsigned int sbit RST = P2^0; sbit DAT = P2^1; sbit CLK = P2^2; uchar code table[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f}; uchar sec,min,hour,day,month,week,year; void delay(uchar n) { uint i; for(i=0;i<n;i++); } void ds1302_write_byte(uchar dat) { uchar i; for(i=0;i<8;i++) { DAT = dat & 0x01; CLK = 0; dat >>= 1; CLK = 1; } } uchar ds1302_read_byte() { uchar i,dat=0; for(i=0;i<8;i++) { dat >>= 1; if(DAT) dat |= 0x80; CLK = 0; CLK = 1; } return dat; } void ds1302_write(uchar reg,uchar dat) { RST = 0; CLK = 0; RST = 1; ds1302_write_byte(reg); ds1302_write_byte(dat); RST = 0; CLK = 0; } uchar ds1302_read(uchar reg) { uchar dat; RST = 0; CLK = 0; RST = 1; ds1302_write_byte(reg); dat = ds1302_read_byte(); RST = 0; CLK = 0; return dat; } void ds1302_init() { ds1302_write(0x8e,0x00); ds1302_write(0x90,0xa4); } void ds1302_get_time() { uchar i; sec = ds1302_read(0x81); min = ds1302_read(0x83); hour = ds1302_read(0x85); day = ds1302_read(0x87); month = ds1302_read(0x89); week = ds1302_read(0x8b); year = ds1302_read(0x8d); sec = (sec & 0x0f) + ((sec >> 4) * 10); min = (min & 0x0f) + ((min >> 4) * 10); hour = (hour & 0x0f) + ((hour >> 4) * 10); day = (day & 0x0f) + ((day >> 4) * 10); month = (month & 0x0f) + ((month >> 4) * 10); week = (week & 0x07); year = (year & 0x0f) + ((year >> 4) * 10); } void ds1302_set_time() { uchar i; ds1302_write(0x8e,0x00); ds1302_write(0x80,((sec / 10) << 4) | (sec % 10)); ds1302_write(0x82,((min / 10) << 4) | (min % 10)); ds1302_write(0x84,((hour / 10) << 4) | (hour % 10)); ds1302_write(0x86,((day / 10) << 4) | (day % 10)); ds1302_write(0x88,((month / 10) << 4) | (month % 10)); ds1302_write(0x8a,week); ds1302_write(0x8c,((year / 10) << 4) | (year % 10)); ds1302_write(0x8e,0x80); } void display_time() { uchar i; P0 = 0x00; P1 = 0x80; P0 = table[hour / 10]; delay(10); P0 = 0x00; P1 = 0x40; P0 = table[hour % 10]; delay(10); P0 = 0x00; P1 = 0x20; P0 = 0x3e; delay(10); P0 = 0x00; P1 = 0x10; P0 = table[min / 10]; delay(10); P0 = 0x00; P1 = 0x08; P0 = table[min % 10]; delay(10); P0 = 0x00; P1 = 0x04; P0 = 0x3e; delay(10); P0 = 0x00; P1 = 0x02; P0 = table[sec / 10]; delay(10); P0 = 0x00; P1 = 0x01; P0 = table[sec % 10]; delay(10); } void main() { ds1302_init(); while(1) { ds1302_get_time(); display_time(); } } 上述程序实现了显示当前时间的功能,可以根据需要添加闹钟功能
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bbxyliyang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值