STC89C52RC单片机实现简单定时闹钟+LCD1602+DS1302

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


目录

前言

一、各模块基本原理

1、DS1302.

1.介绍。

2.内部结构。

3.时钟日历控制寄存器

4.DS130231字节的RAM寄存器

5.DS1302的工作模式寄存器

6.DS1320的通信时序

2、LCD1602

1.LCD1602液晶显示屏

2、LCD1602主要参数

3、LCD1602引脚接线:

​编辑4、各引脚的功能介绍如下:

5、标准字库表(CGROM):

二、代码详情

1.DS1302初始化程序

2.LCD1602

3.主要功能程序

三、proteus仿真图部分。

1、总仿真图

2、蜂鸣器模块

四、立创EDA进行功能部分。

1、立创EDA原理图

2、pcb平面图

3、总实物图

总结

前言

本人首次发表csdn,作品为本人单片机课设,主要利用主控芯片STC89C52RC进行控制,其中时序模块有DS1302+LCD1602构成,最后实现简单的定时闹钟,其中时间可调,闹钟可调。

同时再次声明:本人为嵌入式小白,欢迎各位大佬指正。


提示:以下是本篇文章正文内容,下面案例可供参考

一、各模块基本原理

1、DS1302.

1.介绍。


DS1302是一种串行接口的实时时钟,芯片内部具有可编程的日历时钟和31个字节的静态RAM。


2.内部结构。


(1)SCLK:串行时钟输入端,控制数据输入与输出。
(2)I/O:双向输入线
(3)CE:使能端,CE为高时允许DS1302读写数据,CE端为低时DS1302数据不可读写
(4)X1与X2:外接32.768的圆形晶振,给时钟芯片提供晶振频率。


3.时钟日历控制寄存器

(1)秒寄存器(0X81,0X80): 当CH=1秒位停止关闭。
(2)小时寄存器(0x85,0x84):当BIT7为1时为12小时制,当BIT7为0时为24小时制。
(3)控制寄存器(0x8f,0x8e):当WP为1时,不能对Ds1302做任何操作。


4.DS130231字节的RAM寄存器

就是断电后仍然存在的数据区域


5.DS1302的工作模式寄存器

突发模式就是一次性转输多个字节的的数据到时钟或RAM

请添加图片描述


6.DS1320的通信时序


(1)从最低位开始
(2)读写数据:都是CE端由低到高,然后前8位,写命令字节,后8位,写数据字节。
————————————————
版权声明:本原理部分为CSDN博主「普通的不普通少年」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_54674051/article/details/119332650。

2、LCD1602

1.LCD1602液晶显示屏


LCD ( Liquid Crystal Display 的简称)液晶显示器。能够同时显示16x2,32个字符,是一种专门用来显示字母、数字、符号等的点阵型液晶模块。

LCD1602液晶显示器是广泛使用的一种字符型液晶显示模块。它是由字符型液晶显示屏(LCD)、控制驱动主电路HD44780及其扩展驱动电路HD44100,以及少量电阻、电容元件和结构件等装配在PCB板上而组成。该显示屏的优点是耗电量低、体积小、辐射低。

LCD1602主要用来显示数字、字母、图形以及少量自定义字符。可以显示2行16个字符,拥有16个引脚,其中8位数据总线D0-D7,和RS、R/W、EN三个控制端口,工作电压为5V,并且带有字符对比度调节V0和背光源AK。

在这里插入图片描述


注:
我们所用的LCD屏的命名,基本都是按照其分辨率来进行命名的 比如lcd1602 就是分辨率为16×2 lcd12864 就是分辨率为128×64

2、LCD1602主要参数


显示字符:16×2个字符
工作电压:4.5~5V
工作电流:2.0mA
工作温度:-20°C~70°C
模块最佳工作电压:5.0V
单个字符尺寸2.95×4.35(W×Hmm)
引脚:16脚

3、LCD1602引脚接线:

在这里插入图片描述
4、各引脚的功能介绍如下:

 

引脚1(VSS/GND)::地引脚

引脚2(VDD/VCC):电源引脚

引脚3(VL):液晶显示器对比度引脚,接正电源时对比度最弱,接地时对比度最高,使用时可以通过外接一个电位器调整其对比度。

引脚4(RS):寄存器选择脚,高电平时选择数据寄存器、低电平时选择指令寄存器。

引脚5(R/W):读(read)/写(write)信号线,高电平时进行读操作,低电平时进行写操作。当RS和R/W共同为低电平时可以写入指令或显示地址;当RS为低电平,R/W为高电平时,可以读忙信号;当RS为高电平,R/W为低电平时,可以写入数据。

引脚6(E):使能端,当E端由高电平跳变为低电平时,液晶模块执行命令。

引脚7-14(D0~D7): 8位双向数据线 用于单片机向1602写入数据和从1602读取数据

引脚15:背光源正极

引脚16:背光源负极

LCD1602共16个管脚,但分类很好分类,
其中一个VCC和GND用于给1602供电,
一个VCC和GND用于给背光源供电,
剩下三个功能引脚:RS(数据命令选择端),R/W(读写选择端),E(使能信号),
还有8个D0~D7分别为8位双向数据线传输数据。

RS为寄存器选择,高电平选择数据寄存器,低电平选择指令寄存器。
R/W为读写选择,高电平进行读操作,低电平进行写操作。
E端为使能端,后面和时序联系在一起。
LCD1602的RAM地址映射及标准字库表
LCD1602,总共显示为16行2列,对应着32个RAM地址,在使用的时候,需要在哪个位置显示,就写入对应的RAM地址,然后再写入需要的字符,对应就会显示该字符。

液晶显示模块是一个慢显示器件,所以在执行每条指令之前一定要确认模块的忙标志为低电平,表示LCD此时不忙,这时才能写指令和数据,否则此指令失效。要显示字符时要先输入显示字符地址(写指令),也就是告诉模块在,哪里显示字符,然后再写入需要显示的字符(写数据),才能够正常显示字符

下图是1602的内部显示地址
一共32个地址,对应2行16列

5、标准字库表(CGROM):

这个ROM中固化了一些我们常用的ASCII字符以及部分日文字符的点阵数据,需要写入那个字符,就直接设置对应进制码就可以,比如大写的字母A,代码是0100 0001(41H) 与ASCII码一致。也就是表中的ASCII码字符的地址和实际的ASCII码字符是一样的

LCD1602读写操作
LCD1602分为读操作和写操作

其中读操作可以分为读状态和读数据,写操作可以分为写指令和写数据。

读状态: 读取LCD引脚状态,返回为状态字,D0-D6为当前LCD数据指针的地址 D7为是否允许读写操作(即检查LCD是否处于忙状态)

读数据:读取D0-07内的数据

写指令: 写入LCD的控制指令,比如清屏,显示开关等

写数据: 写入需要显示的数据,比方说要显示字符a,就写入0100 0001(41H)

读状态    
引脚电平:RS=L,RW=H,E=H    输出:D0~D7=状态字
读数据    
引脚电平:RS=H,RW=H,E=H    输出:D0~D7的数据
写指令    
引脚电平:RS=L,RW=L,D0~D7=指令码,E=高脉冲    输出:无
写数据    
引脚电平:RS=H,RW=L,D0~D7=数据,E=高脉冲    输出:无
以51单片机为例,D0-D7接到P0口 RW RW EN接到任意两个口

读写操作的时序图如下:

读操作时序:在这里插入图片描述

写操作时序:
我们来分析一下时序图,当我们要写指令的时候,RS置为低电平,RW置为低电平,EN置为低电平,然后将指令数据送到数据口D0~D7,延时tsp1,让1602准备接收数据,这时候将EN拉高,产生一个上升沿,这时候指令就开始写入LCD,延时一段时间,将EN置低电平。

当我们要写数据的时候,RS置为高电平,RW置为低电平,EN置为低电平,然后将指令数据送到数据口D0~D7,延时tsp1,让1602准备接收数据,这时候将EN拉高,产生一个上升沿,这时候数据就开始写入LCD,延时一段时间,将EN置低电平。
————————————————
版权声明:本原理部分为CSDN博主「Z小旋」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/as480133937/article/details/113148712

二、代码详情

1.DS1302初始化程序

代码如下(示例):

#include "ds1302.h"
#include "intrins.h"

//---DS1302写入和读取时分秒的地址命令---//
//---秒分时日月周年 最低位读写位;-------//
u8 gREAD_RTC_ADDR[3] = {0x81, 0x83, 0x85,}; 
u8 gWRITE_RTC_ADDR[3] = {0x80, 0x82, 0x84};

//---DS1302时钟初始化2021年5月20日星期四13点51分47秒。---//
//---存储顺序是秒分时日月周年,存储格式是用BCD码---//
u8 gDS1302_TIME[3] = {0x47, 0x51, 0x13};


void ds1302_write_byte(u8 addr,u8 dat)
{
	u8 i=0;
	
	DS1302_RST=0;
	_nop_();	
	DS1302_CLK=0;//CLK低电平
	_nop_();
	DS1302_RST=1;//RST由低到高变化
	_nop_();

	for(i=0;i<8;i++)//循环8次,每次写1位,先写低位再写高位
	{
		DS1302_IO=addr&0x01;
		addr>>=1;
		DS1302_CLK=1;
		_nop_();
		DS1302_CLK=0;//CLK由低到高产生一个上升沿,从而写入数据
		_nop_();		
	}
	for(i=0;i<8;i++)//循环8次,每次写1位,先写低位再写高位
	{
		DS1302_IO=dat&0x01;
		dat>>=1;
		DS1302_CLK=1;
		_nop_();
		DS1302_CLK=0;
		_nop_();		
	}
	DS1302_RST=0;//RST拉低
	_nop_();	
}


u8 ds1302_read_byte(u8 addr)
{
	u8 i=0;
	u8 temp=0;
	u8 value=0;

	DS1302_RST=0;
	_nop_();	
	DS1302_CLK=0;//CLK低电平
	_nop_();
	DS1302_RST=1;//RST由低到高变化
	_nop_();
	
	for(i=0;i<8;i++)//循环8次,每次写1位,先写低位再写高位
	{
		DS1302_IO=addr&0x01;
		addr>>=1;	
		DS1302_CLK=1;
		_nop_();
		DS1302_CLK=0;//CLK由低到高产生一个上升沿,从而写入数据
		_nop_();		
	}
	for(i=0;i<8;i++)//循环8次,每次读1位,先读低位再读高位
	{
		temp=DS1302_IO;
		value=(temp<<7)|(value>>1);//先将value右移1位,然后temp左移7位,最后或运算
		DS1302_CLK=1;
		_nop_();
		DS1302_CLK=0;
		_nop_();		
	}
//	DS1302_RST=0;//RST拉低,当DS1302与DS18B20同时使用时,注释掉该调语句
	_nop_();	
	DS1302_CLK=1;//对于实物中,P3.4口没有外接上拉电阻的,此处代码需要添加,使数据口有一个上升沿脉冲。
	_nop_();
	DS1302_IO = 0;
	_nop_();
	DS1302_IO = 1;
	_nop_();	
	return value;		
}


void ds1302_init(void)
{
	u8 i=0;
	ds1302_write_byte(0x8E,0X00);
	for(i=0;i<3;i++)
	{
		ds1302_write_byte(gWRITE_RTC_ADDR[i],gDS1302_TIME[i]);	
	}
	ds1302_write_byte(0x8E,0X80);	
}


void ds1302_read_time(void)
{
	u8 i=0;
	for(i=0;i<3;i++)
	{
		gDS1302_TIME[i]=ds1302_read_byte(gREAD_RTC_ADDR[i]);	
	}	
}







//下面部分为DS1302头文件
#ifndef _ds1302_H
#define _ds1302_H

#include "public.h"

//管脚定义
sbit DS1302_RST=P3^5;//复位管脚
sbit DS1302_CLK=P3^6;//时钟管脚
sbit DS1302_IO=P3^4;//数据管脚

//变量声明
extern u8 gDS1302_TIME[3];//存储时间

//函数声明
void ds1302_init(void);
void ds1302_read_time(void);


#endif

2.LCD1602

代码如下(示例):

#include "lcd1602.h"



#if (LCD1602_4OR8_DATA_INTERFACE==0)//8位LCD
void lcd1602_write_cmd(u8 cmd)
{
	LCD1602_RS=0;//选择命令
	LCD1602_RW=0;//选择写
	LCD1602_E=0;
	LCD1602_DATAPORT=cmd;//准备命令
	delay_ms(1);
	LCD1602_E=1;//使能脚E先上升沿写入
	delay_ms(1);
	LCD1602_E=0;//使能脚E后负跳变完成写入	
}
#else	//4位LCD
void lcd1602_write_cmd(u8 cmd)
{
	LCD1602_RS=0;//选择命令
	LCD1602_RW=0;//选择写
	LCD1602_E=0;
	LCD1602_DATAPORT=cmd;//准备命令
	delay_ms(1);
	LCD1602_E=1;//使能脚E先上升沿写入
	delay_ms(1);
	LCD1602_E=0;//使能脚E后负跳变完成写入
	
	LCD1602_DATAPORT=cmd<<4;//准备命令
	delay_ms(1);
	LCD1602_E=1;//使能脚E先上升沿写入
	delay_ms(1);
	LCD1602_E=0;//使能脚E后负跳变完成写入	
}
#endif


#if (LCD1602_4OR8_DATA_INTERFACE==0)//8位LCD
void lcd1602_write_data(u8 dat) 
{
	LCD1602_RS=1;//选择数据
	LCD1602_RW=0;//选择写
	LCD1602_E=0;
	LCD1602_DATAPORT=dat;//准备数据
	delay_ms(1);
	LCD1602_E=1;//使能脚E先上升沿写入
	delay_ms(1);
	LCD1602_E=0;//使能脚E后负跳变完成写入		
}
#else
void lcd1602_write_data(u8 dat) 
{
	LCD1602_RS=1;//选择数据
	LCD1602_RW=0;//选择写
	LCD1602_E=0;
	LCD1602_DATAPORT=dat;//准备数据
	delay_ms(1);
	LCD1602_E=1;//使能脚E先上升沿写入
	delay_ms(1);
	LCD1602_E=0;//使能脚E后负跳变完成写入
	
	LCD1602_DATAPORT=dat<<4;//准备数据
	delay_ms(1);
	LCD1602_E=1;//使能脚E先上升沿写入
	delay_ms(1);
	LCD1602_E=0;//使能脚E后负跳变完成写入		
}
#endif


#if (LCD1602_4OR8_DATA_INTERFACE==0)//8位LCD
void lcd1602_init(void)
{
	lcd1602_write_cmd(0x38);//数据总线8位,显示2行,5*7点阵/字符
	lcd1602_write_cmd(0x0c);//显示功能开,无光标,光标闪烁
	lcd1602_write_cmd(0x06);//写入新数据后光标右移,显示屏不移动
	lcd1602_write_cmd(0x01);//清屏	
}
#else
void lcd1602_init(void)
{
	lcd1602_write_cmd(0x28);//数据总线4位,显示2行,5*7点阵/字符
	lcd1602_write_cmd(0x0c);//显示功能开,无光标,光标闪烁
	lcd1602_write_cmd(0x06);//写入新数据后光标右移,显示屏不移动
	lcd1602_write_cmd(0x01);//清屏	
}
#endif


void lcd1602_clear(void)
{
	lcd1602_write_cmd(0x01);	
}


void lcd1602_show_string(u8 x,u8 y,u8 *str)
{
	u8 i=0;

	if(y>1||x>15)return;//行列参数不对则强制退出

	if(y<1)	//第1行显示
	{	
		while(*str!='\0')//字符串是以'\0'结尾,只要前面有内容就显示
		{
			if(i<16-x)//如果字符长度超过第一行显示范围,则在第二行继续显示
			{
				lcd1602_write_cmd(0x80+i+x);//第一行显示地址设置	
			}
			else
			{
				lcd1602_write_cmd(0x40+0x80+i+x-16);//第二行显示地址设置	
			}
			lcd1602_write_data(*str);//显示内容
			str++;//指针递增
			i++;	
		}	
	}
	else	//第2行显示
	{
		while(*str!='\0')
		{
			if(i<16-x) //如果字符长度超过第二行显示范围,则在第一行继续显示
			{
				lcd1602_write_cmd(0x80+0x40+i+x);	
			}
			else
			{
				lcd1602_write_cmd(0x80+i+x-16);	
			}
			lcd1602_write_data(*str);
			str++;
			i++;	
		}	
	}				
}

3.主要功能程序

代码如下(示例):

#include "calendar.h"
#include "ds1302.h"
#include "lcd1602.h"
#include "key.h"
#include "beep.h"
#include "time.h"


code u8 alarm_switch_str[]="Alarm: OFF";
code u8 alarm_on_str[]="ON ";
code u8 alarm_off_str[]="OFF";

_calendar g_calendar;

u8 g_keyvalue=0;

void time0() interrupt 1
{
	static u8 cnt=0;
	static u8 oneflag=1;
	TH0=0xDC;
	TL0=0x00; 
	cnt++;
	
	if(cnt==50)
	{
		cnt=0;
		if(g_calendar.mode==0)
			ds1302_read_time();			
		if(oneflag==1)
		{
			oneflag=0;
			g_calendar.alarm_time[0]=g_calendar.min;
			g_calendar.alarm_time[1]=g_calendar.hour;//记录初始闹钟时间		
		}
//		g_calendar.temperture=ds18b20_read_temperture();		
	}
}

void calendar_datapros(u8 *timebuf)
{
	timebuf[0]=g_calendar.hour/16+0x30;
	timebuf[1]=g_calendar.hour%16+0x30;
	timebuf[2]=':';
	timebuf[3]=g_calendar.min/16+0x30;
	timebuf[4]=g_calendar.min%16+0x30;
	timebuf[5]=':';
	timebuf[6]=g_calendar.sec/16+0x30;
	timebuf[7]=g_calendar.sec%16+0x30;
	timebuf[8]='\0';				
}


void alarm_datapros(u8 *alarmbuf)//闹钟时间记录
{
	alarmbuf[0]=g_calendar.alarm_time[1]/16+0x30;
	alarmbuf[1]=g_calendar.alarm_time[1]%16+0x30;
	alarmbuf[2]='-';
	alarmbuf[3]=g_calendar.alarm_time[0]/16+0x30;
	alarmbuf[4]=g_calendar.alarm_time[0]%16+0x30;
	alarmbuf[5]='\0';		
}

void calendar_save_set_time(void)//记录正确的时间
{
	gDS1302_TIME[0]=g_calendar.sec;
	gDS1302_TIME[1]=g_calendar.min;
	gDS1302_TIME[2]=g_calendar.hour;
	ds1302_init();		
}	  

void calendar_set_time(void)//时钟设置模式
{
	if(g_calendar.mode==1)//时钟设置
	{
		if(g_calendar.add==1)//进入模式设置时,用于加
		{
			g_calendar.add=0;	
			switch(g_calendar.time_choice)//进入模式设置时,用于切换年月日时分秒哪个需要设置
			{
				case 0: g_calendar.sec++;
						if((g_calendar.sec&0x0f)>9)g_calendar.sec+=6;
						if(g_calendar.sec>=0x60)g_calendar.sec=0;
						break;
				case 1: g_calendar.min++;
						if((g_calendar.min&0x0f)>9)g_calendar.min+=6;
						if(g_calendar.min>=0x60)g_calendar.min=0;
						break;
				case 2: g_calendar.hour++;
						if((g_calendar.hour&0x0f)>9)g_calendar.hour+=6;
						if(g_calendar.hour>=0x24)g_calendar.hour=0;
						break;	
			}	
		}																
	}				
}

void calendar_set_alarm(void)//闹钟设置模式
{
	if(g_calendar.mode==2)//闹钟设置
	{
		if(g_calendar.add==1)
		{
			g_calendar.add=0;	
			switch(g_calendar.time_choice)
			{
				case 0: g_calendar.alarm_time[0]++;
						if((g_calendar.alarm_time[0]&0x0f)>9)g_calendar.alarm_time[0]+=6;
						if(g_calendar.alarm_time[0]>=0x60)g_calendar.alarm_time[0]=0;
						break;
				case 1: g_calendar.alarm_time[1]++;
						if((g_calendar.alarm_time[1]&0x0f)>9)g_calendar.alarm_time[1]+=6;
						if(g_calendar.alarm_time[1]>=0x24)g_calendar.alarm_time[1]=0;
						break; 
				case 2: g_calendar.alarm=!g_calendar.alarm;
						break;
				case 3: g_calendar.time_choice=0;
						break;
			}	
		}																	
	}		
}

void calendar_show(void)//时钟显示
{
	u8 time_buf[9];

	if(g_calendar.mode==0)//正常模式显示
	{
		g_calendar.sec=gDS1302_TIME[0];	
		g_calendar.min=gDS1302_TIME[1];
		g_calendar.hour=gDS1302_TIME[2];
		calendar_datapros(time_buf);			
		lcd1602_show_string(0,1,time_buf);
        if(g_calendar.alarm)
		{
			lcd1602_show_string(0,0,alarm_switch_str);	
			lcd1602_show_string(7,0,alarm_on_str);	
		}
		else
		{
			lcd1602_show_string(0,0,alarm_switch_str);	
			lcd1602_show_string(7,0,alarm_off_str);
		}			
	}
	else if(g_calendar.mode==1)//时钟设置模式显示
	{
		calendar_datapros(time_buf);			
		lcd1602_show_string(0,1,time_buf);		
	}
	else if(g_calendar.mode==2)//闹钟设置模式显示
	{	
		alarm_datapros(time_buf);	
		lcd1602_show_string(0,1,time_buf);
		if(g_calendar.alarm)
			lcd1602_show_string(7,0,alarm_on_str);	
		else
			lcd1602_show_string(7,0,alarm_off_str);		
	}			
}

void alarm_compareproc(void)
{
	if(g_calendar.alarm&&g_calendar.setok)
	{
		if(g_calendar.alarm_time[1]==g_calendar.hour)
	    {
			if(g_calendar.alarm_time[0]==g_calendar.min)//对比闹钟设置时间和当前时间,相同则闹铃
			{
				beep_alarm(10);
				g_calendar.setok=0;
		    }			
		}
	}
	else if (g_calendar.setok==0)
	{
		BEEP=1;
	}
}

void calendar_test(void)
{
	u8 key_temp=0;

	lcd1602_init();
	ds1302_init();
	time0_init();//定时器10ms	
	while(1)
	{
		key_temp=key_scan(0);
		if(key_temp==KEY1_PRESS)//模式设置
		{
			g_calendar.mode++;
			if(g_calendar.mode==3)
			g_calendar.mode=1;
			g_calendar.setok=0;
			g_calendar.time_choice=0;
			if(g_calendar.mode==2)//按K1两下,进入闹钟设置
			{
				lcd1602_clear();
				lcd1602_show_string(0,0,alarm_switch_str);	
			}
//			beep_alarm(50,10);	
		}				
		else if(key_temp==KEY2_PRESS)//进入设置模式
		{
			g_calendar.time_choice++;
			if(g_calendar.time_choice==3)
				g_calendar.time_choice=0;
//			beep_alarm(50,10);
			
		}
		else if(key_temp==KEY3_PRESS)//进入设置模式
		{
			g_calendar.add=1;
//			beep_alarm(50,10);
		}	
		else if(key_temp==KEY4_PRESS)//设置完成,恢复正常显示模式
		{
			g_calendar.setok=1;
			g_calendar.time_choice=0;
			g_calendar.mode=0;
			calendar_save_set_time();
//			beep_alarm(50,10);			
		}
		if(g_calendar.mode==1)//模拟光标闪烁
		{
			if(g_calendar.time_choice<3)
				lcd1602_show_string(7-g_calendar.time_choice*3,1," ");		
		}
		else if(g_calendar.mode==2)//模拟光标闪烁
		{
			if(g_calendar.time_choice<2)
				lcd1602_show_string(4-g_calendar.time_choice*3,1," ");
			else if(g_calendar.time_choice==2)
				lcd1602_show_string(9,0," ");
			else if(g_calendar.time_choice==3)
				lcd1602_show_string(4,1," ");		
		}
				
		calendar_set_time();
		calendar_set_alarm();	
		calendar_show();
		alarm_compareproc();	
	}		
}


三、proteus仿真图部分。

1、总仿真图

 

图中主要有DS1302模块+LCD1602模块+蜂鸣器模块+按键模块。其中DS1302+LCD1602模块在此不再赘述,另外强调,LCD1602模块中的滑动变阻器应使用103。

2、蜂鸣器模块

 

在此蜂鸣器中,首先采用有源蜂鸣器,主要有三极管和继电器辅助构成,在单片机管脚空接时,引脚为高电平,此时三极管导通,使得继电器由常闭打向常开,此时蜂鸣器不工作。蜂鸣器工作时,单片机引脚为低电平,此时三极管截止,继电器常闭,蜂鸣器发声。

四、立创EDA进行功能部分。

1、立创EDA原理图

 在此与Proteus中大致相同,但为了后续pcb板的制作,在所有的端口处均需要接排针。

2、pcb平面图

 在立创EDApcb制作时,在选取器件时候,建议直接在立创商城搜索,这样方便观看价格以及所需器件的规格。

3、总实物图

 

总结


以上就是今天要讲的内容,本文仅仅简单完成了单片机课设并使用立创EDA进行开源,主要利用到Proteus与立创EDA的使用,且原理部分参考部分博主  其中代码部分可参考普中科技哔站教学。

最后:在此声明,欢迎大家探讨。

百度网盘;链接:https://pan.baidu.com/s/1RG-e7DhYhCcUHwFFd_9PxA 
提取码:1234 
--来自百度网盘超级会员V3的分享

  • 15
    点赞
  • 97
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
本次设计的内容是一个多功能的智能系统。这是一个基于单片机的设计。在编写程序的时候,我们采用的是总分结构。先将主程序编写出来。再根据不同的功能模块进行程序的编写。 本系统是一个基于STC89C52RC型号的单片机的智能时钟系统,该系统实现了时钟走时功能、正反秒表功能、温度采集功能和闹钟功能。系统采集到的数据通过总线传输到LED1602显示屏显示。完成了所有的基础功能,并在基础功能上有所提高。 本次设计完成电子时钟年、月、日、时、分、秒、星期的显示及正反秒秒表计时功能,完成了环境温度采集并实时显示功能,在此基础上实现定时闹钟的功能。硬件电路包括单片机最小系统电路、DS1302实时时钟芯片电路模块、七段数码管LCD1602显示模块、按键模块、DS18B20温度传感器模块、蜂鸣器播报模块,并利用keil软件和proteus软件进行仿真。 单片机控制模块:STC89C52RC 时钟模块 DS1302 温度采集模块:DS18B20 液晶显示模块:LCD1602 按键模块 本程序的初始界面为时间界面,K1键可控制光标的位置,移动到需要改变的位置,用K2(增大键)K3(减小键)进行手动的矫正时间,按下K4键光标复位。 秒表:1.按下K5键切换到秒表界面 2.K1键(按下表示倒计时 倒计时时间为60s)(未按下表示正计时从0开始及时)3.K2键表示计时开始 4.K3键表示计时停止 5.K4键表示复位 仿真原理图:

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值