基于51单片机的1602液晶显示温度和时间的C程序.docx

上传人:b****1 文档编号:360587 上传时间:2022-10-09 格式:DOCX 页数:7 大小:17.01KB
下载 相关 举报
基于51单片机的1602液晶显示温度和时间的C程序.docx_第1页
第1页 / 共7页
基于51单片机的1602液晶显示温度和时间的C程序.docx_第2页
第2页 / 共7页
基于51单片机的1602液晶显示温度和时间的C程序.docx_第3页
第3页 / 共7页
基于51单片机的1602液晶显示温度和时间的C程序.docx_第4页
第4页 / 共7页
基于51单片机的1602液晶显示温度和时间的C程序.docx_第5页
第5页 / 共7页
点击查看更多>>
下载资源
资源描述

基于51单片机的1602液晶显示温度和时间的C程序.docx

《基于51单片机的1602液晶显示温度和时间的C程序.docx》由会员分享,可在线阅读,更多相关《基于51单片机的1602液晶显示温度和时间的C程序.docx(7页珍藏版)》请在冰豆网上搜索。

基于51单片机的1602液晶显示温度和时间的C程序.docx

基于51单片机的1602液晶显示温度和时间的C程序

//液晶显示温度

#include"AT89X52.H"

#defineDdataP0

sbitRS=P2^7;//命令数据控制端

sbitRW=P2^6;//读写选择端

sbitLCDE=P2^5;//液晶使能端

sbitDQ=P2^0;//ds18b20与单片机连接口

#defineucharunsignedchar

#defineuint unsignedint

unsignedcharhour=0,min=0,sec=0;//定义初值

unsignedintcount=0;

unsignedcharline1[16]={"temp:

         "};//16个字符

unsignedcharline2[16]={"time:

 00:

00:

00"};//16个字符

unsignedchartab[]={'0','1','2','3','4','5','6','7','8','9'}; //数组

uchardatadisdata[5];

uinttvalue;//温度值

uchartflag;//温度正负标志

voidtime();

/*************************lcd1602程序**************************/

voiddelay1ms(unsignedintms)//延时1毫秒(不够精确的)

{

unsignedinti,j;

  for(i=0;i

   for(j=0;j<110;j++);

}

voiddelay5ms()//延时5毫秒(不够精确的)

{

unsigned inti;

for(i=0;i<1000;i++);

}

voiddelay50us()

{

registerinti;

for(i=0;i<20;i++);

}

voiddelay()

{unsignedcharm,n;

for(m=255;m>0;m--)

for(n=255;n>0;n--);

}

voidwr_com(unsignedcharcomm)//********写控制字符程序E=1RS=0

RW=0**********//

{                       

 LCDE=0;//使能端

 RS=0;            //********RS寄存器选择输入端,当RS=0;当进行写模块操作,指向指令寄存器。

 RW=0;          //********当RS=1,无论是读操作还是写操作,都是指向数据寄存器。

 LCDE=1;

 Ddata=comm;

 RS=0;

 RW=0;

 LCDE=0;

}

voidwr_data(unsignedchardat)//*****当前位置写字符子程序:

E=1RS=1RW=0

{

 LCDE=0;

 RS=0;            //********RS寄存器选择输入端,当RS=0;当进行写模块操作,指向指令寄存器。

 RW=0;            //********当RS=1,无论是读操作还是写操作,都是指向数据寄存器。

 RS=1;

 RW=0;

 LCDE=1;

 Ddata=dat;//将dat赋给P0口

   LCDE=0;

 RS=0;

 RW=0;

}

unsignedcharbusycheck()//*****忙状态检查*******//

{

 unsignedchari;

 LCDE=0;

 RS=0;

 RW=0;

 RS=0;

 RW=1;

 LCDE=1;

 i=Ddata;

   LCDE=0;

 return(i);

}

 

voidinit()//**********初始化程序,必须按照产品的资料介绍的过程进行********//

{

 wr_com(0x38);  //*****显示模式设置必须三次,不用检测忙信号

 delay5ms();

 wr_com(0x38);

 delay5ms();

 wr_com(0x38);

 delay5ms();

 wr_com(0x01);  ///***清屏****

 delay5ms();

 busycheck();

 wr_com(0x08);

 delay5ms();

 busycheck();

 delay5ms();

 wr_com(0x06);  ///****光标移动设置,写一个字符后地址指针加1***

 delay5ms();

 busycheck();

 delay50us();

 wr_com(0x38);  ////***显示模式设置****

 delay50us();

 busycheck();

 delay50us();

 wr_com(0x0c);  /////***显示开,不显示光标***

 delay50us();

 busycheck();

 delay50us();

 wr_com(0x40); //setcgramaddress

 delay50us();

 delay50us();     //***这些延时可用可不用***//

}

voiddisplay()

{ unsignedchari;

 wr_com(0x80); //setramaddress

 delay50us();

 busycheck();

 delay50us();

 for(i=0;i<6;i++)

      {wr_data(line1[i]); //display(6个字符)

 delay50us();

 busycheck();} 

 busycheck();

 delay50us();

 wr_com(0xc0);//0xc0=0x80+0x40

 delay50us();

 busycheck();

 delay50us();

 for(i=0;i<16;i++)

 {

  wr_data(line2[i]); //display

  delay50us();

  busycheck();

 }

}

/******************************温度传感器ds1820程序***************************************/

voiddelay_18B20(unsignedinti)//延时1微秒

{

  while(i--);

}

voidds1820rst()/*ds1820复位*/

{unsignedcharx=0;

DQ=1;         //DQ复位

delay_18B20(4);//延时

DQ=0;         //DQ拉低

delay_18B20(100);//精确延时大于480us

DQ=1;         //拉高

delay_18B20(40);

  }

  uchards1820rd()/*读数据*/

{unsignedchari=0;

unsignedchardat=0;

for(i=8;i>0;i--)//读一个字节的数据函数

{  DQ=0;//给脉冲信号

   dat>>=1;

   DQ=1;//给脉冲信号

   if(DQ)

   dat|=0x80;//等价于dat=dat|0x80,dat和0x80做“或”的运算,结果是最高位置1,其它位保持不变。

   delay_18B20(10);

}

  return(dat);

}

voidds1820wr(ucharwdata)/*写数据*/

{unsignedchari=0;

   for(i=8;i>0;i--)

  {DQ=0;

    DQ=wdata&0x01;

    delay_18B20(10);

    DQ=1;

    wdata>>=1;//右移一位

  }

}

read_temp()/*读取温度值并转换*/

{uchara,b;

ds1820rst();   //ds1802/初始化程序

ds1820wr(0xcc);//*跳过读序列号*/

ds1820wr(0x44);//*启动温度转换*/

ds1820rst();   

ds1820wr(0xcc);//*跳过读序列号*/

ds1820wr(0xbe);//*读取温度*/

a=ds1820rd();//读低八位

b=ds1820rd();//读高八位

tvalue=b;

tvalue<<=8;

tvalue=tvalue|a;

   if(tvalue<0x0fff)

  tflag=0;

   else//“&”是逻辑与“|”是逻辑或

if(dat&0x01):

不管dat是什么数和0x01(00000001)做了“与”的运算后,最低位保持不变,其它位均为0.如果dat的最低位为1,则表达式为真,就会执行if语句中的内容。

如果dat最低位为0,则表达式为假,不执行if语句,执行if语句后的下一条语句。

dat|=0x80:

等价于dat=dat|0x80,dat和0x80做“或”的运算,意思是最高位置1,其它位保持不变。

具体的可以去参考一下C语言的相关语法。

  {tvalue=~tvalue+1;

tflag=1;

  }

tvalue=tvalue*(0.625);//温度值扩大10倍,精确到1位小数

return(tvalue);

}

/*******************************************************************/

  voidds1820disp()//温度值显示

{ucharflagdat;

  disdata[0]=tvalue/1000+0x30;//百位数

    disdata[1]=tvalue%1000/100+0x30;//十位数

    disdata[2]=tvalue%100/10+0x30;//个位数

    disdata[3]=tvalue%10+0x30;//小数位

   

    if(tflag==0)

    flagdat=0x20;//正温度不显示符号

    else

      flagdat=0x2d;//负温度显示负号:

-

    if(disdata[0]==0x30)

   {disdata[0]=0x20;//如果百位为0,不显示

  if(disdata[1]==0x30)

   {disdata[1]=0x20;//如果百位为0,十位为0也不显示

   }

  }

   wr_com(0x88);

   wr_data(flagdat);//显示符号位

   wr_com(0x89);

   wr_data(disdata[0]);//显示百位

   wr_com(0x8a);

   wr_data(disdata

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

当前位置:首页 > 人文社科 > 哲学历史

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

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