基于51单片机的1602液晶显示温度和时间的C程序Word格式文档下载.docx

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

基于51单片机的1602液晶显示温度和时间的C程序Word格式文档下载.docx

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

基于51单片机的1602液晶显示温度和时间的C程序Word格式文档下载.docx

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<

ms;

i++)

for(j=0;

j<

110;

j++);

}

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

unsigned 

inti;

for(i=0;

1000;

i++);

voiddelay50us()

registerinti;

for(i=0;

20;

voiddelay()

{unsignedcharm,n;

for(m=255;

m>

0;

m--)

for(n=255;

n>

n--);

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

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

LCDE=0;

//使能端

RS=0;

//********RS寄存器选择输入端,当RS=0;

当进行写模块操作,指向指令寄存器。

RW=0;

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

LCDE=1;

Ddata=comm;

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

E=1RS=1RW=0

RS=1;

Ddata=dat;

//将dat赋给P0口

LCDE=0;

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

unsignedchari;

RW=1;

i=Ddata;

return(i);

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

wr_com(0x38);

//*****显示模式设置必须三次,不用检测忙信号

delay5ms();

wr_com(0x01);

///***清屏****

busycheck();

wr_com(0x08);

wr_com(0x06);

///****光标移动设置,写一个字符后地址指针加1***

delay50us();

////***显示模式设置****

wr_com(0x0c);

/////***显示开,不显示光标***

wr_com(0x40);

//setcgramaddress

//***这些延时可用可不用***//

voiddisplay()

unsignedchari;

wr_com(0x80);

//setramaddress

delay50us();

busycheck();

6;

{wr_data(line1[i]);

//display(6个字符)

wr_com(0xc0);

//0xc0=0x80+0x40

16;

{

wr_data(line2[i]);

//display

}

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

voiddelay_18B20(unsignedinti)//延时1微秒

while(i--);

voidds1820rst()/*ds1820复位*/

{unsignedcharx=0;

DQ=1;

//DQ复位

delay_18B20(4);

//延时

DQ=0;

//DQ拉低

delay_18B20(100);

//精确延时大于480us

//拉高

delay_18B20(40);

}

uchards1820rd()/*读数据*/

{unsignedchari=0;

unsignedchardat=0;

for(i=8;

i>

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>

i--)

{DQ=0;

DQ=wdata&

0x01;

wdata>

//右移一位

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

{uchara,b;

ds1820rst();

//ds1802/初始化程序

ds1820wr(0xcc);

//*跳过读序列号*/

ds1820wr(0x44);

//*启动温度转换*/

//*跳过读序列号*/

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[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

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();

}}}

P1_1){delay();

P1_0){delay();

}}} 

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

当前位置:首页 > 职业教育 > 职高对口

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

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