基于单片机的定时闹钟设计报告Word下载.docx

上传人:b****5 文档编号:20050726 上传时间:2023-01-16 格式:DOCX 页数:25 大小:210.81KB
下载 相关 举报
基于单片机的定时闹钟设计报告Word下载.docx_第1页
第1页 / 共25页
基于单片机的定时闹钟设计报告Word下载.docx_第2页
第2页 / 共25页
基于单片机的定时闹钟设计报告Word下载.docx_第3页
第3页 / 共25页
基于单片机的定时闹钟设计报告Word下载.docx_第4页
第4页 / 共25页
基于单片机的定时闹钟设计报告Word下载.docx_第5页
第5页 / 共25页
点击查看更多>>
下载资源
资源描述

基于单片机的定时闹钟设计报告Word下载.docx

《基于单片机的定时闹钟设计报告Word下载.docx》由会员分享,可在线阅读,更多相关《基于单片机的定时闹钟设计报告Word下载.docx(25页珍藏版)》请在冰豆网上搜索。

基于单片机的定时闹钟设计报告Word下载.docx

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元

附哈尔滨工程大学电子系统设计(单片机)课程设计验收表

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 外语学习 > 英语考试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1