基于LCD1602DS1302DS18B20的程序设计Word格式.docx
- 文档编号:4812290
- 上传时间:2023-05-04
- 格式:DOCX
- 页数:19
- 大小:18.36KB
基于LCD1602DS1302DS18B20的程序设计Word格式.docx
《基于LCD1602DS1302DS18B20的程序设计Word格式.docx》由会员分享,可在线阅读,更多相关《基于LCD1602DS1302DS18B20的程序设计Word格式.docx(19页珍藏版)》请在冰点文库上搜索。
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;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 LCD1602DS1302DS18B20 程序设计