液晶1602时钟芯片1302及18B20相关程序.docx

上传人:b****7 文档编号:23956330 上传时间:2023-05-22 格式:DOCX 页数:12 大小:16.52KB
下载 相关 举报
液晶1602时钟芯片1302及18B20相关程序.docx_第1页
第1页 / 共12页
液晶1602时钟芯片1302及18B20相关程序.docx_第2页
第2页 / 共12页
液晶1602时钟芯片1302及18B20相关程序.docx_第3页
第3页 / 共12页
液晶1602时钟芯片1302及18B20相关程序.docx_第4页
第4页 / 共12页
液晶1602时钟芯片1302及18B20相关程序.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

液晶1602时钟芯片1302及18B20相关程序.docx

《液晶1602时钟芯片1302及18B20相关程序.docx》由会员分享,可在线阅读,更多相关《液晶1602时钟芯片1302及18B20相关程序.docx(12页珍藏版)》请在冰豆网上搜索。

液晶1602时钟芯片1302及18B20相关程序.docx

液晶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);

}

}

}

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

当前位置:首页 > 高中教育 > 小学教育

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1