基于LCD1602DS1302DS18B20的程序设计Word格式.docx

上传人:b****2 文档编号:4812290 上传时间:2023-05-04 格式:DOCX 页数:19 大小:18.36KB
下载 相关 举报
基于LCD1602DS1302DS18B20的程序设计Word格式.docx_第1页
第1页 / 共19页
基于LCD1602DS1302DS18B20的程序设计Word格式.docx_第2页
第2页 / 共19页
基于LCD1602DS1302DS18B20的程序设计Word格式.docx_第3页
第3页 / 共19页
基于LCD1602DS1302DS18B20的程序设计Word格式.docx_第4页
第4页 / 共19页
基于LCD1602DS1302DS18B20的程序设计Word格式.docx_第5页
第5页 / 共19页
基于LCD1602DS1302DS18B20的程序设计Word格式.docx_第6页
第6页 / 共19页
基于LCD1602DS1302DS18B20的程序设计Word格式.docx_第7页
第7页 / 共19页
基于LCD1602DS1302DS18B20的程序设计Word格式.docx_第8页
第8页 / 共19页
基于LCD1602DS1302DS18B20的程序设计Word格式.docx_第9页
第9页 / 共19页
基于LCD1602DS1302DS18B20的程序设计Word格式.docx_第10页
第10页 / 共19页
基于LCD1602DS1302DS18B20的程序设计Word格式.docx_第11页
第11页 / 共19页
基于LCD1602DS1302DS18B20的程序设计Word格式.docx_第12页
第12页 / 共19页
基于LCD1602DS1302DS18B20的程序设计Word格式.docx_第13页
第13页 / 共19页
基于LCD1602DS1302DS18B20的程序设计Word格式.docx_第14页
第14页 / 共19页
基于LCD1602DS1302DS18B20的程序设计Word格式.docx_第15页
第15页 / 共19页
基于LCD1602DS1302DS18B20的程序设计Word格式.docx_第16页
第16页 / 共19页
基于LCD1602DS1302DS18B20的程序设计Word格式.docx_第17页
第17页 / 共19页
基于LCD1602DS1302DS18B20的程序设计Word格式.docx_第18页
第18页 / 共19页
基于LCD1602DS1302DS18B20的程序设计Word格式.docx_第19页
第19页 / 共19页
亲,该文档总共19页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

基于LCD1602DS1302DS18B20的程序设计Word格式.docx

《基于LCD1602DS1302DS18B20的程序设计Word格式.docx》由会员分享,可在线阅读,更多相关《基于LCD1602DS1302DS18B20的程序设计Word格式.docx(19页珍藏版)》请在冰点文库上搜索。

基于LCD1602DS1302DS18B20的程序设计Word格式.docx

voidmain()

ISP_CONTR=0X40;

lcd_init();

setime();

//设置时间,设置一次就需屏蔽,若还需设置,则可以开启

while

(1)

{

keyscan();

//键盘扫描,用于调时

if(flag==0)

{

read();

//读取DS1302中数据,是十六进制

ds1302display();

//在液晶上显示,是十进制

ds18b20_display();

}

}

//=================================各定义=================================

#defineucharunsignedchar

#defineuintunsignedint

sfrISP_CONTR=0XE7;

/************液晶定义****************/

sbiten=P2^7;

sbitrw=P2^6;

sbitrs=P2^5;

/************DS1302定义****************/

sbitds1302_clk=P1^6;

sbitds1302_io=P3^5;

sbitds1302_rst=P1^7;

sbits0=P2^4;

//调时,按一下光标闪烁,再按一下就向左跳动一格,按下最后一次就开始计时

sbits1=P2^3;

//按一下加一

sbits2=P2^2;

//按一下减一

sbitalarm=P2^1;

//闹钟

ucharclock[]={11,1,4,2,14,50,30};

//初始化年月日时分秒//星期//年,月,日,星期,时,分,秒地址

uchar*week="

MonTueWedThuFriSatSun"

;

//只用于字符串

ucharaddress[]={0x8c,0x88,0x86,0x8a,0x84,0x82,0x80};

charflag,fen,shi,nian,yue,ri,xingqi,miao;

/*************DS18B20定义********************/

sbitds18b20=P2^0;

voiddelay1ms(uintz)

ucharx;

uinty;

for(x=110;

x>

0;

x--)

for(y=z;

y>

y--);

voiddelayus(uchart)

while(t--);

//=========================LCD1602显示头文件==========================

voidwrite_lcdcom(ucharcom)

en=0;

rw=0;

rs=0;

P0=com;

delay1ms

(1);

en=1;

rs=1;

voidwrite_lcddate(uchardate)

P0=date;

//================================DS18B20程序================================

voidds18b20reset()

ds18b20=1;

//先将总先释放

delayus(8);

ds18b20=0;

//至少480us复位脉冲

delayus(80);

//拉高总线准备接受存在脉冲

delayus(35);

voidwrite_ds18b20(uchardate)

uchari;

//ds18b20=1;

for(i=0;

i<

8;

i++)

{

ds18b20=0;

delayus

(1);

//延时大约10us

ds18b20=date&

0x01;

delayus(3);

//延时大约45us

ds18b20=1;

//释放总线

date>

>

=1;

delayus(0);

ucharread_ds18b20()

uchari,date;

//释放总线

if(ds18b20)

date=date|0x80;

//延时大约45us

}

returndate;

intread_ds18b20_date()

ucharLdate,Mdate;

inttemperation;

ds18b20reset();

//复位脉冲

write_ds18b20(0xcc);

//跳过读ROM

write_ds18b20(0x44);

//实现温度转换

//等待至少500us

write_ds18b20(0xbe);

//读取RAM中的数据

Ldate=read_ds18b20();

//读取温度的低8位

Mdate=read_ds18b20();

//读取温度的高8位

temperation=Mdate;

temperation=temperation<

<

temperation=temperation|Ldate;

temperation=temperation*0.625;

//求出温度

returntemperation;

voidds18b20_display()

inttemper;

ucharflag18,bai18,shi18,ge18,fen18;

temper=read_ds18b20_date();

if(temper<

0)

temper=~temper+1;

flag18=0x2d;

else

flag18=0x20;

bai18=temper/1000;

shi18=temper/100%10+0x30;

ge18=temper/10%10+0x30;

fen18=temper%10+0x30;

if(bai18==0)

bai18=0x20;

bai18=0x30+bai18;

write_lcdcom(0xc8);

write_lcddate(flag18);

write_lcddate(bai18);

write_lcddate(shi18);

write_lcddate(ge18);

write_lcdcom(0xcd);

write_lcddate(fen18);

}

//=================================DS1302头文件============================

voidwrite_ds1302byte(uchardate)//写字节

ds1302_clk=0;

ds1302_io=date&

ds1302_clk=1;

date=date>

1;

voidwrite_ds1302(ucharaddr,uchardate)//写数据,如需写入数据到1302里面,则还需要对保护寄存器进行设置

ds1302_rst=0;

_nop_();

ds1302_clk=0;

ds1302_rst=1;

write_ds1302byte(addr);

write_ds1302byte(date);

ds1302_io=1;

ucharread_ds1302(ucharaddr)//读数据

uchari,temp;

temp=temp>

if(ds1302_io)

temp=temp|0x80;

returntemp;

//得出的是BCD码,如十进制的24表示成BCD码就是00100100,切记BCD码是用四位二进制表示一位数,且范围是0~9,如果把十进制24转换为BCD码就是24/16为十位,24%16为个位

}//切记如果把24/10,24%10那么现在转换出来的十位和个位就是十进制的

uchardth(uchardate)//十进制转十六进制,用于调时及时间的初始化

ucharshi,ge;

shi=date/10;

ge=date%10;

date=shi*16+ge;

voidsetime()//初始化时间

uchari,*addre,*clk;

addre=address;

//使指针addre指向address的首地址

clk=clock;

//使指针clk指向clock的首地址

write_ds1302(0x8e,0x00);

//退出写保护

7;

i++,addre++,clk++)

write_ds1302(*addre,dth(*clk));

//年月日星期时分秒

write_ds1302(0x8e,0x80);

//写保护

voidwrite_sfm(ucharaddr,uchardate)//得出时间的十六进制,将其装换为十进制并显示在液晶上

shi=date/16;

ge=date%16;

write_lcdcom(addr);

write_lcddate(0x30+shi);

write_lcddate(0x30+ge);

voidread()

nian=read_ds1302(0x8d);

yue=read_ds1302(0x89);

ri=read_ds1302(0x87);

shi=read_ds1302(0x85);

fen=read_ds1302(0x83);

miao=read_ds1302(0x81);

xingqi=read_ds1302(0x8b);

voidds1302display()//总显示

ucharday,i;

write_sfm(0x82,nian);

//年

write_sfm(0x85,yue);

//月

write_sfm(0x88,ri);

//日

write_sfm(0x8b,xingqi);

//星期

write_sfm(0xc0,shi);

//时

write_sfm(0xc3,fen);

//分

write_sfm(0xc6,miao);

//秒

day=read_ds1302(0x8b)%16;

//求出星期对应的十进制

day=day*4;

write_lcdcom(0x80+13);

3;

i++,day++)//星期字符

{

write_lcddate((*(week+day)));

if((shi==6)&

&

(fen==0)&

(miao<

=3))

alarm=0;

delay1ms(50);

alarm=1;

}

}

/********************调时系列函数***********************/

ucharhtd(uchardate)//用于调时时将读取出来的十六进制的时分秒转换为十进制,使其以十进制加减进行调时

date=shi*10+ge;

/***********在调时过程中,使十进制数据在液晶上显示*************/

voiddecimal(ucharaddr,uchardate)

/*******************changetime***********************/

voidkeyscan()

{

if(s0==0)

delay1ms(5);

if(s0==0)

{

while(!

s0);

flag++;

}

if(flag==1)//分

write_lcdcom(0xc4);

write_lcdcom(0x0f);

fen=htd(fen);

//十六进制转换为十进制

}

if(flag==2)//时

write_lcdcom(0xc1);

shi=htd(shi);

if(flag==3)//星期

write_lcdcom(0x8c);

xingqi=htd(xingqi);

if(flag==4)//日

write_lcdcom(0x89);

ri=htd(ri);

if(flag==5)//月

write_lcdcom(0x86);

yue=htd(yue);

if(flag==6)

flag=0;

write_lcdcom(0x0c);

write_ds1302(0x8e,0x00);

//退出写保护

write_ds1302(0x82,dth(fen));

//调时后的时分秒年月日,decimalturntohex

write_ds1302(0x84,dth(shi));

write_ds1302(0x8a,dth(xingqi));

write_ds1302(0x86,dth(ri));

write_ds1302(0x88,dth(yue));

write_ds1302(0x8e,0x80);

//退出写保护

if(flag!

=0)

if(s1==0)

delay1ms(5);

if(s1==0)//写分

{

while(!

s1);

if(flag==1)

{

fen++;

if(fen==60)

fen=0;

decimal(0xc3,fen);

write_lcdcom(0xc4);

}

if(flag==2)

{

shi++;

if(shi==24)

shi=0;

decimal(0xc0,shi);

write_lcdcom(0xc1);

if(flag==3)

xingqi++;

if(xingqi==8)

xingqi=1;

decimal(0x8b,xingqi);

write_lcdcom(0x8c);

if(flag==4)

ri++;

if(ri==31)

ri=1;

decimal(0x88,ri);

write_lcdcom(0x89);

if(flag==5)

yue++;

if(yue==13)

yue=1;

decimal(0x85,yue);

write_lcdcom(0x86);

}

if(s2==0)

if(s2==0)

{

s2);

fen--;

if(fen==-1)//分可以为0

fen=59;

shi--;

if(shi==-1)

shi=23;

xingqi--;

//星期不可以为0

if(xingqi==0)

xingqi=7;

ri--;

if(ri==0)//日不可以为0

ri=30;

yue--;

//月不可以为0

if(yue==0)

yue=12;

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

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2