基于51单片机的DS1302+LCD12864+DS18B20小综合Word下载.docx
- 文档编号:18783205
- 上传时间:2023-01-01
- 格式:DOCX
- 页数:28
- 大小:19.31KB
基于51单片机的DS1302+LCD12864+DS18B20小综合Word下载.docx
《基于51单片机的DS1302+LCD12864+DS18B20小综合Word下载.docx》由会员分享,可在线阅读,更多相关《基于51单片机的DS1302+LCD12864+DS18B20小综合Word下载.docx(28页珍藏版)》请在冰豆网上搜索。
ucharinit_18B20_fail;
sfrLCD_DATA=0x80;
sbitLCD_EN=P2^7;
sbitLCD_RS=P2^6;
sbitLCD_RW=P2^5;
sbitDS_CLK=P3^6;
sbitDS_RST=P3^5;
sbitDS_IO=P3^4;
sbitACC0=ACC^0;
sbitACC7=ACC^7;
sbitkey_1=P2^4;
sbitkey_2=P2^3;
sbitkey_3=P2^2;
sbitDQ=P3^7;
voiddelay_ms(uintms);
voiddelay_us(uintus);
bitbusy(void);
voidwrite_command(ucharcommand);
voidwrite_data(uchardat);
voidlcd_pos(ucharx,uchary);
voidLCD_init(void);
voidInput_1byte(ucharTD);
ucharOutput_1byte(void);
ucharRead_DS1302(ucharDS_ADD);
voidwrite_DS1302(ucharDS_ADD,ucharDS_DATE);
voidwrite_time(ucharaddr,ucharnum);
ucharBCD_to_Dec(ucharnum);
voidwrite_week(ucharnum);
voidwrite_date(ucharaddr,ucharnum);
ucharreadsecond(void);
ucharreadminute(void);
ucharreadhour(void);
ucharreadday(void);
ucharreadmonth(void);
ucharreadweek(void);
ucharreadyear(void);
voidreadtime(void);
voidDS1302_init(void);
voidkey_scan(void);
ucharDS18B20_read_byte(void);
voidDS18B20_write_byte(ucharbyte);
ucharDS18B20_Init(void);
uintread_temperature(void);
voidwrite_temp(uchartemp_h);
voidwrite_symbol(ucharaddr,ucharsymbol);
voiddisplay_18B20_err(void);
voidmain(void)
{
key_flag=0;
second=20;
minute=30;
hour=10;
day=31;
week=3;
month=12;
year=16;
LCD_init();
/*while
(1){
write_date(day_addr_pos,day);
write_date(mon_addr_pos,month);
write_date(yer_addr_pos,year);
write_time(sec_addr_pos,second);
write_time(min_addr_pos,minute);
write_time(hor_addr_pos,hour);
write_week(week);
}*/
if(!
(Read_DS1302(0x8E)&
0x80)){
DS1302_init();
}
while
(1){
key_scan();
if(key_flag==0){
second=Read_DS1302(0x81);
write_time(sec_addr_pos,BCD_to_Dec(second));
minute=Read_DS1302(0x83);
write_time(min_addr_pos,BCD_to_Dec(minute));
hour=Read_DS1302(0x85);
write_time(hor_addr_pos,BCD_to_Dec(hour));
week=Read_DS1302(0x8B);
write_week(week);
day=Read_DS1302(0x87);
write_date(day_addr_pos,BCD_to_Dec(day));
month=Read_DS1302(0x89);
write_date(mon_addr_pos,BCD_to_Dec(month));
year=Read_DS1302(0x8D);
write_date(yer_addr_pos,BCD_to_Dec(year));
readtime();
//读出十进制数,提供给按键进行数据的+/-的处理
temperature=read_temperature();
init_18B20_fail=DS18B20_Init();
if(init_18B20_fail==0){
//temperature=read_temperature();
if((temperature&
0x8000)==0x8000)//判断读取的温度是正温度还是负温度
{
symbol=0x2D;
//write_symbol(0x0A,0x2C);
//显示负号
temperature=~temperature+1;
//负温度时处理,原数取反再加1
}else{
symbol=0xfe;
//write_symbol(0x0A,0xfe);
//不显示正号
}
//write_symbol(0x0A,symbol);
DS18B20_H=(temperature>
>
4)&
0x7f;
//取温度读数的整数部分
DS18B20_L=temperature&
0x0f;
//取温度读数的小数部分
write_symbol(sbl_addr_pos,symbol);
write_temp(DS18B20_H);
}else{
display_18B20_err();
}
}
}
voiddelay_us(uintus)
while(us--);
voiddelay_ms(uintms)
uchari;
while(ms--){
for(i=250;
i>
0;
i--){
_nop_();
}
bitbusy(void)
bitresult;
LCD_RS=0;
LCD_RW=1;
LCD_EN=1;
result=(bit)(LCD_DATA&
0x80);
LCD_EN=0;
returnresult;
voidwrite_command(ucharcommand)
while(busy());
LCD_RW=0;
delay_us
(1);
LCD_DATA=command;
voidwrite_data(uchardat)
LCD_RS=1;
LCD_DATA=dat;
voidlcd_pos(ucharx,uchary)
ucharpos;
if(x==0){
x=0x80;
}elseif(x==1){
x=0x90;
}elseif(x==2){
x=0x88;
}elseif(x==3){
x=0x98;
pos=x+y;
write_command(pos);
voidLCD_init(void)
write_command(0x30);
delay_ms
(1);
write_command(0x0C);
write_command(0x01);
write_command(0x06);
write_command(first_line);
for(i=0;
i<
16;
i++){
write_data(line_one[i]);
write_command(second_line);
write_data(line_two[i]);
write_command(third_line);
write_data(line_three[i]);
voidInput_1byte(ucharTD)
ACC=TD;
for(i=8;
DS_IO=ACC0;
DS_CLK=1;
DS_CLK=0;
ACC=ACC>
1;
ucharOutput_1byte(void)
i--)
{
ACC=ACC>
ACC7=DS_IO;
DS_CLK=1;
DS_CLK=0;
return(ACC);
ucharRead_DS1302(ucharDS_ADD)
ucharDS_INF;
DS_RST=0;
DS_RST=1;
Input_1byte(DS_ADD);
DS_INF=Output_1byte();
return(DS_INF);
voidwrite_DS1302(ucharDS_ADD,ucharDS_DATE)
Input_1byte(DS_DATE);
voidDS1302_init(void)
second=57;
minute=59;
hour=23;
day=30;
month=3;
week=5;
write_DS1302(0x8E,0x00);
//NWP
write_DS1302(0x80,(second/10)<
<
4|(second%10));
write_DS1302(0x82,(minute/10)<
4|(minute%10));
write_DS1302(0x84,(hour/10)<
4|(hour%10));
write_DS1302(0x86,(day/10)<
4|(day%10));
write_DS1302(0x88,(month/10)<
4|(month%10));
write_DS1302(0x8A,(week/10)<
4|(week%10));
write_DS1302(0x8C,(year/10)<
4|(year%10));
write_DS1302(0x8E,0x01);
//WP
voidwrite_time(ucharaddr,ucharnum)
write_command(second_line+addr);
delay_ms(5);
write_data(0x30+num/10);
write_data(0x30+num%10);
ucharBCD_to_Dec(ucharnum)
ucharNUM_H,NUM_L,NUM;
NUM_H=num>
4;
NUM_L=num&
NUM=((NUM_H*10))+NUM_L;
returnNUM;
voidwrite_week(ucharnum)
switch(num){
case1:
write_command(third_line+wek_addr_pos);
for(i=0;
2;
write_data(str_wek[i]);
delay_ms(5);
break;
case2:
for(i=2;
case3:
for(i=4;
6;
case4:
for(i=6;
8;
case5:
for(i=8;
10;
case6:
for(i=10;
12;
case7:
for(i=12;
14;
voidwrite_date(ucharaddr,ucharnum)
write_command(first_line+addr);
/************************读出所有时间**********************/
voidreadtime(void)
readsecond();
readminute();
readhour();
readday();
readmonth();
readweek();
readyear();
/*****************读出秒的十进制数***************************/
ucharreadsecond(void)
uchardat;
dat=Read_DS1302(0x81);
second=((dat&
0x70)>
4)*10+(dat&
0x0f);
returnsecond;
/*****************读出分的十进制数***************************/
ucharreadminute(void)
dat=Read_DS1302(0x83);
minute=((dat&
returnminute;
/*****************读出小时的十进制数***************************/
ucharreadhour(void)
dat=Read_DS1302(0x85);
hour=((dat&
returnhour;
/*****************读出天的十进制数***************************/
ucharreadday(void)
dat=Read_DS1302(0x87);
day=((dat&
returnday;
/*****************读出月的十进制数***************************/
ucharreadmonth(void)
dat=Read_DS1302(0x89);
month=((dat&
returnmonth;
/*****************读出周的十进制数***************************/
ucharreadweek(void)
dat=Read_DS1302(0x8b);
week=((dat&
returnweek;
/*****************读出年的十进制数***************************/
ucharreadyear(void)
dat=Read_DS1302(0x8d);
year=((dat&
0xf0)>
returnyear;
voidkey_scan(void)
if(key_1==0){
delay_ms(5);
if(key_1==0){
while(!
key_1);
mode_cnt++;
key_flag=1;
write_DS1302(0x8E,0x00);
write_DS1302(0x80,0x80);
write_DS1302(0x8E,0x80);
if(mode_cnt==8){
key_flag=0;
mode_cnt=0;
write_command(0x0C);
write_DS1302(0x8E,0x00);
write_DS1302(0x80,0x00);
write_DS1302(0x80,(second/10)<
write_DS1302(0x82,(minute/10)<
write_DS1302(0x84,(hour/10)<
write_DS1302(0x86,(day/10)<
write_DS1302(0x88,(month/10)<
write_DS1302(0x8A,(week/10)<
write_DS1302(0x8C,(year/10)<
//write_DS1302(0x80,0x00);
write_DS1302(0x8E,0x80);
switch(mode_cnt){
case7:
write_
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 51 单片机 DS1302 LCD12864 DS18B20 综合