基于LCD1602DS1302DS18B20的程序设计.docx
- 文档编号:18215235
- 上传时间:2023-04-24
- 格式:DOCX
- 页数:19
- 大小:18.36KB
基于LCD1602DS1302DS18B20的程序设计.docx
《基于LCD1602DS1302DS18B20的程序设计.docx》由会员分享,可在线阅读,更多相关《基于LCD1602DS1302DS18B20的程序设计.docx(19页珍藏版)》请在冰豆网上搜索。
基于LCD1602DS1302DS18B20的程序设计
//=====================================.c文件===============================
#include
#include
#include"define.h"
#include"LCD1602.h"
#include"DS1302.h"
#include"ds18b20.h"
voidlcd_init()
{
write_lcdcom(0x38);
write_lcdcom(0x8c);
write_lcdcom(0x06);
write_lcdcom(0x01);
/***************时间分割符*****************/
write_lcdcom(0x80);//年20
write_lcddate(0x32);
write_lcddate(0x30);
write_lcdcom(0x84);//年月分隔符
write_lcddate(0x2d);
write_lcdcom(0x87);
write_lcddate(0x2d);//月日分隔符
write_lcdcom(0xc2);
write_lcddate(0x3a);//时分点分隔符
write_lcdcom(0xc5);
write_lcddate(0x3a);//分秒点分隔符
/***************温度分隔符*****************/
write_lcdcom(0xcc);
write_lcddate(0x2e);//温度小数点
write_lcdcom(0xce);//温度符号
write_lcddate(0xdf);
write_lcddate(0x43);
}
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>0;y--);
}
voiddelayus(uchart)
{
while(t--);
}
//=========================LCD1602显示头文件==========================
voidwrite_lcdcom(ucharcom)
{
en=0;
rw=0;
rs=0;
P0=com;
delay1ms
(1);
en=1;
delay1ms
(1);
en=0;
rs=1;
}
voidwrite_lcddate(uchardate)
{
en=0;
rw=0;
rs=1;
P0=date;
delay1ms
(1);
en=1;
delay1ms
(1);
en=0;
rs=0;
}
//================================DS18B20程序================================
voidds18b20reset()
{
ds18b20=1;//先将总先释放
delayus(8);
ds18b20=0;//至少480us复位脉冲
delayus(80);
ds18b20=1;//拉高总线准备接受存在脉冲
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;
for(i=0;i<8;i++)
{
ds18b20=0;//释放总线
date>>=1;
ds18b20=1;
if(ds18b20)
date=date|0x80;
delayus(3);//延时大约45us
}
returndate;
}
intread_ds18b20_date()
{
ucharLdate,Mdate;
inttemperation;
ds18b20reset();//复位脉冲
write_ds18b20(0xcc);//跳过读ROM
write_ds18b20(0x44);//实现温度转换
delayus(80);//等待至少500us
ds18b20reset();
write_ds18b20(0xcc);
write_ds18b20(0xbe);//读取RAM中的数据
Ldate=read_ds18b20();//读取温度的低8位
Mdate=read_ds18b20();//读取温度的高8位
temperation=Mdate;
temperation=temperation<<8;
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;
else
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)//写字节
{
uchari;
for(i=0;i<8;i++)
{
ds1302_clk=0;
ds1302_io=date&0x01;
ds1302_clk=1;
date=date>>1;
}
}
voidwrite_ds1302(ucharaddr,uchardate)//写数据,如需写入数据到1302里面,则还需要对保护寄存器进行设置
{
ds1302_rst=0;
_nop_();
ds1302_clk=0;
_nop_();
ds1302_rst=1;
_nop_();
write_ds1302byte(addr);
write_ds1302byte(date);
ds1302_rst=0;
_nop_();
ds1302_clk=0;
ds1302_io=1;
}
ucharread_ds1302(ucharaddr)//读数据
{
uchari,temp;
ds1302_rst=0;
_nop_();
ds1302_clk=0;
_nop_();
ds1302_rst=1;
_nop_();
write_ds1302byte(addr);
for(i=0;i<8;i++)
{
ds1302_clk=0;
temp=temp>>1;
if(ds1302_io)
temp=temp|0x80;
ds1302_clk=1;
}
ds1302_rst=0;
_nop_();
ds1302_clk=0;
ds1302_io=1;
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;
returndate;
}
voidsetime()//初始化时间
{
uchari,*addre,*clk;
addre=address;//使指针addre指向address的首地址
clk=clock;//使指针clk指向clock的首地址
write_ds1302(0x8e,0x00);//退出写保护
for(i=0;i<7;i++,addre++,clk++)
{
write_ds1302(*addre,dth(*clk));//年月日星期时分秒
}
write_ds1302(0x8e,0x80);//写保护
}
voidwrite_sfm(ucharaddr,uchardate)//得出时间的十六进制,将其装换为十进制并显示在液晶上
{
ucharshi,ge;
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);
for(i=0;i<3;i++,day++)//星期字符
{
write_lcddate((*(week+day)));
}
if((shi==6)&&(fen==0)&&(miao<=3))
{
alarm=0;
delay1ms(50);
alarm=1;
delay1ms(50);
}
}
/********************调时系列函数***********************/
ucharhtd(uchardate)//用于调时时将读取出来的十六进制的时分秒转换为十进制,使其以十进制加减进行调时
{
ucharshi,ge;
shi=date/16;
ge=date%16;
date=shi*10+ge;
returndate;
}
/***********在调时过程中,使十进制数据在液晶上显示*************/
voiddecimal(ucharaddr,uchardate)
{
ucharshi,ge;
shi=date/10;
ge=date%10;
write_lcdcom(addr);
write_lcddate(0x30+shi);
write_lcddate(0x30+ge);
}
/*******************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(0x82,dth(fen));
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)
{
delay1ms(5);
if(s2==0)
{
while(!
s2);
if(flag==1)
{
fen--;
if(fen==-1)//分可以为0
fen=59;
decimal(0xc3,fen);
write_lcdcom(0xc4);
}
if(flag==2)
{
shi--;
if(shi==-1)
shi=23;
decimal(0xc0,shi);
write_lcdcom(0xc1);
}
if(flag==3)
{
xingqi--;//星期不可以为0
if(xingqi==0)
xingqi=7;
decimal(0x8b,xingqi);
write_lcdcom(0x8c);
}
if(flag==4)
{
ri--;
if(ri==0)//日不可以为0
ri=30;
decimal(0x88,ri);
write_lcdcom(0x89);
}
if(flag==5)
{
yue--;//月不可以为0
if(yue==0)
yue=12;
decimal(0x85,yue);
write_lcdcom(0x86);
}
}
}
}
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 LCD1602DS1302DS18B20 程序设计