基于单片机的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的分享

相关推荐
画江湖Test1 小时前
分享一个您在汽车软件安全性测试中发现严重漏洞的案例,以及如何处理
嵌入式硬件·安全·面试·汽车·软件测试面试
黄交大彭于晏1 小时前
stm32 hal库 keil5工程编译烧录配置
stm32·单片机·嵌入式硬件
陌夏微秋1 小时前
元器件选型与参数13 电源的分类-线性电源参数 RT9013 AMS1117 PCB布局布线
arm开发·单片机·嵌入式硬件·智能手机·51单片机·硬件工程
DFT_bug_king2 小时前
sram测试注意讨论
嵌入式硬件·fpga开发
码猩2 小时前
C#高速串口通讯方案winform实例
开发语言·单片机·c#
北京迅为3 小时前
【北京迅为】iTOP-4412全能版使用手册-第三十二章 网络通信-TCP套字节
linux·嵌入式硬件·4412开发板
ADI_OP3 小时前
用System Workbench for STM32做MCU控制ADI DSP的开发,如何导入工程
stm32·单片机·嵌入式硬件·dsp开发·adi dsp中文资料·adi音频dsp·adi dsp开发教程
程序员buddha4 小时前
普中51单片机——LED流水灯模块
单片机·嵌入式硬件·51单片机
不能只会打代码4 小时前
51单片机从入门到精通:理论与实践指南综合应用——实战篇(九)
单片机·嵌入式硬件·51单片机
程序员-Queen6 小时前
DeviceIoControl超时后如何处理
stm32·单片机·嵌入式硬件