基于单片机的WIFI、语音、储存、时钟、闹钟、定位系统

所有仿真详情导航:

PROTEUS专栏说明-CSDN博客

目录

一、主要功能

二、硬件资源

三、程序编程

四、实现现象


一、主要功能

基于51单片机,采用DS1302时钟模块,通过LCD1602显示实时时间,也可以储存时间在AT2DC02中,下次开机读取闹钟时间
然后通过串口传输实时时间给电脑端,这个表示WIFI
到达闹钟后,蜂鸣器报警,LED闪烁一秒
语音通过串口设置闹钟,发送格式为@22-20-20#
采用按键表示定位模块,一个表示定位正确,一个表示定位错误,用两个LED灯表示状态。

二、硬件资源

基于KEIL5编写C++代码,PROTEUS8.15进行仿真,全部资源在页尾,提供安装包。

三、主程序编程

cpp 复制代码
#include"reg51.h"
#include"ds1302.h"
#include "lcd1602.h"
#include<intrins.h>
#include<stdio.h>
#include"i2c.h"

#define uchar unsigned char	//数据类型换名字
#define uint unsigned int
/**************接口定义***************/
sbit button=P3^2;//按钮
sbit beep=P2^3;//蜂鸣器
sbit led=P1^0;//LED
sbit key1 = P1^1;
sbit key2 = P1^2;
sbit led1 = P1^3;
sbit led2 = P1^4;
/**************变量定义*****************/
uchar shi_time=0x17,fen_time=0x56,miao_time=0X30;//闹钟
uchar alarm[]={"ALARM12-40-30OFF"};//闹钟缓存
uchar clock[]={"CLOCK12-40-30   "};//时钟缓存
uchar ON_OFF=0;//ON.OFF标志
uint tim=0;	  //计时
uint tim1 = 0;
uchar start=0;//闹钟开启

uchar recive=0;//接收标志
uchar start_shou=0;//接收开始
uchar buff[]={"12-40-30"};

void delay(uint i)//延时
{
	while(i--);
}


void UART_init()//串口初始化
{
	SCON=0X50;			//设置为工作方式1
	TMOD = 0x21;  	//T1工作模式2  8位自动重装	T0模式1
	TH1 = 0xfd;
	TL1 = 0xfd; 	//比特率9600
	TH0=0x3c;//定时50ms
	TL0=0xb0;
	ET0=1;//T0中断开启
	TR0=1;
	TR1 = 1;		//启动T1定时器
	REN = 1;		//串口允许接收
	EA  = 1;		//开总中断
	ES  = 1;		//串口中断打开
	TI=1;
}
//===================================================================
void main()//主函数
{	
	init_1602();
	delay(10000);
	write_string(1,0,clock);//显示
	write_string(2,0,alarm);

	Ds1302ReadTime();
	TIME[0]&=0x7f;
	Ds1302Init();

	shi_time=At24c02Read(0);//初始化闹钟
	//if((shi_time>0x23)||((shi_time>>4)>9)||((shi_time&0x0f)>9))
	//	shi_time=0x06;
	fen_time=At24c02Read(1);//初始化闹钟
	//if(fen_time>0x59||((fen_time>>4)>9)||((fen_time&0x0f)>9))
	//	fen_time=0x30;
	miao_time=At24c02Read(2);//初始化闹钟
	//if(miao_time>0x59||((miao_time>>4)>9)||((miao_time&0x0f)>9))
	//	miao_time=0x30;
	At24c02Write(0,shi_time);//保存到24C02
	delay(10000);
	At24c02Write(1,fen_time);
	delay(10000);
	At24c02Write(2,miao_time);
	delay(10000);
	alarm[5]=(shi_time>>4)+0x30;
	alarm[6]=(shi_time & 0x0f)+0x30;
	alarm[8]=(fen_time>>4)+0x30;
	alarm[9]=(fen_time & 0x0f)+0x30;
	alarm[11]=(miao_time>>4)+0x30;
	alarm[12]=(miao_time & 0x0f)+0x30;
	write_string(2,0,alarm);//显示闹钟
	UART_init(); //串口初始化
	while(1)//主循环
	{
		if(!key1)
		{
			led1 = 0;
			led2 = 1;
			while(!key1);
		}
		
			if(!key2)
		{
			led1 = 1;
			led2 = 0;
			while(!key1);
		}
		
	 if(!button)//检测按钮
	 {
//	 delay(100);//延时消抖
	 	  if(!button)
		  {
		  	if(start)	  //清除报警
			  	start=0;
			else		 //闹钟开关
			   ON_OFF=!ON_OFF;
			if(!ON_OFF)		   //调整闹钟显示
			{
				alarm[14]='F';
				alarm[15]='F';
				write_string(2,0,alarm);
			}
			else
			{
				alarm[14]='N';
				alarm[15]=' ';
				write_string(2,0,alarm);
			}
		  }
		  while(!button);//等待按钮松开
	 }
	}
//**************************
	
}
//===================================================================
void UART() interrupt 4	//串口中断
{
	uchar num=0,i;
	if(RI)
	{	
	
		num=SBUF;//保存数据
		RI=0;

		if(start_shou)
		{
			TR0=0;
			buff[recive]=num;//保存数据
			recive++;
			if(recive==8)//接收数据处理
				{	
					recive=0;
					
					shi_time=(buff[0]-0x30)<<4;					
					shi_time+=(buff[1]-0x30);
					fen_time=(buff[3]-0x30)<<4;
					fen_time+=(buff[4]-0x30);
					miao_time=(buff[6]-0x30)<<4;
					miao_time+=(buff[7]-0x30);
					for(i=0;i<8;i++)	  //保存到数组
					{
						alarm[i+5]=buff[i];
					}
					write_string(2,0,alarm);//显示闹钟
					At24c02Write(0,shi_time);//保存到24C02
					delay(10000);
					At24c02Write(1,fen_time);
					delay(10000);
					At24c02Write(2,miao_time);
					delay(10000);
					TR0=1;
				}			
		}
		if(num=='@') //开始
			{
				start_shou=1;
				recive=0;
			}
		if(num=='#') //结束
			{
				start_shou=0;
				recive=0;
			}
			TR0=1;
	}
}

void timer0() interrupt 1//T0中断
{ 
	uchar i=0,j=0;
		if(start)//响铃
			beep=0;
		else
			beep=1;//关闭蜂鸣器
	//***************************
	if(tim<10)//0.5s
		tim++;
	else
		{
		tim=0;
		if(start)	 //闪灯
			led=!led;
		else
			led=1;	 //关灯
		Ds1302ReadTime();//读取时间
		clock[5]=(TIME[2]>>4)+0x30;//转换成ascall
		clock[6]=(TIME[2]&0x0f)+0x30;
		clock[8]=(TIME[1]>>4)+0x30;//转换成ascall
		clock[9]=(TIME[1]&0x0f)+0x30;
		clock[11]=(TIME[0]>>4)+0x30;//转换成ascall
		clock[12]=(TIME[0]&0x0f)+0x30;
		write_string(1,0,clock);//显示	
		//*************************
	i=0;
	if(miao_time==TIME[0])//闹钟检测
	{
		i++;
	}
if(ON_OFF==1)
{				
	if(shi_time==TIME[2])
	{
		i++;
	}
	if(fen_time==TIME[1])
	{
		i++;
	}
	if(i==3)
	{	 
		start=1;//开启闹铃
		i=0;
	}
	if(fen_time+1==TIME[1])
	{
		i++;
	}
	if(i==3)
	{	 
		start=0;//关闭闹铃
		i=0;
	}
}
		}
		if(tim1<20)
		{
			tim1++;
		}
		else
		{
			tim1 = 0;
			printf("%s \r\n",clock);	
		}
	TH0=0x3c;//定时50ms
	TL0=0xb0;
}

四、实现现象

具体动态效果看B站演示视频:

基于单片机的WIFI、语音、储存、时钟、闹钟、定位系统_哔哩哔哩_bilibili

全部资料(源程序、仿真文件、安装包、原理图、演示视频):

链接: https://pan.baidu.com/s/1bmfVoItSzq9Hi06uQmVkXQ?pwd=8wq1 提取码: 8wq1

--来自百度网盘超级会员v4的分享

相关推荐
厉昱辰34 分钟前
一文读懂单片机的串口
单片机·嵌入式硬件
沐欣工作室_lvyiyi39 分钟前
基于STM32的智能生态水族箱系统设计(论文+源码)
stm32·单片机·嵌入式硬件·物联网·毕业设计·水族箱
7yewh2 小时前
自制红外热像仪(二) MLX90640移植 RP2040 STM32 ESP32
驱动开发·stm32·单片机·嵌入式硬件·mcu·计算机视觉
冰糖雪莲IO3 小时前
【江协STM32】10-2/3 MPU6050简介、软件I2C读写MPU6050
stm32·单片机·嵌入式硬件
1101 11013 小时前
STM32-笔记39-SPI-W25Q128
笔记·stm32·嵌入式硬件
Leiditech__3 小时前
汽车氛围灯静电浪涌的难点
嵌入式硬件·汽车·硬件工程
云山工作室5 小时前
基于单片机的客车载客状况自动检测系统(论文+源码)
单片机·嵌入式硬件·毕业设计·毕设
2301_805962937 小时前
NRF24L01模块STM32通信-发送端
stm32·单片机·嵌入式硬件
LeoZY_9 小时前
CH348结合开源ModBus协议组成串口温度采集服务器
运维·笔记·嵌入式硬件·开源
我想学LINUX9 小时前
【STM32+QT项目】基于STM32与QT的智慧粮仓环境监测与管理系统设计(完整工程资料源码)
stm32·嵌入式硬件·qt·毕业设计·课程设计·项目开发