带温度的LCD1602电子时钟设计.docx

上传人:b****4 文档编号:2966482 上传时间:2022-11-16 格式:DOCX 页数:29 大小:613.54KB
下载 相关 举报
带温度的LCD1602电子时钟设计.docx_第1页
第1页 / 共29页
带温度的LCD1602电子时钟设计.docx_第2页
第2页 / 共29页
带温度的LCD1602电子时钟设计.docx_第3页
第3页 / 共29页
带温度的LCD1602电子时钟设计.docx_第4页
第4页 / 共29页
带温度的LCD1602电子时钟设计.docx_第5页
第5页 / 共29页
点击查看更多>>
下载资源
资源描述

带温度的LCD1602电子时钟设计.docx

《带温度的LCD1602电子时钟设计.docx》由会员分享,可在线阅读,更多相关《带温度的LCD1602电子时钟设计.docx(29页珍藏版)》请在冰豆网上搜索。

带温度的LCD1602电子时钟设计.docx

带温度的LCD1602电子时钟设计

带温度的LCD1602电子时钟设计实验

信息科学与工程学院

专业:

信息管理与信息系统1班

姓名:

张茹帆学号:

201142597

姓名:

任师师学号:

201142595

 

带温度的LCD1602电子时钟设计

一、实验目的

学习利用AT89C52进行任务设计,练习使用52单片机内部的定时器进行计时。

学习ds1302时钟芯片和ds18b20温度传感器的使用。

学习用模块化编程进行较长程序的编写。

二、实验要求

(1)利用lcd1602液晶显示屏作为显示模块,用AT89C52进行控制,用ds18b02测量显示即时温度,温度报警,用ds1302时钟芯片为单片机提供时间数据。

具有定时功能。

(2)要求时间和定时时间可调,并且在闹铃报时的时候可以用按键进行关闭。

并且可以用按键关闭打开定时功能。

(3)利用keiluVision4编译软件进行编译。

(4)完成实验要求,写出实验报告。

三、软件环境

Proteus仿真软件,keiluVision4编译软件

四、工作现象

本时钟具有显示年月日时分秒星期、温度和温度报警的功能。

实验用时钟芯片ds1302来提供秒、分、时、星期、日期、月份和年份的数据,显示部分采用液晶显示模块lcd1602,右上方显示星期,左下角显示温度,右下角显示闹铃的开关状态。

用温度传感器ds18b20来测量温度。

另外,闹铃用D1(LED-RED)来报时,用D2(LED-RED)做温度报警发声器,闹钟开启用D3来显示。

具体各部分功能及操作下面将做介绍:

ds1302给单片机at89c52提供年、月、日、时、分、秒、星期,ds18b20采集温度的数据,经单片机的处理送到液晶显示屏lcd1602上显示,实验设置的报警温度为30*c,由于程序有点长,已达到52单片机内存的极限,所以没加调整报警温度的功能,并且在修正时间的过程中只能加,不能减。

现在开始介绍具体的操作步骤:

key1为调整时间和日期的按键,按下key1键,lcd1602上的光标按时分星期日月年的顺序进行移动,光标所到处按key3键可以调整相应的数据信息。

Key2键是闹钟调整键,本实验只提供了设置时间来调整闹钟,不设计年月日和星期,按下key2键,光标在时分之间切换,光标所到处按key3调整相应数据。

Key3键用来开关闹钟,当闹铃开启时,lcd1602的右下角会出现“ON”的字样,同时发光二极管D3点亮当闹铃关闭时,lcd1602右下角则出现“OF”的字样。

Key4来关闭正在报时的闹钟,即闹钟响是按key4可关闭闹铃。

 

五、实验电路图

六、程序流程图

 

主程序流程图图

定时闪烁

S2按下

定分闪烁

S2按下

S3按下

时调节

S3按下

分调节

定时数据写入

LCD1602

调分数据写入

LCD1602

进入主程序

调时数据写入

LCD1602

S2按下

定时流程图

时闪烁

S1按下

分闪烁

S1按下

星期闪烁

S3按下

时调节

S3按下

分调节

时数据写入

Ds1302

分数据写入

Ds1302

S3按下

S3按下

S1按下

时间调节流程图

1、delay延时函数的.h函数:

#ifndef__DELAY_H__

#define__DELAY_H__

#defineuintunsignedint

#defineucharunsignedchar

voidlcddelay(uintz);

voidds18b20delay(uintt);

voidmsdelay(uintz);

#endif

Delay函数的.c函数:

#include"delay.h"

voidlcddelay(uintt)

{

uintj,x;

for(x=t;x>0;x--)

for(j=19;j>0;j--);

}

voidds18b20delay(uintt)

{

while(t--);

}

voidmsdelay(uintz)

{

uintx,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

2、液晶lcd1602的.h函数:

#ifndef__LCD1602_H__

#define__LCD1602_H__

#include

#defineuintunsignedint

#defineucharunsignedchar

sbitrs=P2^0;

sbitrw=P2^1;

sbite=P2^2;

voidlcdxcom(ucharcom);

voidlcdinit();

voidlcdxshuju(uchardat);

voidlcdx_time(ucharadd,uchardate);

voidlcdx_day(ucharadd,uchardate);

#endif

液晶lcd1602的.c函数:

#include

#include"lcd1602.h"

#include"delay.h"

#include"ds1302.h"

voidlcdxcom(ucharcom)

{

e=0;

rs=0;

rw=0;

P0=com;

lcddelay(10);//500us

e=1;

lcddelay(20);

e=0;

}

voidlcdinit()

{

lcddelay(300);

lcdxcom(0x38);

lcddelay(100);

lcdxcom(0x38);

lcddelay(100);

lcdxcom(0x38);

lcdxcom(0x38);

lcdxcom(0x08);

lcdxcom(0x01);

七、程序代码:

lcdxcom(0x06);

lcdxcom(0x0c);

}

voidlcdxshuju(uchardat)

{

e=0;

rs=0;

rs=1;

rw=0;

P0=dat;

lcddelay(10);

e=1;

lcddelay(20);

e=0;

}

voidlcdx_time(ucharadd,uchardate)//写时分秒函数

{

ucharshi,ge;

shi=date/10;

ge=date%10;

lcdxcom(0x80+0x40+add);//设置显示位置

lcdxshuju(0x30+shi);//送去液晶显示十位

lcdxshuju(0x30+ge);//显示各位

lcdxcom(0x0c);//设置开始显示,不显示光标

}

voidlcdx_day(ucharadd,uchardate)//写时分秒函数

{

ucharshi,ge;

shi=date/10;

ge=date%10;

lcdxcom(0x80+add);//设置显示位置

lcdxshuju(0x30+shi);//送去液晶显示十位

lcdxshuju(0x30+ge);//显示各位

lcdxcom(0x0c);//设置开始显示,不显示光标

}

3、时钟芯片ds1302的.h函数:

#ifndef__DS1302_H__

#define__DS1302_H__

#include

#defineuintunsignedint

#defineucharunsignedchar

staticunsignedcharshi,fen.miao,day;

staticunsignedcharyue,week,nian;

staticucharm,f,s,t,y,n,x;

staticuchardshi=0,dfen=0,dmiao=0;

staticucharb=0;

sbitsck=P1^0;

sbitio=P1^1;

sbitrst=P1^2;

sbitkey1=P3^4;

sbitkey2=P3^5;

sbitkey3=P3^6;

sbitkey4=P3^7;

sbitkey5=P3^3;

sbitp=P1^5;

sbita=P1^3;

voidpd(void);

voidzhuan(void);

voidwr_ds1302byte(uchardat);

voidwr_ds1302(ucharadd,uchardat);

ucharr_ds1302(ucharadd);

voidsetds1302(void);

voidds1302r_time(void);

ucharpanduan(ucharyue,uintnian);

voidkeyscan(void);

voidsetbeep(void);

voidnaozhong(void);

voidockey(void);

#endif

时钟芯片ds1302的.c函数:

#include"ds1302.h"

#include

#include"delay.h"

#include"lcd1602.h"

uchartimedata[]={10,6,12,31,23,

59,50};//年周月日时分秒

ucharxiedizhi[]={0x8c,0x8a,0x88,

0x86,0x84,0x82,0x80};//写地址数组

uchardudizhi[]={0x8d,0x8b,0x89,

0x87,0x85,0x83,0x81};//读地址数组

 

 

uchartable3[]="ONF";

voidwr_ds1302byte(uchardat)//写一个字节的数据

{

uchari;

for(i=0;i<8;i++)

{

sck=0;

io=dat&0x01;

dat>>=1;

sck=1;

}

}

voidwr_ds1302(ucharadd,uchardat)//写数据

{

rst=0;

_nop_();

sck=0;

_nop_();

rst=1;

_nop_();

wr_ds1302byte(add);

wr_ds1302byte(dat);

rst=0;

_nop_();

io=1;

sck=1;

}

ucharr_ds1302(ucharadd)

{

uchari,value;

rst=0;

_nop_();

sck=0;

_nop_();

rst=1;

_nop_();

wr_ds1302byte(add);

for(i=0;i<8;i++)

{

value>>=1;

sck=0;

if(io)

value=value|0x80;

sck=1;

}

rst=0;

_nop_();

sck=0;

_nop_();

sck=1;

io=1;

returnvalue;

}

voidsetds1302(void)

{

uchari,j;

for(i=0;i<8;i++)

{

j=timedata[i]/10;

timedata[i]=timedata[i]%10;

ti

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

当前位置:首页 > 医药卫生 > 基础医学

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

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