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

上传人:b****5 文档编号:14524613 上传时间:2023-06-24 格式:DOCX 页数:12 大小:28.96KB
下载 相关 举报
基于51单片机的1602液晶显示温度和时间的C程序.docx_第1页
第1页 / 共12页
基于51单片机的1602液晶显示温度和时间的C程序.docx_第2页
第2页 / 共12页
基于51单片机的1602液晶显示温度和时间的C程序.docx_第3页
第3页 / 共12页
基于51单片机的1602液晶显示温度和时间的C程序.docx_第4页
第4页 / 共12页
基于51单片机的1602液晶显示温度和时间的C程序.docx_第5页
第5页 / 共12页
基于51单片机的1602液晶显示温度和时间的C程序.docx_第6页
第6页 / 共12页
基于51单片机的1602液晶显示温度和时间的C程序.docx_第7页
第7页 / 共12页
基于51单片机的1602液晶显示温度和时间的C程序.docx_第8页
第8页 / 共12页
基于51单片机的1602液晶显示温度和时间的C程序.docx_第9页
第9页 / 共12页
基于51单片机的1602液晶显示温度和时间的C程序.docx_第10页
第10页 / 共12页
基于51单片机的1602液晶显示温度和时间的C程序.docx_第11页
第11页 / 共12页
基于51单片机的1602液晶显示温度和时间的C程序.docx_第12页
第12页 / 共12页
亲,该文档总共12页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

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

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

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

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

//液晶显示温度

#include"AT89X52.H"#defineDdataP0

 

sbitRS=P2A7;

//命令数据限制端

 

 

sbitRW=P2A6;

//读写选择端

 

sbitLCDE=P2A5;

//液晶使能端

sbitDQ=P2A0;

//ds18b20

与单片机连接口

 

 

#defineucharunsignedchar

//定义初值

#defineuintunsignedintunsignedcharhour=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();

 

/*************************必1602

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

 

延时1毫秒〔不够精确的〕

voiddelay1ms(unsignedintms)//

unsignedinti,j;

for(i=0;i

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

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

unsignedinti;

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);//*跳过读序列号*/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[1]);//显示十位

wr_com(0x8b);

wr_data(disdata[2]);//显示个位

wr_com(0x8c);

wr_data(0x2e);//显示小数点

wr_com(0x8d);

wr_data(disdata[3]);//显示小数位

voidmain()

TMOD=0X01;

EA=1;

ET0=1;

TR0=1;

TH0=(65536-4995)/256;

TL0=(65536-4995)%256;

init();

while

(1)

read_temp();//读取温度

ds1820disp();//显示

time();//时间程序

display();//时间显示程序

voidt0(void)interrupt1using0

TH0=(65536-4995)/256;

TL0=(65536-4995)%256;

count++;

if(count==200){count=0;sec++;}

if(sec==60){sec=0;min++;}

if(min==60){min=0;hour++;}

if(hour==24){hour=0;}

}

voidtime()

{

line2[15]=tab[sec%10];line2[14]=tab[sec/10];

line2[12]=tab[min%10];line2[11]=tab[min/10];

line2[9]=tab[hour%10];line2[8]=tab[hour/10];

if(!

P1_2){delay();if(!

P1_2){delay();sec++;if(sec==60){sec=0;}}}if(!

P1_1){delay();if(!

P1_1){delay();min++;if(min==60){min=0;}}}

if(!

P1_0){delay();if(!

P1_0){delay();hour++;if(hour==24){hour=0;}}}}

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

当前位置:首页 > 经管营销 > 经济市场

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2