数字体温计设计.docx
- 文档编号:9160215
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:14
- 大小:107.75KB
数字体温计设计.docx
《数字体温计设计.docx》由会员分享,可在线阅读,更多相关《数字体温计设计.docx(14页珍藏版)》请在冰豆网上搜索。
数字体温计设计
上传者:
jdchen
例1:
数字体温计
电路原理图:
C程序代码
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
#defineDataP0//数据端口
ucharcodetable[]="2012:
03:
07WED";
ucharcodetable2[]=":
:
";
ucharcodetable1[]="TEMPERATURE";
ucharcodetable3[]="";
sbitlcdrs=P2^4;
sbitrw=P2^5;
sbitlcden=P2^6;
sbitsda=P2^1;
sbiter=P1^1;
uinttemper;
uchara1,a2,a3,a4,aa,b,c,d;
ucharnum,flag,sec,min,hour,flag1,t;
voiddelay(uintz)
{uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
voiddelayus(uintx,uchary)
{uinti;
ucharj;
for(i=x;i>0;i--);
for(j=y;j>0;j--);
}
voidwrite_com(ucharcom)
{rw=0;
lcdrs=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
voidwrite_data(uchardate)
{rw=0;
lcdrs=1;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
voidreset()
{ucharst=1;
sda=1;
_nop_();_nop_();
while(st)
{sda=0;
delayus(40,30);
sda=1;
delayus(1,1);
if(sda==1)
st=1;
else
st=0;
delayus(10,15);//短一点也没关系delayus(5,5)也可要求并不是很严格
}
}
voidwrite_byte(uchardate)
{uchari,temp;
sda=1;//最开始为高,然后才被拉低
_nop_();_nop_();
for(i=8;i>0;i--)//开始写数据
{temp=date&0x01;//01010101
sda=0;
delayus(0,0);
if(temp==1)
sda=1;
delayus(1,2);
sda=1;
date=date>>1;//00101010
}
}
ucharread_byte()
{uchari,date;
staticbitj;
for(i=8;i>0;i--)
{date=date>>1;//因为date最开始为零要移动八次故不能放到最后否则会移出去
sda=1;
_nop_();_nop_();
sda=0;
_nop_();_nop_();_nop_();_nop_();//_nop_();_nop_();
sda=1;
_nop_();_nop_();_nop_();_nop_();
j=sda;
if(j==1)
date=date|0x80;//10000000先读最高位然后被右移到最低位
delayus(1,1);
}
return(date);
}
write_wendu(ucharadd,uchardate)
{write_com(0x80+add);
wrte_data(0x30+date);
}
voidget_tem()
{uchartem1,tem2,num;
floataaa;
reset();//复位
write_byte(0xCC);//跳过ROM
write_byte(0x44);//温度转换
for(num=100;num>0;num--)//delayus(70,30)
reset();
write_byte(0xCC);
write_byte(0xBE);
tem1=read_byte();
tem2=read_byte();
aaa=(tem2*256+tem1)*6.25;
temper=(int)aaa;
a1=temper/1000;
a2=temper%1000/100;
a3=temper%100/10;
a4=temper%10;
}
voidinit()
{sec=56;
min=59;
hour=23;
t=1;
flag=0;
er=0;
P0=0xff;
lcden=0;
EA=1;//开总中断
ET1=1;
TR1=1;
TMOD=0x10;
TH1=(65535-50000)/256;
TL1=(65535-50000)%256;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);//清屏
write_com(0x80);//初地址
}
voidledshow()
{
write_com(0x80);
for(num=0;num<16;num++)
{write_data(table[num]);
delay(20);//若时间延时更长则会出现动态的显示
}
write_com(0x80+0x40);
for(num=0;num<16;num++)
{write_data(table2[num]);
delay(20);
}
}
voidledshow1()
{write_com(0x80);
for(num=0;num<16;num++)
{write_data(table1[num]);
delay(20);
}
write_com(0x80+0x40);
for(num=0;num<16;num++)
{write_data(table3[num]);
delay(20);
}
}
voidtwikle()
{uchars;
for(s=6;s>0;s--)
{er=!
er;
delay(300);
}
}
writesmh(ucharadd,uchardate)
{ucharshi,ge;
shi=date/10;
ge=date%10;
write_com(0x80+0x40+add);
write_data(0x30+shi);
write_data(0x30+ge);
}
voidmain()
{init();
writesmh(0x0b,sec);
writesmh(0x08,min);
writesmh(0x05,hour);
ledshow();
twikle();
get_tem();
{delay(5);
flag1=1;
ledshow1();
EA=1;
TMOD=0x01;
ET0=1;
TR0=1;
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
while
(1)
{get_tem();
if(flag==0)
{write_wendu(0x43,a1);
write_wendu(0x44,a2);
write_com(0x80+0x45);
write_data(0x2e);
write_wendu(0x46,a3);
write_wendu(0x47,a4);
write_com(0x80+0x48);
write_data(0xdf);
write_com(0x80+0x49);
write_data(0x43);
}
if(flag==1)
{write_wendu(0x43,aa);
write_wendu(0x44,b);
write_com(0x80+0x45);
write_data(0x2e);
write_wendu(0x46,c);
write_wendu(0x47,d);
write_com(0x80+0x48);
write_data(0xdf);
write_com(0x80+0x49);
write_data(0x43);
}
}
}
}
voidtimer0()interrupt1
{uchara;
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
a++;
if(a==100)
{a=0;
if(temper<3750)
buzzer();
if(temper>3750)
buzzer1();
if(temper<3200)
{er=1;
write_com(0x80+0x4C);
write_data(0x4c);
}
if(temper>4200)
{write_com(0x80+0x4C);
write_data(0x48);
}
TR0=0;
flag=1;
aa=a1;
b=a2;
c=a3;
d=a4;
}
}
voidtimer1()interrupt3
{ucharz;
TH1=(65535-50000)/256;
TL1=(65535-50000)%256;
z++;
if(z==20)
{z=0;
sec++;
if(sec==60)
{sec=0;
min++;
}
if(flag1==0)
{writesmh(0x0b,sec);
write_com(0x80+0x4a);
write_data(0x3a);
}
if(min==60)
{min=0;
hour++;
}
if(flag1==0)
{
writesmh(0x08,min);
write_com(0x80+0x47);
write_data(0x3a);
}
if(hour==24)
hour=0;
if(flag1==0)
writesmh(0x05,hour);
}
}/*读取温度*/
unsignedintReadTemperature(void)
{
unsignedchara=0;
unsignedintb=0;
unsignedintt=0;
Init_DS18B20();
WriteOneChar(0xCC);//跳过读序号列号的操作
WriteOneChar(0x44);//启动温度转换
delay(200);
Init_DS18B20();
WriteOneChar(0xCC);//跳过读序号列号的操作
WriteOneChar(0xBE);//读取温度寄存器(共可读9个寄存器)前两个是温度
a=ReadOneChar();//低位
b=ReadOneChar();//高位
b<<=8;
t=a+b;
return(t);
}
调试步骤:
1)线路连接:
按电路原理图连接好温度传感器18B20。
2)下载程序:
接好通信线,运行STC程序。
请参照“LK-51系列单片机实验、应用学习机使用说明”。
按照使用说明中提示的步骤,分别选择单片机型号、打开待下载的程序文件(.HEX文件)、选择通信口和通信波特率(可选38400);
下载程序,先关电源,点击DownLoad/下载框,然后再接通电源(冷启动),在左下框中出现程序下载信息,并提示程序下载成功。
3)运行程序:
可以在1602液晶显示温度+/-和两位整数温度和两位小数温度数据
实物图
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数字 体温计 设计