智能蓝牙时钟

采用51单片机实现的智能闹钟,涉及的模块:蜂鸣器,HC-05蓝牙模块,DHT11温湿度模块,  HC-SR501热释电人体感应,LCD1602。

主要实现的功能:

  1. 实时时钟的显示
  2. 实时温湿度显示
  3. 闹钟设置
  4. 蓝牙控制
  5. 超级闹钟模式:响铃后若还没起床,闹钟会一直响

原理图:

 部分代码展示:↓    ↓    ↓ 

void Timeshow(void) //时钟显示功能
{
	LCD_ShowString(1, 1, "    ");
	LCD_ShowString(1, 13, "    ");
	LCD_ShowString(1, 7, "-");
	LCD_ShowString(1, 10, "-");
	LCD_ShowString(2, 1, "    ");
	LCD_ShowString(2, 13, "   ");
	LCD_ShowString(2, 7, ":");
	LCD_ShowString(2, 10, ":");
	LCD_ShowNum(1, 5, DS1302_time[0], 2);
	LCD_ShowNum(1, 8, DS1302_time[1], 2);
	LCD_ShowNum(1, 11, DS1302_time[2], 2);
	LCD_ShowNum(2, 5, DS1302_time[3], 2);
	LCD_ShowNum(2, 8, DS1302_time[4], 2);
	LCD_ShowNum(2, 11, DS1302_time[5], 2);
	if(startflag) LCD_ShowChar(2,16,'*');
	else LCD_ShowChar(2,16,' ');
}

void Timeset(void) //时钟设置功能
{
	if(KeyNum == 2)
	{
		KeyNum = 0;
		Timesetselect++;
		Timesetselect %= 6; //越界清零
	}
	if(KeyNum == 3)
	{
		KeyNum = 0;
		DS1302_time[Timesetselect]++;
		if(DS1302_time[0]>99) DS1302_time[0] = 0;
		if(DS1302_time[1]>12) DS1302_time[1] = 1;
		if(DS1302_time[1] == 1 || DS1302_time[1] == 3 || DS1302_time[1] == 5 ||
			DS1302_time[1] == 7 || DS1302_time[1] == 8 || DS1302_time[1] == 10 ||
			DS1302_time[1] == 12)
		{
			if(DS1302_time[2]>31) DS1302_time[2] = 1;
		}
		else if(DS1302_time[1] == 4 || DS1302_time[1] == 6 || DS1302_time[1] == 9 ||
			DS1302_time[1] == 11)
		{
			if(DS1302_time[2]>30) DS1302_time[2] = 1;
		}
		else if(DS1302_time[1] == 2)
		{
			if(DS1302_time[0] % 4 == 0)
			{
				if(DS1302_time[2]>29) DS1302_time[2] = 1;
			}
			else 
			{
				if(DS1302_time[2]>28) DS1302_time[2] = 1;
			}
		}
		if(DS1302_time[3]>23) DS1302_time[3] = 0;
		if(DS1302_time[4]>59) DS1302_time[4] = 0;
		if(DS1302_time[5]>59) DS1302_time[5] = 0;
		if(DS1302_time[6]>7) DS1302_time[6] = 1;
	}
	if(KeyNum == 33)
	{
		KeyNum = 0;
		DS1302_time[Timesetselect]--;
		if(DS1302_time[0] == 0) DS1302_time[0] = 99;
		if(DS1302_time[1] == 0) DS1302_time[1] = 12;
		if(DS1302_time[1] == 1 || DS1302_time[1] == 3 || DS1302_time[1] == 5 ||
			DS1302_time[1] == 7 || DS1302_time[1] == 8 || DS1302_time[1] == 10 ||
			DS1302_time[1] == 12)
		{
			if(DS1302_time[2] == 0) DS1302_time[2] = 31;
		}
		else if(DS1302_time[1] == 4 || DS1302_time[1] == 6 || DS1302_time[1] == 9 ||
			DS1302_time[1] == 11)
		{
			if(DS1302_time[2] == 0 || DS1302_time[2] > 30) DS1302_time[2] = 30;
		}
		else if(DS1302_time[1] == 2)
		{
			if(DS1302_time[0] % 4 == 0)
			{
				if(DS1302_time[2] == 0 || DS1302_time[2] > 29) DS1302_time[2] = 29;
				
			}
			else 
			{
				if(DS1302_time[2] == 0 || DS1302_time[2] > 28) DS1302_time[2] = 28;
			}
		}
		if(DS1302_time[3] < 0) DS1302_time[3] = 23;
		if(DS1302_time[4] < 0) DS1302_time[4] = 59;
		if(DS1302_time[5] < 0) DS1302_time[5] = 59;
		if(DS1302_time[6] < 0) DS1302_time[6] = 7;
	}
	if(Timesetselect == 0 && flag == 1) {LCD_ShowString(1, 5, "  ");}
	else {LCD_ShowNum(1, 5, DS1302_time[0], 2);}
	if(Timesetselect == 1 && flag == 1) {LCD_ShowString(1, 8, "  ");}
	else {LCD_ShowNum(1, 8, DS1302_time[1], 2);}
	if(Timesetselect == 2 && flag == 1) {LCD_ShowString(1, 11, "  ");}
	else {LCD_ShowNum(1, 11, DS1302_time[2], 2);}
	if(Timesetselect == 3 && flag == 1) {LCD_ShowString(2, 5, "  ");}
	else {LCD_ShowNum(2, 5, DS1302_time[3], 2);}
	if(Timesetselect == 4 && flag == 1) {LCD_ShowString(2, 8, "  ");}
	else {LCD_ShowNum(2, 8, DS1302_time[4], 2);}
	if(Timesetselect == 5 && flag == 1) {LCD_ShowString(2, 11, "  ");}
	else {LCD_ShowNum(2, 11, DS1302_time[5], 2);}
}

void Alarmshow(void) //闹钟钟显示功能
{
	alarm_time[0] = AT24C02_readbyte(0);
	alarm_time[1] = AT24C02_readbyte(1);
	alarm_time[2] = AT24C02_readbyte(2);
	alarm_time[3] = AT24C02_readbyte(3);
	LCD_ShowString(1, 1, "Alarm Clock:");
	LCD_ShowNum(2, 5, alarm_time[0], 2);
	LCD_ShowNum(2, 8, alarm_time[1], 2);
	LCD_ShowNum(2, 11, alarm_time[2], 2);
	if(alarm_time[3]) {LCD_ShowString(1, 14, "ON ");}
	else {LCD_ShowString(1, 14, "OFF");}
}

void Alarmsave(void) //闹钟存储功能
{
	AT24C02_writebyte(0,alarm_time[0]);
	Delay(5);
	AT24C02_writebyte(1,alarm_time[1]);
	Delay(5);
	AT24C02_writebyte(2,alarm_time[2]);
	Delay(5);
	AT24C02_writebyte(3,alarm_time[3]);
	Delay(5);
}

void Alarmset(void) //闹钟设置功能
{
	if(KeyNum == 2)
	{
		KeyNum = 0;
		Timesetselect++;
		Timesetselect %= 4; //越界清零
	}
	if(KeyNum == 3)
	{
		KeyNum = 0;
		alarm_time[Timesetselect]++;
		if(alarm_time[0] > 23) alarm_time[0] = 0;
		if(alarm_time[1] > 59) alarm_time[1] = 0;
		if(alarm_time[2] > 59) alarm_time[2] = 0;
		if(alarm_time[3] > 1) alarm_time[3] = 0;
	}
	if(KeyNum == 33)
	{
		KeyNum = 0;
		alarm_time[Timesetselect]--;
		if(alarm_time[0] < 0) alarm_time[0] = 23;
		if(alarm_time[1] < 0) alarm_time[1] = 59;
		if(alarm_time[2] < 0) alarm_time[2] = 59;
		if(alarm_time[3] < 0) alarm_time[3] = 1;
	}
	if(Timesetselect == 0 && flag == 1) {LCD_ShowString(2, 5, "  ");}
	else {LCD_ShowNum(2, 5, alarm_time[0], 2);}
	if(Timesetselect == 1 && flag == 1) {LCD_ShowString(2, 8, "  ");}
	else {LCD_ShowNum(2, 8, alarm_time[1], 2);}
	if(Timesetselect == 2 && flag == 1) {LCD_ShowString(2, 11, "  ");}
	else {LCD_ShowNum(2, 11, alarm_time[2], 2);}
	if(Timesetselect == 3 && flag == 1) {LCD_ShowString(1, 14, "   ");}
	else 
	{
		if(alarm_time[3]) {LCD_ShowString(1, 14, "ON ");}
		else {LCD_ShowString(1, 14, "OFF");}
	}
	saveflag = 1;
}

void AlarmCheck(void) //闹钟判断
{
	uchar i;
	if(DS1302_time[3] == alarm_time[0] && DS1302_time[4] == alarm_time[1] && DS1302_time[5] == alarm_time[2])
	{
		Alarmflag = 1;
		for(i=0;i<8;i++)
			UART_Sendbyte(end[i]);
		for(i=0;i<2;i++)
			UART_Sendbyte(back[i]);
	}
}

void Alarmbeep(void) //闹钟响铃
{
	while(KeyNum != 3 && KeyNum != 2)
	{
		Buzzer_time();
	}
	KeyNum = 0;
}

void Getupcheck(void) //起床检测
{
	if(HC_SR501) getupflag = 1;
	else getupflag = 0;
	if(KeyNum == 22)
	{
		KeyNum = 0;
		startflag = !startflag;
	}
}

void smartalarm(void) //智能闹铃功能
{
	if(startflag && warning && getupflag)
	{
		uchar i;
		for(i=0;i<8;i++)
			UART_Sendbyte(end[i]);
		for(i=0;i<2;i++)
			UART_Sendbyte(back[i]);
		Alarmbeep();
	}
}

void Uart_bluetooth(void)//蓝牙串口
{
	uchar i;
	if(dataGetBuff[1] == 0x20)       //设置闹钟
	{
		switch(dataGetBuff[2])
		{
			case 0x00:i = 0;break;
			case 0x01:i = 1;break;
			case 0x02:i = 2;break;
			case 0x03:i = 3;break;
		}
		if(dataGetBuff[3] == 0x00)
		{
			alarm_time[i] += 1;
			if(alarm_time[0] > 23) alarm_time[0] = 0;
			if(alarm_time[1] > 59) alarm_time[1] = 0;
			if(alarm_time[2] > 59) alarm_time[2] = 0;
			if(alarm_time[3] > 1) alarm_time[3] = 0;
		}
		else 
		{
			alarm_time[i] -= 1;
			if(alarm_time[0] < 0) alarm_time[0] = 23;
			if(alarm_time[1] < 0) alarm_time[1] = 59;
			if(alarm_time[2] < 0) alarm_time[2] = 59;
			if(alarm_time[3] < 0) alarm_time[3] = 1;
		}
		for(i=0;i<5;i++)
		{
			UART_Sendbyte(dataGetBuff[i]);
		}
		saveflag = 1;
	}
	else if(dataGetBuff[1] == 0x30)  //获取温湿度
	{
		if(dataGetBuff[2] == 0x00)
		{
			for(i=0;i<8;i++)
			{
				UART_Sendbyte(welcome[i]);
			}
		}
		if(dataGetBuff[3] == 0x00)
		{
			for(i=0;i<5;i++)
			{
				UART_Sendbyte(tempstr[i]);
			}
			UART_Sendbyte(DHT11_DATA[2]/10 + 0x30);
			UART_Sendbyte(DHT11_DATA[2]%10 + 0x30);
			UART_Sendbyte('.');
			UART_Sendbyte(DHT11_DATA[3]%10 + 0x30);
			for(i=0;i<2;i++)
			{
				UART_Sendbyte(back[i]);
			}
		}
		else 
		{
			for(i=0;i<5;i++)
			{
				UART_Sendbyte(humistr[i]);
			}
			UART_Sendbyte(DHT11_DATA[0]/10 + 0x30);
			UART_Sendbyte(DHT11_DATA[0]%10 + 0x30);
			UART_Sendbyte('.');
			UART_Sendbyte(DHT11_DATA[1]%10 + 0x30);
			for(i=0;i<2;i++)
			{
				UART_Sendbyte(back[i]);
			}
		}
	}
}

void Timebeep(void) // 整点报时
{
	if(DS1302_time[4] == 0 && DS1302_time[5] == 0)
	{
		Buzzer_time();
	}
}

void Tempget(void) //定期刷新温湿度,周期1s
{
	if(Tempflag)
	{
		TR0 = 0;
		DHT11_Readdata();
		TR0 = 1;
	}
}

void Tempshow()  // 温湿度显示
{
	LCD_ShowString(1, 1, "Temp: ");
	LCD_ShowString(2, 1, "Humi: ");
	
	LCD_ShowNum(1,7,DHT11_DATA[2],2);
	LCD_ShowChar(1,9,'.');
	LCD_ShowNum(1,10,DHT11_DATA[3],1);
	LCD_ShowString(1,11," C    ");
		
	LCD_ShowNum(2,7,DHT11_DATA[0],2);
	LCD_ShowChar(2,9,'.');
	LCD_ShowNum(2,10,DHT11_DATA[1],1);
	LCD_ShowString(2,11," %    ");
	
}
void timingshow(void) //倒计时显示
{
	LCD_ShowString(1, 1, "   --Timer--   ");
	LCD_ShowString(2,1,"    ");
	LCD_ShowString(2,13,"    ");
	LCD_ShowChar(2,7,':');
	LCD_ShowChar(2,10,':');
	LCD_ShowNum(2, 5, cal_time[0], 2);
	LCD_ShowNum(2, 8, cal_time[1], 2);
	LCD_ShowNum(2, 11, cal_time[2], 2);
}

void timing(void) //倒计时功能
{
	uchar i = 10;
	if(upflag && (cal_time[0] != 0 || cal_time[1] != 0 || cal_time[2] != 0))
	{
		upflag = 0;
		upflag_2 = 1;
		if(cal_time[2] == 0 && (cal_time[0] != 0 || cal_time[1] != 0))
		{
			cal_time[2] = 59;
			cal_time[1]--;
			if(cal_time[1] < 0 && cal_time[0] != 0)
			{
				cal_time[0]--;
				cal_time[1] = 59;
			}
		}
		cal_time[2]--;
	}
	while(cal_time[0]==0 && cal_time[1]==0 && cal_time[2]==0 && upflag_2)
	{	
		while(i--)
		{
			Buzzer_time();//蜂鸣器长响
		}
		upflag_2=0;
	}
}

更多详细的资料下载SJCFG/smart-alarm: 51单片机实现的智能蓝牙闹钟 (github.com)icon-default.png?t=MBR7https://github.com/SJCFG/smart-alarm

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值