51单片机实现基于DS1302160218B20的多功能电子时钟带测温功能.docx

上传人:b****5 文档编号:7905549 上传时间:2023-01-27 格式:DOCX 页数:17 大小:18.25KB
下载 相关 举报
51单片机实现基于DS1302160218B20的多功能电子时钟带测温功能.docx_第1页
第1页 / 共17页
51单片机实现基于DS1302160218B20的多功能电子时钟带测温功能.docx_第2页
第2页 / 共17页
51单片机实现基于DS1302160218B20的多功能电子时钟带测温功能.docx_第3页
第3页 / 共17页
51单片机实现基于DS1302160218B20的多功能电子时钟带测温功能.docx_第4页
第4页 / 共17页
51单片机实现基于DS1302160218B20的多功能电子时钟带测温功能.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

51单片机实现基于DS1302160218B20的多功能电子时钟带测温功能.docx

《51单片机实现基于DS1302160218B20的多功能电子时钟带测温功能.docx》由会员分享,可在线阅读,更多相关《51单片机实现基于DS1302160218B20的多功能电子时钟带测温功能.docx(17页珍藏版)》请在冰豆网上搜索。

51单片机实现基于DS1302160218B20的多功能电子时钟带测温功能.docx

51单片机实现基于DS1302160218B20的多功能电子时钟带测温功能

#include

#defineucharunsignedchar

#defineuintunsignedint

/*------------------寄存器地址定义------------*/

#defineWRITE_SECOND0x80

#defineWRITE_MINUTE0x82

#defineWRITE_HOUR0x84

#defineWRITE_DAY0x86

#defineWRITE_MONTH0x88

#defineWRITE_YEAR0x8C

#defineWRITE_PROTECT0x8E

#defineWRITE_WEEK0x8A

#defineWRITE_CURRENT0x90

#defineREAD_SECOND0x81

#defineREAD_MINUTE0x83

#defineREAD_HOUR0x85

#defineREAD_DAY0x87

#defineREAD_MONTH0x89

#defineREAD_WEEK0x8B

#defineREAD_YEAR0x8D

sbitRST=P3^5;//DS1302片选

sbitDIO=P3^4;//DS1302数据信号

sbitSCLK=P3^6;//DS1302时钟信号

sbitACC7=ACC^7;

sbitACC0=ACC^0;

unsignedcharcount;

sbitbeep=P1^4;

voidINITIAL_1302();

unsignedcharREAD_1302(unsignedcharaddr);

voidWRITE_1302(unsignedcharaddr,unsignedchardate);

sbitLCD_E=P2^7;//液晶使能端

sbitLCD_RS=P2^6;//液晶数据命令选择端

sbitLCD_RW=P2^5;//液晶读写选择端

sbitkey0=P3^2;//功能键

sbitkey1=P3^3;//增大键

sbitkey2=P3^4;//减小键

sbitDQ=P3^7;//18b20温度输入输出端

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

unsignedcharnum,flag;

unsignedcharstr1[]="20--";

unsignedcharstr2[]=":

:

C";

voiddelay(unsignedcharz);

voidLCD_WRITE_COM(unsignedcharcom);

voidLCD_WRITE_DATA(unsignedchardate);

voidLCD_WRITE_SFM(unsignedcharaddr,unsignedchardate);

voidLCD_WRITE_NYR(unsignedcharaddr,unsignedchardate);

voidLCD_WRITE_WEEK(unsignedcharweek);

voidLCD_INITIAL();

voidLCD_WRITE_TEMP(ucharaddr,uchartemp);

voidkeyscan();

voidINITIAL_TEMER0();

ucharTMPH,TMPL;

voidw1602c(ucharcom);

voidw1602d(uchardata01);

voiddelay2(uintms);

voiddelay3(uintus);

ucharresert(void);

ucharread_byte();

voidwrite_byte(ucharval);

uintget_temp();

voiddisplay();

voiddelay3(uintus);//18b20

ucharresert(void);//18b20

ucharread_byte();//18b20

voidwrite_byte(ucharval);//18b20

uintget_temp();//18b20

voidmain()

{

LCD_INITIAL();//液晶初始化

INITIAL_1302();//DS1302初始化

INITIAL_TEMER0();//定时器初始化

while

(1)

{

keyscan();//按键扫描

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

{

second=READ_1302(0x81);

LCD_WRITE_SFM(10,second);

minute=READ_1302(0x83);

LCD_WRITE_SFM(7,minute);

hour=READ_1302(0x85);

LCD_WRITE_SFM(4,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);

tem=get_temp();

LCD_WRITE_TEMP(13,tem);

}

}

}

/**********************1602BU份******************************************************/

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

{

unsignedcharx,y;

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

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

}

voidLCD_WRITE_COM(unsignedcharcom)

{

LCD_RS=0;

LCD_RW=0;

LCD_E=1;

P0=com;

delay(5);

LCD_E=0;

}

voidLCD_WRITE_DATA(unsignedchardate)

{

LCD_RS=1;

LCD_RW=0;

LCD_E=1;

P0=date;

delay(5);

LCD_E=0;

}

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;

shi=date/10;

ge=date%10;

LCD_WRITE_COM(0x80+addr);

LCD_WRITE_DATA(0x30+shi);

LCD_WRITE_DATA(0x30+ge);

}

voidLCD_WRITE_WEEK(unsignedcharweek)

{

LCD_WRITE_COM(0x80+12);

switch(week)

{

case1:

LCD_WRITE_DATA('M');delay(5);

LCD_WRITE_DATA('O');delay(5);;

LCD_WRITE_DATA('N');break;

case2:

LCD_WRITE_DATA('T');delay(5);

LCD_WRITE_DATA('U');delay(5);

LCD_WRITE_DATA('E');break;

case3:

LCD_WRITE_DATA('W');delay(5);

LCD_WRITE_DATA('E');delay(5);

LCD_WRITE_DATA('D');break;

case4:

LCD_WRITE_DATA('T');delay(5);

LCD_WRITE_DATA('H');delay(5);

LCD_WRITE_DATA('U');break;

case5:

LCD_WRITE_DATA('F');delay(5);

LCD_WRITE_DATA('R');delay(5);

LCD_WRITE_DATA('I');break;

case6:

LCD_WRITE_DATA('S');delay(5);

LCD_WRITE_DATA('A');delay(5);

LCD_WRITE_DATA('T');break;

case7:

LCD_WRITE_DATA('S');delay(5);

LCD_WRITE_DATA('U');delay(5);

LCD_WRITE_DATA('N');break;

}

}

voidLCD_WRITE_TEMP(ucharaddr,uchartemp)

{

charshi,ge;

shi=temp/10;

ge=temp%10;

LCD_WRITE_COM(0x80+0x40+addr);

LCD_WRITE_DATA(0x30+shi);

LCD_WRITE_DATA(0x30+ge);

}

voidLCD_INITIAL()

{

unsignedchari;

LCD_WRITE_COM(0x38);

LCD_WRITE_COM(0x0c);

LCD_WRITE_COM(0x06);//经本人试验证明1602初始化不清屏也可实现

LCD_WRITE_COM(0x80);

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

{

LCD_WRITE_DATA(str1[i]);

delay(5);

}

LCD_WRITE_COM(0x80+0x40);//液晶第二行显示

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

{

LCD_WRITE_DATA(str2[i]);

delay(5);

}

}

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

voidWRITE_1302(unsignedcharaddr,unsignedchardate)

{

unsignedchari;

RST=0;

SCLK=0;

RST=1;

for(i=8;i>0;i--)

{

SCLK=0;

ACC=addr;

DIO=ACC0;

addr>>=1;

SCLK=1;

}

for(i=8;i>0;i--)

{

SCLK=0;

ACC=date;

DIO=ACC0;

date>>=1;

SCLK=1;

}

RST=0;

}

unsignedcharREAD_1302(unsignedcharaddr)

{

unsignedchari,date1,date2;

RST=0;

SCLK=0;

RST=1;

for(i=8;i>0;i--)

{

SCLK=0;

ACC=addr;

DIO=ACC0;

addr>>=1;

SCLK=1;

}

for(i=8;i>0;i--)

{

ACC7=DIO;

SCLK=1;

ACC>>=1;

SCLK=0;

}

RST=0;

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)//去抖

{

while(!

key0);//释放

num++;

switch(num)

{

case1:

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);//第三次按下,光标定位到日位置

break;

case4:

LCD_WRITE_COM(0x80+12);//第四次按下,光标定位到星期位置

break;

case5:

LCD_WRITE_COM(0x80+0x40+4);//第五次按下,光标定位到时位置

break;

case6:

LCD_WRITE_COM(0x80+0x40+7);//第六次按下,光标定位到分位置

break;

case7:

LCD_WRITE_COM(0x80+0x40+10);//第七次按下,光标定位到秒位置

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;

break;

}

}

}

if(num!

=0)

{

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

{

delay(20);

if(key1==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);//光标回到指定处

break;

case3:

day++;//调节日

if(day==32)day=0;

LCD_WRITE_NYR(9,day);//将调节后的日送入液晶显示

LCD_WRITE_COM(0x80+9);//光标回到指定处

break;

case4:

week++;

if(week==8)week=0;

LCD_WRITE_WEEK(week);//将调节后的星期送入液晶显示

LCD_WRITE_COM(0x80+12);//光标回到指定处

break;

case5:

hour++;

if(hour==24)hour=0;

LCD_WRITE_SFM(4,hour);//将调节后的小时送入液晶显示

LCD_WRITE_COM(0x80+0x40+4);//光标回到指定处

break;

case6:

minute++;

if(minute==60)minute=0;

LCD_WRITE_SFM(7,minute);//将调节后的分送入液晶显示

LCD_WRITE_COM(0x80+0x40+7);//光标回到指定处

break;

case7:

second++;

if(second==60)second=0;

LCD_WRITE_SFM(10,second);//将调节后的秒送入液晶显示

LCD_WRITE_COM(0x80+0x40+10);//光标回到指定处

break;

default:

break;

}

}

}

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

{

delay(20);

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

{

while(!

key2);

switch(num)

{

case1:

year--;//调节年

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

LCD_WRITE_NYR(3,year);

LCD_WRITE_COM(0x80+3);

break;

case2:

month--;//调节月

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

LCD_WRITE_NYR(6,month);

LCD_WRITE_COM(0x80+6);

break;

case3:

day--;//调节日

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

LCD_WRITE_NYR(9,day);

LCD_WRITE_COM(0x80+9);

break;

case4:

week--;//调节星期

if(week==0)week=7;

LCD_WRITE_WEEK(week);

LCD_WRITE_COM(0x80+12);

break;

case5:

hour--;//调节时

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

LCD_WRITE_SFM(4,hour);

LCD_WRITE_COM(0x80+0x40+4);

break;

case6:

minute--;//调节分

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

LCD_WRITE_SFM(7,minute);

LCD_WRITE_COM(0x80+0x40+7);

break;

case7:

second--;//调节秒

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

LCD_WRITE_SFM(10,second);

LCD_WRITE_COM(0x80+0x40+10);

break;

default:

break;

}

}

}

}

}

/*******************************蜂鸣器部分******************************************/

/*-----------定时器0初始化-------------------------*/

voidINITIAL_TEMER0()

{

TMOD=0x01;

TH0=(65536-20000)/256;

TL0=(65536-20000)%256;//晶振频率12MHZ定时20ms作右

TR0=1;

EA=1;

ET0=1;

}

/*-------------------------------------------*/

voidtimer0()interrupt1

{

TH0=(65536-20000)/256;

TL0=(65536-20000)%256;//重装

count++;

if(count==50)//1秒到

{

count=0;

beep=0;//蜂鸣器响

delay(5);

beep=1;//蜂鸣器灭

}

if(tem>=30)

{

beep=0;

}

}

/*****************************18b20部分*********************************************888*/

voiddelay3(uintus)

{

uints;

for(s=0;s

}

ucharresert(void)

{

ucharready;

DQ=0;

delay

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

当前位置:首页 > PPT模板 > 节日庆典

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

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