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