基于单片机的定时闹钟设计报告Word下载.docx
《基于单片机的定时闹钟设计报告Word下载.docx》由会员分享,可在线阅读,更多相关《基于单片机的定时闹钟设计报告Word下载.docx(25页珍藏版)》请在冰豆网上搜索。
![基于单片机的定时闹钟设计报告Word下载.docx](https://file1.bdocx.com/fileroot1/2023-1/14/665a37c9-b1b3-4953-bc14-7fe2491ec627/665a37c9-b1b3-4953-bc14-7fe2491ec6271.gif)
VCC
电源地
9
D2
双向数据口
2
VDD
电源正极
10
D3
3
VL
对比度调节
11
D4
4
RS
数据/命令选择
12
D5
5
R/W
读/写选择
13
D6
6
E
模块使能端
14
D7
7
D0
15
BLK
背光源地
8
D1
16
BLA
背光源正极
D4-D7作为四位数据分两次传送。
这样的话可以节省MCU的I/O口资源。
VDD:
电源正极,4.5-5.5V,通常使用5V电压;
VL:
LCD对比度调节端,电压调节范围为0-5V。
接正电源时对比度最弱,接地电源时对比度最高,但对比度过高时会产生“鬼影”,因此通常使用一个10K的电位器来调整对比度或者直接串接一个电阻到地;
RS:
MCU写入数据或者指令选择端。
MCU要写入指令时,使RS为低电平;
MCU要写入数据时,使RS为高电平;
R/W:
读写控制端。
R/W为高电平时,读取数据;
R/W为低电平时,写入数据;
E:
LCD模块使能信号控制端。
写数据时,需要下降沿触发模块。
D0-D7:
8位数据总线,三态双向。
如果MCU的I/O口资源紧张的话,该模块也可以只使用4位数据线D4-D7接口传送数据。
本充电器就是采用4位数据传送方式;
BLA:
LED背光正极。
需要背光时,BLA串接一个限流电阻接VDD,BLK接地,实测该模块的背光电流为50mA左右;
BLK:
LED背光地端。
3、按键电路
本实验用4个按键来调节设置时间,和闹钟,一个复位开关来复位程序,按下为低电平,松手时按键自动弹起,为高电平,来给单片机指令。
4、总电路图
四、软件实现
1、本LCD电子闹钟的的主程序流程图如图所示:
初始化
主程序开始
扫描按键
设置响铃方式
显示闹钟时间
设置闹钟时间
设置当前时间
显示时间
是否到闹钟时间
N
Y
响铃,打开被控电器
4键是否按下
关闭闹铃
按下复位键
2、定时闹钟程序
#include<
reg52.h>
//reg52.h是AT89C52的头文件
#defineuintunsignedint
#defineucharunsignedchar
ucharcodetable[]="
NOWTIME:
"
;
ucharcodetable1[]="
SETNOWTIME:
ucharcodetable2[]="
SETALARMTIME:
ucharcodealarm[]="
ALARMTIME:
ucharcodealarmoff[]="
OFF"
ucharcodealarmon[]="
ON"
sbitlcden=P2^4;
sbitlcdrs=P2^2;
sbitlcdrw=P2^3;
sbitK1=P1^0;
sbitK2=P1^1;
sbitK3=P1^2;
sbitK4=P1^3;
sbitbeep=P1^4;
sbitDianQi=P1^5;
sbitL1=P2^5;
ucharflag,num,count,k1num,k2num,k3num,k4num;
charmiao,shi,fen,ashi,afen;
uchari;
ucharflag1=0;
voiddelay(uintz)//延时函数
{
uintx,y;
for(x=z;
x>
0;
x--)
for(y=100;
y>
y--);
}
voiddi()//蜂鸣器子程序
beep=1;
delay(100);
beep=0;
voidwrite_com(ucharcom)//写命令函数
lcdrs=0;
lcdrw=0;
lcden=0;
P0=com;
delay(5);
lcden=1;
voidwrite_date(uchardate)//写数据函数
lcdrs=1;
P0=date;
voidwrite_sfm(ucharadd,uchardate)//写时间函数
ucharshi,ge;
shi=date/10;
ge=date%10;
write_com(0x80+0x40+add);
write_date(0x30+shi);
write_date(0x30+ge);
voidTimeInit()//显示时间初始化
write_com(0x01);
write_com(0x80);
for(num=0;
num<
9;
num++)
{
write_date(table[num]);
delay(5);
}
write_com(0x80+0x40+6);
write_date('
:
'
);
write_com(0x80+0x40+9);
write_sfm(4,shi);
write_com(0x80+0x40+4);
write_sfm(7,fen);
write_com(0x80+0x40+7);
write_sfm(10,miao);
write_com(0x80+0x40+10);
voidSetNowTime()//设置当前时间
if(K1==0)
if(K1==0)
{
while(!
K1);
di();
shi++;
if(shi==24)
shi=0;
write_sfm(4,shi);
write_com(0x80+0x40+4);
}
if(K2==0)
if(K2==0)
K2);
fen++;
if(fen==60)
fen=0;
write_sfm(7,fen);
write_com(0x80+0x40+7);
if(K3==0)
if(K3==0)
K3);
k1num=0;
TR0=1;
TimeInit();
}
voidSetAlarmTime()//设置闹钟时间函数
flag=0;
ashi++;
if(ashi==24)
ashi=0;
write_sfm(4,ashi);
afen++;
if(afen==60)
afen=0;
write_sfm(7,afen);
k3num=0;
EA=1;
flag=1;
voidDisplayAlarmTime()//显示闹钟函数
{
11;
write_date(alarm[num]);
write_sfm(4,ashi);
write_sfm(7,afen);
voidkeyscan()//键盘扫描函数
TR0=0;
k1num++;
if(k1num!
=0)//如果1键按下
write_com(0x80);
for(num=0;
13;
num++)//显示SetNowTime
write_date(table1[num]);
delay(5);
SetNowTime();
//进入SetnowTime函数
else
if(K2==0)
{
while(!
di();
k2num++;
}
if(k2num==1)//如果2键按下,则显示进入
显示当前时间函数
EA=0;
DisplayAlarmTime();
k2num=2;
if(k2num==3)
k2num=0;
else
if(K3==0)
delay(5);
if(K3==0)
{
while(!
di();
k3num++;
write_com(0x01);
}
if(k3num==1)//如果3键按下
EA=0;
write_com(0x80);
for(num=0;
15;
num++)//显示SetAlarmTime
write_date(table2[num]);
delay(5);
write_com(0x80+0x40+6);
//在第二行显示时间格式
write_date('
write_sfm(4,ashi);
write_com(0x80+0x40+4);
write_sfm(7,afen);
write_com(0x80+0x40+7);
SetAlarmTime();
//进入SetAlarmtimeha函数
else
if(K4==0)//设置闹钟模式,有三种模式,不响,
一秒响一声,一秒响三声
if(K4==0)
{
while(!
K4);
k4num++;
}
if(k4num==1)//不响
flag=0;
k4num=2;
if(k4num==3)//一秒响一声
{
beep=1;
delay(500);
beep=0;
flag=1;
flag1=0;
k4num=4;
if(k4num==5)
k4num=0;
//一秒响三声
flag=1;
flag1=1;
beep=1;
delay(100);
beep=0;
}
if(flag==1&
&
shi==ashi&
fen==afen)
{
DianQi=1;
delay(100);
if(flag1==1)
{
//蜂鸣器一秒连续响三声
delay(500);
if(K4==0&
flag==1)//检测4键是否被按下,按下则跳
出,蜂鸣器停止发声
if(K4==0&
flag==1)
while(K4=!
flag=0;
k4num=0;
if(flag1==0)
beep=!
beep;
//蜂鸣器长一秒响一声
flag==1)//检测4键是否按下,按下则跳出,
蜂鸣器停止发声
flag=0;
}
voidinit()//lcd1602初始化
beep=0;
DianQi=0;
shi=0;
fen=0;
miao=0;
ashi=0;
afen=0;
count=0;
k1num=0;
write_com(0x38);
//设置16X2显示,5X7点阵,8位数据接口
write_com(0x0c);
//设置开显示,不显示光标
write_com(0x06);
//写一个字符后地址指针加1
//显示清0,数据指针清0
TimeInit();
TMOD=0x01;
TH0=(65536-41665)/256;
TL0=(65536-41665)%256;
EA=1;
ET0=1;
TR0=1;
voidmain()//主函数
DianQi=0;
init();
while
(1)
keyscan();
voidtimer0()interrupt1//中断服务子程序
TH0=(65536-41667)/256;
TL0=(65536-41667)%256;
count++;
if(count==10)
L1=~L1;
if(count==20)
count=0;
miao++;
if(miao==60)
miao=0;
shi++;
if(shi==24)
shi=0;
write_sfm(4,shi);
write_sfm(10,miao);
五、调试过程和设计效果
按下3键,进入SetAlarmTime函数,设置闹钟时间
按下2键,进入DisplayAlarmTime函数,显示闹钟时间
按下1键,进入SetNowTime函数,设置当前时间
到闹钟时间,蜂鸣器想起,打开被控家电(这里用灯泡表示)
关闭闹钟,被控电器也处于打开状态,考虑到实际需求(比如说闹钟订到下午6:
00打开电灯,关闭闹钟后电灯也是打开状态),闹钟一直响谁也受不了,电器却需要一直工作。
我在继电器前加了一个自锁开关,这样就能控制电器是否启动。
实物图
六、元器件表和成本核算
元件名称
使用数量
市场价格(网络)
STC89C52RC
4.35元
LCD1602
5.30元
继电器
1.05元
按键
0.05元
33PF电容
23元/袋(1000个)
10K电阻
0.08元
1K电阻
0.02元
10u电解电容
0.4元
连接短线
若干
10M晶振
0.2元
灯泡
0.5元
电位器
0.3元
三极管
0.07元
蜂鸣器
0.26元
自锁开关
万用板
0.28元
总价格:
13.59元
附哈尔滨工程大学电子系统设计(单片机)课程设计验收表