51单片机实现基于DS1302160218B20的多功能电子时钟带测温功能文档格式.docx
- 文档编号:21040010
- 上传时间:2023-01-27
- 格式:DOCX
- 页数:17
- 大小:18.25KB
51单片机实现基于DS1302160218B20的多功能电子时钟带测温功能文档格式.docx
《51单片机实现基于DS1302160218B20的多功能电子时钟带测温功能文档格式.docx》由会员分享,可在线阅读,更多相关《51单片机实现基于DS1302160218B20的多功能电子时钟带测温功能文档格式.docx(17页珍藏版)》请在冰豆网上搜索。
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();
//18b20
//18b20
//18b20
//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>
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;
P0=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'
break;
case2:
T'
U'
E'
case3:
W'
D'
case4:
H'
case5:
F'
R'
I'
case6:
S'
A'
case7:
voidLCD_WRITE_TEMP(ucharaddr,uchartemp)
shi=temp/10;
ge=temp%10;
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]);
LCD_WRITE_COM(0x80+0x40);
//液晶第二行显示
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)//去抖
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+4);
//第五次按下,光标定位到时位置
case6:
LCD_WRITE_COM(0x80+0x40+7);
//第六次按下,光标定位到分位置
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;
}
if(num!
=0)
if(key1==0)//确认增大键按下
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);
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(4,hour);
//将调节后的小时送入液晶显示
LCD_WRITE_COM(0x80+0x40+4);
case6:
minute++;
if(minute==60)minute=0;
LCD_WRITE_SFM(7,minute);
//将调节后的分送入液晶显示
LCD_WRITE_COM(0x80+0x40+7);
case7:
second++;
if(second==60)second=0;
LCD_WRITE_SFM(10,second);
//将调节后的秒送入液晶显示
LCD_WRITE_COM(0x80+0x40+10);
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(4,hour);
LCD_WRITE_COM(0x80+0x40+4);
minute--;
//调节分
if(minute==-1)minute=59;
LCD_WRITE_SFM(7,minute);
LCD_WRITE_COM(0x80+0x40+7);
second--;
//调节秒
if(second==-1)second=59;
LCD_WRITE_SFM(10,second);
LCD_WRITE_COM(0x80+0x40+10);
default:
}
/*******************************蜂鸣器部分******************************************/
/*-----------定时器0初始化-------------------------*/
voidINITIAL_TEMER0()
TMOD=0x01;
TH0=(65536-20000)/256;
TL0=(65536-20000)%256;
//晶振频率12MHZ定时20ms作右
TR0=1;
EA=1;
ET0=1;
/*-------------------------------------------*/
voidtimer0()interrupt1
//重装
count++;
if(count==50)//1秒到
count=0;
beep=0;
//蜂鸣器响
beep=1;
//蜂鸣器灭
if(tem>
=30)
beep=0;
}
}
/*****************************18b20部分*********************************************888*/
voiddelay3(uintus)
uints;
for(s=0;
s<
us;
s++);
ucharresert(void)
ucharready;
DQ=0;
delay
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 51 单片机 实现 基于 DS1302160218B20 多功能 电子 时钟 测温 功能