基于AT89C+1602+DS1302+DS18B20的电子时钟带按键调整Word文档下载推荐.docx

上传人:b****5 文档编号:20289630 上传时间:2023-01-21 格式:DOCX 页数:22 大小:21.98KB
下载 相关 举报
基于AT89C+1602+DS1302+DS18B20的电子时钟带按键调整Word文档下载推荐.docx_第1页
第1页 / 共22页
基于AT89C+1602+DS1302+DS18B20的电子时钟带按键调整Word文档下载推荐.docx_第2页
第2页 / 共22页
基于AT89C+1602+DS1302+DS18B20的电子时钟带按键调整Word文档下载推荐.docx_第3页
第3页 / 共22页
基于AT89C+1602+DS1302+DS18B20的电子时钟带按键调整Word文档下载推荐.docx_第4页
第4页 / 共22页
基于AT89C+1602+DS1302+DS18B20的电子时钟带按键调整Word文档下载推荐.docx_第5页
第5页 / 共22页
点击查看更多>>
下载资源
资源描述

基于AT89C+1602+DS1302+DS18B20的电子时钟带按键调整Word文档下载推荐.docx

《基于AT89C+1602+DS1302+DS18B20的电子时钟带按键调整Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《基于AT89C+1602+DS1302+DS18B20的电子时钟带按键调整Word文档下载推荐.docx(22页珍藏版)》请在冰豆网上搜索。

基于AT89C+1602+DS1302+DS18B20的电子时钟带按键调整Word文档下载推荐.docx

//DS1302片选

sbitDIO=P3^1;

//DS1302数据信号

sbitSCLK=P3^0;

//DS1302时钟信号

sbitkey0=P3^2;

//功能键

sbitkey1=P3^3;

//增大键

sbitkey2=P3^4;

//减小键

sbitbeep=P1^0;

//蜂鸣器

sbitACC7=ACC^7;

sbitACC0=ACC^0;

unsignedcharREAD_1302(unsignedcharaddr);

charhour,minute,second,week,day,month,year,tem;

unsignedcharnum,flag,count,wendu;

unsignedcharstr1[]="

20--"

;

unsignedcharstr2[]="

:

"

voiddelay(unsignedcharz);

voidINITIAL_1302();

voidWRITE_1302(unsignedcharaddr,unsignedchardate);

voidLCD_WRITE_COM(unsignedcharcom);

voidLCD_WRITE_DATA(unsignedchardate);

voidLCD_WRITE_SFM(unsignedcharaddr,unsignedchardate);

voidLCD_WRITE_NYR(unsignedcharaddr,unsignedchardate);

voidLCD_WRITE_WEEK(unsignedcharweek);

voidLCD_INITIAL();

voidkeyscan();

voidINITIAL_TEMER0();

voidw1602c(ucharcom);

voidw1602d(uchardata01);

voidwrite_temp(ucharadd,uchardate);

voidmain()

{

LCD_INITIAL();

//液晶初始化

INITIAL_1302();

//DS1302初始化

INITIAL_TEMER0();

//定时器初始化

beep=0;

//蜂鸣器长响一次

delay(1000);

beep=1;

while

(1)

{

keyscan();

//按键扫描

if(flag==0)//当标志位为0,允许读取DS1302数据,将数据送入液晶显示

second=READ_1302(0x81);

LCD_WRITE_SFM(8,second);

minute=READ_1302(0x83);

LCD_WRITE_SFM(5,minute);

hour=READ_1302(0x85);

LCD_WRITE_SFM(2,hour);

week=READ_1302(0x8b);

LCD_WRITE_WEEK(week);

day=READ_1302(0x87);

LCD_WRITE_NYR(9,day);

month=READ_1302(0x89);

LCD_WRITE_NYR(6,month);

year=READ_1302(0x8d);

LCD_WRITE_NYR(3,year);

wendu=ReadTemperature();

//将18b2头文件运行返回的函数结果送到变量wendu中,用于显示

write_temp(11,wendu);

//显示温度,从第二行第12个字符后开始显示

}

}

/**********************1602部份************************************/

voiddelay(unsignedcharz)//1602de延时函数

unsignedcharx,y;

for(x=z;

x>

0;

x--)

for(y=110;

y>

y--);

voidLCD_WRITE_COM(unsignedcharcom)//1602四线控制,将数据高四位和低四位分两次写入

LCD_RS=0;

LCD_E=1;

delay

(1);

P1=(P1&

0x0f)|(com&

0xf0);

//将com的高四位送到P1的高四位,并保持P1的低四位不变

delay

(2);

LCD_E=0;

delay(5);

com<

<

=4;

//将com的原低四位移到高四位,准备送到P1的高四位

voidLCD_WRITE_DATA(unsignedchardate)

LCD_RS=1;

0x0f)|(date&

date<

voidLCD_WRITE_SFM(unsignedcharaddr,unsignedchardate)

unsignedcharshi,ge;

shi=date/10;

ge=date%10;

LCD_WRITE_COM(0x80+0x40+addr);

LCD_WRITE_DATA(0x30+shi);

LCD_WRITE_DATA(0x30+ge);

voidLCD_WRITE_NYR(unsignedcharaddr,unsignedchardate)

charshi,ge;

LCD_WRITE_COM(0x80+addr);

voidLCD_WRITE_WEEK(unsignedcharweek)

LCD_WRITE_COM(0x80+12);

switch(week)

case1:

LCD_WRITE_DATA('

M'

);

delay(5);

O'

LCD_WRITE_DATA('

N'

1'

break;

case2:

T'

U'

E'

2'

case3:

W'

D'

3'

case4:

H'

4'

case5:

F'

R'

I'

5'

case6:

S'

A'

6'

case7:

7'

voidLCD_INITIAL()

unsignedchari;

LCD_WRITE_COM(0x28);

//0x28=00101000,将液晶设置为16*2显示,5*7点阵,4位数据口

//显示方式设置

LCD_WRITE_COM(0x0c);

//设置开显示,不显光标

LCD_WRITE_COM(0x06);

//默认(0x06)写入新数据后光标右移屏幕不移动

LCD_WRITE_COM(0x01);

//显示清0,数据指针清0

LCD_WRITE_COM(0x80);

for(i=0;

i<

16;

i++)

LCD_WRITE_DATA(str1[i]);

LCD_WRITE_COM(0x80+0x40);

//液晶第二行显示

9;

LCD_WRITE_DATA(str2[i]);

/***************************1302部分*****************************************/

 

voidWRITE_1302(unsignedcharaddr,unsignedchardate)

RST=0;

SCLK=0;

RST=1;

for(i=8;

i>

i--)

SCLK=0;

ACC=addr;

DIO=ACC0;

addr>

>

=1;

SCLK=1;

ACC=date;

date>

unsignedcharREAD_1302(unsignedcharaddr)

unsignedchari,date1,date2;

ACC7=DIO;

ACC>

date1=ACC;

date2=date1/16;

date1=date1%16;

date1=date1+date2*10;

return(date1);

voidINITIAL_1302()

WRITE_1302(WRITE_SECOND,READ_1302(READ_SECOND)&

0x7f);

//启动DS1302

/**************************键盘扫描部分***********************************/

voidkeyscan()

if(key0==0)//确认功能键按下

delay(20);

if(key0==0)//去抖

{beep=0;

delay(200);

while(!

key0);

//释放

num++;

switch(num)

flag=1;

//修改时间,禁止从DS1302读数据

TR0=0;

//定时器关

LCD_WRITE_COM(0x0f);

//光标开始闪烁

LCD_WRITE_COM(0x80+3);

//第一次按下,光标定位到年位置

break;

case2:

LCD_WRITE_COM(0x80+6);

//第二次按下,光标定位到月位置

break;

case3:

LCD_WRITE_COM(0x80+9);

//第三次按下,光标定位到日位置

case4:

//第四次按下,光标定位到星期位置

case5:

LCD_WRITE_COM(0x80+0x40+2);

//第五次按下,光标定位到时位置

case6:

LCD_WRITE_COM(0x80+0x40+5);

//第六次按下,光标定位到分位置

case7:

LCD_WRITE_COM(0x80+0x40+8);

//第七次按下,光标定位到秒位置

break;

case8:

num=0;

//第八次按下,记录清零

LCD_WRITE_COM(0x0c);

//不显示光标

WRITE_1302(WRITE_PROTECT,0x00);

//允许写操作

WRITE_1302(0x80,(second/10*16)+second%10);

//将调节后的秒写入DS1302

WRITE_1302(0x82,(minute/10*16)+minute%10);

//将调节后的分写入DS1302

WRITE_1302(0x84,(hour/10*16)+hour%10);

//将调节后的时写入DS1302

WRITE_1302(0x8a,(week/10*16)+week%10);

//将调节后的星期写入DS1302

WRITE_1302(0x86,(day/10*16)+day%10);

//将调节后的日写入DS1302

WRITE_1302(0x88,(month/10*16)+month%10);

//将调节后的月写入DS1302

WRITE_1302(0x8c,(year/10*16)+year%10);

//将调节后的年写入DS1302

WRITE_1302(WRITE_PROTECT,0x80);

//开写保护

flag=0;

//时间修改完毕,允许液晶从DS1302读数据

TR0=1;

}

if(num!

=0)

if(key1==0)//确认增大键按下

if(key1==0)//增大键确实按下

{

beep=0;

while(!

key1);

switch(num)

{

case1:

year++;

//调节年

if(year==100)year=0;

LCD_WRITE_NYR(3,year);

//将调节后的年送入液晶显示

LCD_WRITE_COM(0x80+3);

//光标回到指定处

break;

case2:

month++;

//调节月

if(month==13)month=0;

LCD_WRITE_NYR(6,month);

//将调节后的月送入液晶显示

LCD_WRITE_COM(0x80+6);

case3:

day++;

//调节日

if(day==32)day=0;

LCD_WRITE_NYR(9,day);

//将调节后的日送入液晶显示

LCD_WRITE_COM(0x80+9);

case4:

week++;

if(week==8)week=0;

LCD_WRITE_WEEK(week);

//将调节后的星期送入液晶显示

LCD_WRITE_COM(0x80+12);

case5:

hour++;

if(hour==24)hour=0;

LCD_WRITE_SFM(2,hour);

//将调节后的小时送入液晶显示

LCD_WRITE_COM(0x80+0x40+2);

case6:

minute++;

if(minute==60)minute=0;

LCD_WRITE_SFM(5,minute);

//将调节后的分送入液晶显示

LCD_WRITE_COM(0x80+0x40+5);

case7:

second++;

if(second==60)second=0;

LCD_WRITE_SFM(8,second);

//将调节后的秒送入液晶显示

LCD_WRITE_COM(0x80+0x40+8);

default:

}

}

if(key2==0)//确认减小键按下

if(key2==0)//减小键确实按下

key2);

year--;

if(year==-1)year=99;

LCD_WRITE_NYR(3,year);

LCD_WRITE_COM(0x80+3);

month--;

if(month==-1)month=12;

LCD_WRITE_NYR(6,month);

LCD_WRITE_COM(0x80+6);

day--;

if(day==-1)day=31;

LCD_WRITE_NYR(9,day);

LCD_WRITE_COM(0x80+9);

week--;

//调节星期

if(week==0)week=7;

LCD_WRITE_WEEK(week);

LCD_WRITE_COM(0x80+12);

hour--;

//调节时

if(hour==-1)hour=23;

LCD_WRITE_SFM(2,hour);

LCD_WRITE_COM(0x80+0x40+2);

minute--;

//调节分

if(minute==-1)minute=59;

LCD_WRITE_SFM(5,minute);

LCD_WRITE_COM(0x80+0x40+5);

second--;

//调节秒

if(second==-1)second=59;

LCD_WRITE_SFM(8,second);

LCD_WRITE_COM(0x80+0x40+8);

default:

}

/*********

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

当前位置:首页 > 工作范文 > 演讲主持

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

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