利用单片机完成多功能电子钟的设计,多功能电子钟由51单片机控制,采用矩阵按键对电子表进行控制,可进行闹钟设定、时间矫正。闹钟时间一到,以蜂鸣器发声、LED发光的形式提示。用DHT11测量温度和湿度,通过51单片机收集并处理数据,通过LCD1602液晶屏显示时间和温湿度。
设计基本要求:
(1)能准确计时,以数字形式显示时、分、秒。
(2)小时以24小时计时形式,分秒计时为60进位。
(3)采用矩阵按键对电子表进行控制,可进行闹钟设定、控制及时间设定。
(4)闹钟功能:可任意设定闹钟时间,一旦走时到该时间,能以蜂鸣器发声、LED发光的形式提示。
(5)用测量并显示温度和湿度。
(6)显示方式采用LCD1602液晶屏。
硬件选择
单片机选择
单片机采用AT89C51,对于多功能电子钟来说AT89C51的硬件资源足够应付。而且AT89C51单片机出现早,网上资料多,同时具有:资源丰富,指令简单,电路简单,构造简洁,硬件设计方便。所以采用这款单片机。
温湿度传感器选择
温湿度传感器采用DHT11,DHT11是一款有已校准数字信号输出的温湿度传感器。 其精度湿度+-5%RH, 温度+-2℃,量程湿度20-90%RH, 温度0~50℃。能满足日常需求。
显示屏选择
显示屏采用LCD1602液晶屏,LCD1602是一种专门用来显示字母、数字、符号等的点阵型液晶模块,它同时具有耗电少,体积小,辐射低,能显示32个字符等优点,显示时钟足够满足要求。
输入按键的选择
用多个按钮组成矩阵键盘。
软件设计
时间设置、闹钟设置和温度显示是智能电子钟的几个核心功能,用户们可以按实际需求来调整和使用。
时间设置是闹钟程序中的核心,它可以用户设置所需的时间,例如小时和分钟。并且存储在单片机内部,用户可以按实际需求任意更改和查看。
闹钟设置是另一个重要的功能,它允许用户设置闹钟。如果设置闹钟,程序将在设定时间响铃提醒用户。
温湿度显示是一个额外的功能,它可以帮助用户监测周围环境的温度。在这个模块中,程序从传感器获取环境温度,并将其显示在lcd显示器上。这个功能可以帮助用户了解周围环境的温度湿度。
总之,时间设置、闹钟设置和温度显示是闹钟应用程序中的三个核心功能,用户可以根据需要和喜好选择在单片机中调用在屏幕中显示它们。
系统电路设计
软件代码
#include <REGX51.H>
#include <LCD1602.H>
#include <Alarm.h>
#include <key.h>
#include <dht11.h>
#define uchar unsigned char //宏定义,用uchar代替unsigned char
#define uint unsigned int //宏定义,用uint代替unsigned int
uchar s=0,min=0,hour=0; //时间全局变量
uchar alarmstatus=0,set_h=0,set_m=0,set_s=0; //闹钟状态标志位 0等待时间 1到设定时间 闹钟时间全局变量
uchar setup_s=0,setup_m=0,setup_h=0; //设置时间全局变量
uchar settimestatus=0; //闹钟状态标志 0正常 1设置时间 2设置闹钟
char Humi,Temp; //温湿度变量
void delayms(uint ms); //延时
void main(void)
{
char a=-1;
init_alarm(); //初始化闹钟
P1=0x00;
while(1)
{
if(settimestatus>0) settimedisplay(); //显示设置时间
KeyDown(); //键盘扫描
if(settimestatus==0) //在设置时间、闹钟不读取dht11
{
if((s-a)>0)
{
a=s;
DHT11_receive(); //dht11读取数据
HumiTempDisplay(Humi,Temp); //显示读取到的数据
if(a==59) a=-1;
}
}
}
}
void delayms(uint ms) //1ms延时函数
{
uchar i;
while(ms--)
for(i=0;i<100;i++);
}
#include <Alarm.h>
#include <REGX51.H>
#include <LCD1602.h>
sbit RLED=P2^7;
sbit beep=P3^2;
static int temp=0;
void init_alarm(void) //时钟初始
{
lcd_init(); //lcd1603初始化
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TMOD=0x01; //定时器初始化
EA = 1; //中断总开关
ET0 = 1; //t0中断开关
TR0 = 1; //开始计数
RLED=0;
beep=0;
}
void alarmrun(void) //闹钟运行
{
if(hour==set_h&&min==set_m&&s==set_s) //时间判断
alarmstatus=200; //闹钟状态 闪烁时间alarmstatus=Tx50ms
if(alarmstatus>0) //判断闹钟是否在响
{
RLED=~RLED; //LED闪烁
beep=~beep; //蜂鸣器叫
alarmstatus--;
}
else
{
RLED=0;
beep=0;
}
}
void timerun(void) //时间运行
{
temp++;
if(temp>20)
{
s++;
temp=0;
}
if(s>59) //判断是否满足进位
{
min++;
s=0;
}
if(min>59) //判断是否满足进位
{
hour++;
min=0;
}
if(hour>23) //判断是否满足进位
{
hour=0;
}
if(settimestatus==0)
timedisplay(); //时间显示函数
}
void t0Intr() interrupt 1 //计时中断
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
timerun();
alarmrun();
}