液晶1602时钟芯片1302及18B20相关程序.docx
《液晶1602时钟芯片1302及18B20相关程序.docx》由会员分享,可在线阅读,更多相关《液晶1602时钟芯片1302及18B20相关程序.docx(12页珍藏版)》请在冰豆网上搜索。
液晶1602时钟芯片1302及18B20相关程序
/***时钟芯片13021602液晶显示***/
#include
#include
#defineuintunsignedint
#defineucharunsignedchar//宏定义
/*位定义*/
sbitCE=P3^7;
sbitIO=P3^6;
sbitSCLK=P3^5;//1302管脚定义
sbitRS=P3^2;
sbitEN=P3^3;//1602管脚定义
sbitk=P2^7;//点阵片选
sbitds=P2^5;//温度传感器信号线
sbitvo=P2^2;
sbitjd=P2^4;
uinti,j;
uchartime_data[7]={11,26,7,15,12,41,30};//年周月日时分秒
ucharwrite_add[7]={0x8c,0x8a,0x88,0x86,0x84,0x82,0x80};
ucharread_add[7]={0x8d,0x8b,0x89,0x87,0x85,0x83,0x81};
ucharcodetable1[]="welcometohere";
uinttemp,s_temp;//定义整形变量
floatf_temp;//定义浮点型变量
ucharshi,ge,shif,baif;
/**函数声明**/
voidwrite_1(uchardat);//写入单字节
voidw1302(ucharadd,uchardat);//写地址写数据
ucharr1302(ucharadd);//读地址
voidset_time();//设置时间
voidread_time();//读时间
voidtime_chuli();//处理时间,将bcd码转换为十进制
//voiddisplay_1602();//1602显示函数
voidw_1602com(ucharcom);//1602写指令
voidw_1602date(uchardate);//1602写数据
voidinit_1602();//1602初始化
//uchartable1[16];
uchartable2[8];//存放十进制时间的数组
voiddelay(uintz)//延迟函数
{
uinta,b;
for(a=110;a>0;a--)
for(b=z;b>0;b--);
}
voiddelay1(uinti)
{
while(i--);
}
/************18B20*****************************************************/
voiddsreset(void)//18B20复位,初始化函数
{
unsignedcharx=0;
ds=1;//DQ复位
delay1(8);//稍做延时
ds=0;//单片机将DQ拉低
delay1(80);//精确延时大于480us
ds=1;//拉高总线
delay1(10);
x=ds;//稍做延时后如果x=0则初始化成功x=1则初始化失败
delay1(5);
}
uchartempread(void)//读1个字节
{
unsignedchari=0;
unsignedchardat=0;
for(i=8;i>0;i--)
{
ds=0;//给脉冲信号
dat>>=1;
ds=1;//给脉冲信号
if(ds)
dat|=0x80;
delay1(5);
}
return(dat);
}
voidtempwritebyte(uchardat)//向18B20写一个字节数据
{
uinti;
ucharj;
bittestb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;//判断最后一位是1还是0
dat=dat>>1;
if(testb)//写1
{
ds=0;
i++;i++;
ds=1;
i=8;while(i>0)i--;
}
else
{
ds=0;//写0
i=8;while(i>0)i--;
ds=1;
i++;i++;
}
}
}
voidds18b20()
{
uchare;
uintf;
dsreset();//初始化,每次对18B20的操作都首先要初始化
delay1
(1);
tempwritebyte(0xcc);//写跳过读ROM指令
tempwritebyte(0x44);//写温度转换指令
dsreset();//初始化
delay1
(1);
tempwritebyte(0xcc);//写跳过读ROM指令
tempwritebyte(0xbe);//写读指令
e=tempread();//读低8位
f=tempread();//读高8位
f<<=8;
f=e+f;
f_temp=f*0.0625;//温度在寄存器中为12位分辨率位0.0625°
s_temp=f_temp*100;
shi=s_temp/1000;
ge=s_temp%1000/100;
shif=s_temp%100/10;
baif=s_temp%10;
}
/*********************1302***************************/
voidwrite_1(uchardat)//写入单字节
{
uchari;
for(i=8;i>0;i--)
{
SCLK=0;
IO=dat&0x01;
dat=dat>>1;
SCLK=1;
}
}
voidw1302(ucharadd,uchardat)//写数据写地址
{
CE=0;
_nop_();
SCLK=0;
_nop_();
CE=1;
_nop_();
write_1(add);
write_1(dat);
CE=0;
_nop_();
IO=1;
SCLK=1;
}
ucharr1302(ucharadd)//读地址
{
uchari,date;
CE=0;
_nop_();
SCLK=0;
_nop_();
CE=1;
_nop_();
write_1(add);
for(i=8;i>0;i--)
{
date=date>>1;
SCLK=0;
if(IO)
date=date|0x80;
SCLK=1;
}
CE=0;
_nop_();
SCLK=0;
_nop_();
IO=1;
SCLK=1;
returndate;
}
voidset_time()//设置时间
{
uchari,j;
for(i=0;i<7;i++)
{
j=time_data[i]/10;
time_data[i]=time_data[i]%10;
time_data[i]=time_data[i]+j*16;
}
w1302(0x8e,0x00);//去除写保护
for(i=0;i<7;i++)
{
w1302(write_add[i],time_data[i]);
}
w1302(0x8e,0x80);//加写保护
}
voidread_time()//读时间
{
uchari;
for(i=0;i<7;i++)
{
time_data[i]=r1302(read_add[i]);
}
}
voidtime_chuli()//处理时间转换为十进制
{
table2[0]='0'+time_data[4]/16;
table2[1]='0'+time_data[4]%16;
table2[2]=':
';
table2[3]='0'+time_data[5]/16;
table2[4]='0'+time_data[5]%16;
table2[5]=':
';
table2[6]='0'+time_data[6]/16;
table2[7]='0'+time_data[6]%16;
//用于液晶显示
}
/**********************1602****************************/
voidw_1602com(ucharcom)//写指令
{
RS=0;
P0=com;
delay(5);
EN=0;
EN=1;
EN=0;
}
voidw_1602date(uchardate)//写数据
{
RS=1;
P0=date;
delay(5);
EN=0;
EN=1;
EN=0;
}
voidinit_1602()//1602初始化
{
k=1;
P1=0;
k=0;//关点阵
w_1602com(0x38);//设置16*2显示,5*7点阵,8位数据接口
w_1602com(0x0c);//开显示,显示光标,光标显示
w_1602com(0x06);//当读或写一个字符后地址指针加一,且光标加一
w_1602com(0x01);//显示清屏:
数据指针清零,所有显示清零
}
voiddisplay_1602()//1602显示函数
{
w_1602com(0x80+0x00);
for(i=0;i<15;i++)
{
w_1602date(table1[i]);
delay(5);
}
w_1602com(0x80+0x40);
for(j=0;j<8;j++)
{
w_1602date(table2[j]);
delay
(1);
}
w_1602date(0x20);
w_1602date(0x30+shi);
w_1602date(0x30+ge);
w_1602date(0x2e);
w_1602date(0x30+shif);
w_1602date(0xdf);
w_1602date(0x43);
delay(100);
}
/******************主函数***************/
voidmain()
{
init_1602();//1602初始化
set_time();//设定初始时间
while
(1)
{
ds18b20();
read_time();
time_chuli();
display_1602();//1602液晶显示
if(vo==1)
{
jd=0;delay(5);jd=1;delay(5);
}
}
}