您的位置 首页 汽车

集温度与时刻在液晶上的显现规划

集温度与时间在液晶上显示的智能电子体温计设计是我大二时自学51单片机又看完郭天祥大侠的新概念单片机后自己动手搭板子,自己写程序调

集温度与时刻在液晶上显现的智能电子体温计规划是我大二时自学51单片机又看完郭天祥大侠的新概念单片机后自己着手搭板子,自己写
程序调试的电路简略得很,没有用到74HC573,刚从硬盘里找到了这个规划,幸存已久。今朝总算得见天日,特此留念一下过往的大学实验室日子!
本著作是根据现在的水银体温计测温时刻长,难读或许读数不精确的现状下而研制的。咱们知道去医院治病或自己在家中伤风发烧要测体温来检查。而此款体温计是数字显现,只需上过学就能读体温,相对于水银体温计,不会摔碎也不必忧虑怎么处理。只需将勘探头放入咯吱窝里,温度改变,一旦安稳便读出数值来,当低烧或许高烧呈现时便会报警提示。除此之外,还有时刻显现,此功能让电子体温计愈加人性化。
此体温计是根据51单片机+18B20+lcd1602等必要的外围设备完成。
电子体温计体积小,易读,报警。老少儿童皆能运用。
本规划软硬件相结合并不仅仅用硬件完成。功能愈加安稳。传感器+mcu+输出显现+输入操控+报警的规划。
而且此规划能够用于“家庭医生”的体系规划,比方能够加上测脉息、观心跳、量血压等一体的体系规划。便利家人足不出户便能够知道自己的身体状况。
运用时只需将黄豆粒大的勘探头替代水银体温计放到胳肢窝。然后调查示数改变,待安稳不再改变后就是体温数值。
本规划软硬件相结合并不仅仅用硬件完成。功能愈加安稳。传感器+mcu+输出显现+输入操控+报警的规划。
此规划能够用于“家庭医生”的体系规划,比方能够加上测脉息、观心跳、量血压等一体的体系规划。便利家人足不出户便能够知道自己的身体状况。
假如仅仅独自丈量体温能够用更小的单片机来替换,细巧灵敏,精巧。

此规划完全能够投入市场,效益可观。

直接贴程序

#include
#include
#define uint unsigned int
#define uchar unsigned char
uchar code table1[]={“Cur Temp: . “};
uchar code table2[]={“Cur Tim: :00: “};
uint temp=0;
uint a,b;
uchar miao,shi,fen,s1num;
float ftemp=0;
sbit dq=P2^0;
sbit bee=P2^1;
sbit k1=P3^3;
sbit k2=P3^6;
sbit k3=P3^7;
sbit rs=P3^4;
sbit en=P3^5;
//***********经典的延时程序6us*****************//
void delay(uint t) //6 us
{
while(–t);
}
void delays(uint t)
{
uchar i;
while(t–)for(i=110;i>0;i–);
}
//关于lcd1602的系列chengxu***********//
void writecomm(uchar com)
{
rs=0;
P1=com;
en=0;
delay(5);
en=1;
delay(5);
en=0;
}
void writedat(uchar dat)
{
rs=1;
P1=dat;
en=0;
delays(5);
en=1;
delays(15);
en=0;
}
void lcd1602init()
{
en=0;
fen=0;
shi=0; //初始值 在这里设
miao=0;
s1num=0;
P2=0xff;
writecomm(0x38);
writecomm(0x0c);
writecomm(0x06);
writecomm(0x01);
}
////////*******温度的系列函数*********8//
bit ds18inti()
{
dq=1;_nop_();_nop_(); //延时2奇妙
dq=0;
delay(85);//510us
dq=1;
delay(6); //15-60us
if(dq) //没应对
{
return 0;
}
while(dq); //等候变0则有应对
{
while(!dq); //等候应对信号结束
}
return 1; //结束?
}
void writeonebyte(uchar val)
{

uchar i;
for(i=8;i>0;i–)
{
dq=1;_nop_();_nop_(); //从高拉倒低
dq=0;_nop_();_nop_();_nop_();_nop_(); //5 us
dq=val&0x01; //最低位移出
delay(6); //66 us
val=val/2; //右移1位
}
dq=1;
delay(1);
}
//读数据时,数据以字节的最低有用位先从总线移出
uchar readonebyte()
{
uchar i;
uchar value=0;
for(i=8;i>0;i–)
{
dq=1;_nop_();_nop_();
value>>=1;
dq=0;_nop_();_nop_();_nop_();_nop_(); //4 us
dq=1;_nop_();_nop_();_nop_();_nop_();_nop_(); //4 us
if(dq)value|=0x80;
delay(6); //66 us
}
dq=1;
return(value);

}
//****************温度转化***//
get_temp(void)
{
uchar a=0;
uchar b=0;
ds18inti();
delay(200);
writeonebyte(0xcc); //越过读序列号的操作
writeonebyte(0x44); //发动温度转化
delay(220); //出在这 难题
ds18inti();
writeonebyte(0xcc); //越过读序列号的操作
writeonebyte(0xbe); //读取温度寄存器
a=readonebyte();//先读低8位
b=readonebyte();//在读高8位
temp=b*256+a;
return temp;
}
//***********蜂鸣函数***///
void beep()
{
bee=~bee;
delays(50);
}
//*******在液晶上显现温度函数***//
void wendu(uchar add,int dat) //int dat有必要为整型 才干确保呈现25.5以上的值
{
uchar shi,ge,shifen;
if(dat<0)
{
writecomm(0x80+9);
writedat(-);
dat=0-dat;
}
else
{
writecomm(0x80+9);
writedat(+);
}
// bai=(dat>>4)/100+0x30;
shi=(dat>>4)%100/10;
ge=(dat>>4)%10;
shifen=((dat&0x000f)*62.5 )/100+0x30;
writecomm(0x80+add);
// writedat(bai+0x30);
writedat(shi+0x30);
writedat(ge+0x30);
writecomm(0x80+13);
writedat(shifen);

}
//*******在液晶上显现时刻函数***//
void sfm(uchar add,uchar dat) //写时分秒的子函数
{
uchar shi,ge;
ge=dat%10;
shi=dat/10;
writecomm(0x80+0x40+add) ;
writedat(0x30+shi) ;
writedat(0x30+ge) ;
}
//*******定时器0的初始化***********、//
void timerinti()
{
TMOD=0x01;
EA=1;
ET0=1;
TR0=1;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
}

//*********显现时刻和温度的初始化函数**********8//
void displaytime()
{
uchar num;
writecomm(0x80);
for(num=0;num<16;num++)
{
writedat(table1[num]);
delays(5);
}
a=get_temp(); //yanhi
delays(40);
writecomm(0x80+14);
writedat(0xdf);
writecomm(0x80+15);
writedat(0x43);
delay(200);

writecomm(0x80+0x40);
for(num=0;num<16;num++)
{
writedat(table2[num]);
delays(5);
}
}
//********调用温度和报警函数************//
void displaywendu()
{
int dat;
uchar shi,ge;
delays(200);
a=get_temp();
wendu(10,a);
dat=get_temp();
shi=(dat>>4)%100/10;
ge=(dat>>4)%10;
if((shi<3)|(shi>3))beep();
}
//********键盘扫描程序***********8//
void keyscan()
{
if(k1==0)
{
delays(5);
if(k1==0)
{
s1num+=1;
while(!k1);
}
switch(s1num) //从头闪到尾 原因安在 只需有数据更新就会闪所以不能把
{ //一切的显现函数扩大循环里
case 1:TR0=0;writecomm(0x80+0x40+14);writecomm(0x0f);break;
case 2:writecomm(0x80+0x40+11);break;
case 3:writecomm(0x80+0x40+8);break;
case 4:s1num=0;writecomm(0x0c);TR0=1;break;
default:break;
}
}
//…..*****………..//
if(s1num==1) //添加程序
{
if(k2==0)
{
delays(5);
if(k2==0)
{
while(!k2);
miao++;
if(miao==60)
miao=0;
sfm(14,miao);
}
}

}
if(s1num==2)
{
if(k2==0)
{
delays(5);
if(k2==0)
{
while(!k2);
fen++;
if(fen==60)
fen=0;
sfm(11,fen);
}
}
}
if(s1num==3)
{
if(k2==0)
{
delays(5);
if(k2==0)
{
while(!k2);
shi++;
if(shi==24)
shi=0;
sfm(8,shi);
}
}
}
//………………….//削减程序
if(s1num==1)
{
if(k3==0)
{
delays(5);
if(k3==0)
{
while(!k3);
miao–;
if(miao==0)
miao=59;
sfm(14,miao);
}
}

}
if(s1num==2)
{
if(k3==0)
{
delays(5);
if(k3==0)
{
while(!k3);
fen–;
if(fen==0)
fen=59;
sfm(11,fen);
}
}
}
if(s1num==3)
{
if(k3==0)
{
delays(5);
if(k3==0)
{
while(!k2);
shi–;
if(shi==0)
shi=24;
sfm(8,shi);
}
}
}
}

void main()
{

lcd1602init();
ds18inti();
timerinti();
displaytime();
sfm(8,shi); // 初始显现00:00
sfm(11,fen);
sfm(14,miao);
while(1)
{
keyscan();

displaywendu();
}
}
void timer0() interrupt 1
{
uchar count;

TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
count++;

if(count==17)
{
count=0;
miao++;
if(miao==60)
{
miao=0;
fen++;
if(fen==60)
{
fen=0;
shi++;
if(shi==24)shi=0;
sfm(8,shi);
}
sfm(11,fen);
}
sfm(14,miao);
}

}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qiche/257204.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部