新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 集溫度與時間在液晶上的顯示設計

集溫度與時間在液晶上的顯示設計

作者: 時間:2016-11-27 來源:網(wǎng)絡 收藏
集溫度與時間在液晶上顯示的智能電子體溫計設計是我大二時自學51單片機又看完郭天祥大俠的新概念單片機后自己動手搭板子,自己寫
程序調(diào)試的電路簡單得很,沒有用到74HC573,剛從硬盤里找到了這個設計,幸存已久。今朝終于得見天日,特此紀念一下過往的大學實驗室生活!
本作品是基于現(xiàn)在的水銀體溫計測溫時間長,難讀或者讀數(shù)不精確的現(xiàn)狀下而研發(fā)的。我們知道去醫(yī)院看病或自己在家中感冒發(fā)燒要測體溫來查看。而此款體溫計是數(shù)字顯示,只要上過學就能讀體溫,相對于水銀體溫計,不會摔碎也不用擔心如何處理。只要將探測頭放入咯吱窩里,溫度變化,一旦穩(wěn)定便讀出數(shù)值來,當?shù)蜔蛘吒邿霈F(xiàn)時便會報警提示。除此之外,還有時間顯示,此功能讓電子體溫計更加人性化。
此體溫計是基于51單片機+18B20+lcd1602等必要的外圍設備實現(xiàn)。
電子體溫計體積小,易讀,報警。老少兒童皆能使用。
本設計軟硬件相結(jié)合并不只是用硬件實現(xiàn)。性能更加穩(wěn)定。傳感器+mcu+輸出顯示+輸入控制+報警的設計。
并且此設計可以用于“家庭醫(yī)生”的系統(tǒng)設計,比如可以加上測脈搏、觀心跳、量血壓等一體的系統(tǒng)設計。方便家人足不出戶便可以知道自己的身體狀況。
使用時只要將黃豆粒大的探測頭代替水銀體溫計放到胳肢窩。然后觀察示數(shù)變化,待穩(wěn)定不再變化后便是體溫數(shù)值。
本設計軟硬件相結(jié)合并不只是用硬件實現(xiàn)。性能更加穩(wěn)定。傳感器+mcu+輸出顯示+輸入控制+報警的設計。
此設計可以用于“家庭醫(yī)生”的系統(tǒng)設計,比如可以加上測脈搏、觀心跳、量血壓等一體的系統(tǒng)設計。方便家人足不出戶便可以知道自己的身體狀況。
如果只是單獨測量體溫可以用更小的單片機來替換,小巧靈活,精美。

此設計完全可以投入市場,效益可觀。

本文引用地址:http://butianyuan.cn/article/201611/322302.htm

直接貼程序

#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;
//***********經(jīng)典的延時程序6us*****************//
void delay(uint t) //6 us
{
while(--t);
}
void delays(uint t)
{
uchar i;
while(t--)for(i=110;i>0;i--);
}
//關(guān)于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);
}
////////*******溫度的系列函數(shù)*********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);
}
//讀數(shù)據(jù)時,數(shù)據(jù)以字節(jié)的最低有效位先從總線移出
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);

}
//****************溫度轉(zhuǎn)換***//
get_temp(void)
{
uchar a=0;
uchar b=0;
ds18inti();
delay(200);
writeonebyte(0xcc); //跳過讀序列號的操作
writeonebyte(0x44); //啟動溫度轉(zhuǎn)換
delay(220); //出在這 難題
ds18inti();
writeonebyte(0xcc); //跳過讀序列號的操作
writeonebyte(0xbe); //讀取溫度寄存器
a=readonebyte();//先讀低8位
b=readonebyte();//在讀高8位
temp=b*256+a;
return temp;
}
//***********蜂鳴函數(shù)***///
void beep()
{
bee=~bee;
delays(50);
}
//*******在液晶上顯示溫度函數(shù)***//
void wendu(uchar add,int dat) //int dat必須為整型 才能保證出現(xiàn)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);


}
//*******在液晶上顯示時間函數(shù)***//
void sfm(uchar add,uchar dat) //寫時分秒的子函數(shù)
{
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;
}

//*********顯示時間和溫度的初始化函數(shù)**********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);
}
}
//********調(diào)用溫度和報警函數(shù)************//
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) //從頭閃到尾 原因何在 只要有數(shù)據(jù)更新就會閃所以不能把
{ //所有的顯示函數(shù)放大循環(huán)里
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);
}

}



關(guān)鍵詞: 液晶顯示設

評論


技術(shù)專區(qū)

關(guān)閉