数字体温计protues仿真图和程序.docx
《数字体温计protues仿真图和程序.docx》由会员分享,可在线阅读,更多相关《数字体温计protues仿真图和程序.docx(27页珍藏版)》请在冰豆网上搜索。
数字体温计protues仿真图和程序
LU:
叮
i*.
CurrentKenp-TEOPs諾冷*C
BSss^usiiik
阳咛—;・;;;制
WMMEM
03
'JI-IH
In-
FUTM-I
■卯
WJD
p-j-p-ji
y
“ji
系统程序
#include
#ineludevintrins.h>
#defineucharunsignedchar
#defineuintunsignedint
sbitBUFFER=PM5;
sbitDQ=P3A7;
sbitlcdrs=P2A6;
sbitIcden=卩2八7;
sbitIcdrw=P2A5;
sbitAN=P2A0;
sbitAM=P2A1;
ucharcodeTemp_Disp_Title[]={"CurrentTemp:
"};
uchartemp_buffer[]={"TEMP:
"};
ucharcodexs[]={0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9};/小、数位
ucharTemp_value[]={0x00,0x00};〃为DS18B20读取的字节分配地址
ucharDisplay_Digit[]={0,0,0,0};
uintT;
voiddelay(uint);
voiddelay1602(uint);
voidinit_ds18b20();
voidwrite_byte(uchardate);
voiddisplay_temp();
voidwrite_com(uchar);
voidwrite_2(uchar);
voidinit1602();
ucharread_byte();
voidread_temp();
voidmain()
{bitzhi=0;
AN=1;
init1602();//1602初始化read_temp();//读取温度delay(50000);
while
(1)
{read_temp();
if(zhi==0)
display_temp();//按键没有按下时显示温度if(Display_Digit[2]>2)//设定报警温度if(zhi==0)
BUFFER=0;
delay(2000);
BUFFER=1;delay1602
(1);
if(AN==0)//检测按键
{delay1602(5);//去抖if(AN==0)//按下按键{zhi=~zhi;
//while
(1);//保持当前温度while(!
AN);//松手检测
}
voiddelay(uintt)
{
while(t--);
}
voiddelay1602(uintz)
{
uintx,y;
for(x=z;x>0;x--)for(y=110;y>0;y--);
}
/****************************初始化,检测DS18B20是否在线*****************************/voidinit_ds18b20()
{
DQ=1;
delay(8);
DQ=0;delay(85);
DQ=1;
delay(14);delay(5);
}
voidwrite_byte(uchardate)
{
uchari;
for(i=0;i<8;i++)
{
DQ=0;//写数据前将数据线拉低DQ=date&0x01;//从最低位开始写delay(5);//留出ds18b20采样时间DQ=1;//采样完将数据拉高,等待下一次采样date»=1;//date右移一位
delay(5);
}
ucharread_byte()
{
uinti,value;
for(i=0;i<8;i++)
{
DQ=0;
value>>=1;〃右移一位,同时起延时作用
DQ=1;
if(DQ==1)
value|=0x80;//从高位开始读delay(5);
}
returnvalue;
}
voidread_temp()
{init_ds18b20();
write_byte(0xcc);〃跳过ROMwrite_byte(0x44);〃启动温度测量delay(200);〃给出温度测量时间
init_ds18b20();
write_byte(0xcc);〃跳过ROMwrite_byte(0xbe);//读取温度
}
voiddisplay_temp()
{
uinti;
Temp_value[0]=read_byte();
Temp_value[1]=read_byte();
Display_Digit[0]=xs[Temp_value[0]&0x0f];//显示小数位
T=((Temp_value[0]&0xf0)>>4)|((Temp_value[1]&0x07)<<4);
Display_Digit[3]=T/100;//百位
Display_Digit[2]=T%100/10;//十位
Display_Digit[1]=T%10;//个位temp_buffer[11]=Display_Digit[0]+'0';temp_buffer[10]='.';
temp_buffer[9]=Display_Digit[1]+'0';
temp_buffer[8]=Display_Digit[2]+'0';
temp_buffer[7]=Display_Digit[3]+'0';if(Display_Digit[3]==0)
temp_buffer[7]='';//如果百位为0,则显示空格if(Display_Digit[2]==0&&Display_Digit[3]==0)
temp_buffer[8]='';//如果百位和十位同时为0,则十位处显示空格write_com(0x80);
for(i=0;i<15;i++)
{write_2(Temp_Disp_Title[i]);
}write_com(0x80+0x40);for(i=0;i<12;i++)
{write_2(temp_buffer[i]);delay1602(10);
}write_com(0x80+0x4d);write_2(0xdf);write_2('C');
}
voidwrite_com(ucharcom)
{
lcdrs=0;
P0=com;
delay1602(5);
lcden=1;
delay1602(5);lcden=0;
}
voidwrite_2(ucharda)
lcdrs=1;P0=da;delay1602(5);lcden=1;delay1602(5);lcden=0;
}
voidinit1602()
{
lcden=0;
lcdrw=0;
write_com(0x38);write_com(0x0c);write_com(0x06);write_com(0x80);
}
仿真图
C1
•U1
XT.4L1
X
LSI
XTAL2
RST
psaq
ALE
EA
CRYST细
—
R2..
10k•-
--■■
22p
D2:
LED-8F
ftTS^51
LCD1
U«16L
thetemperature
is38.0
P0.0/AD0P0.1/AD1
P0.2WD2
P03AD3
P0.4/AD4
P0.5WD5
P0.6WD6
P0.7/AD7
P2D/A8
P2.1/A9P22/A10P23/A11P2.4/A12P25/A13P2B/A14P2.7/A15
P3.0KXDP3.1/TXDP32匝
P33^NfT
P3.4fT0
P3.5fT1_
P3.6匝
P3.7莎
fj.
□
■21
■22
(0Oiu>
QOOOOOOO
XCW寸£9*
■22
■24■2E■2E
■27
■2E
■1C
■ii
OP2.0
OP2.1
OP2.2
OP2.3
OP2.4
OP2.5
OP2.6
OP2.7
ORS
ORW
U4
VCC
DQ
GND••
DS1S820.
程序清单
#include
#defineucharunsignedchar
#defineuintunsignedintuchari;
sbitlcdrs=P39
sbitlcdrw=P3A1;
sbitIcden=卩3八2;
sbitd1=P1A0;
sbitd2=P1A1;
ucharcodet0[]="thetemperature";ucharcodet1[]="is";
//利用一个温度表解决温度显示
ucharcodewendu[]="0123456789";乱码
sbitDQ=P3A7;//定义ds18B20总线IO
//液晶显示模块
voiddelay(uintz)
{
uintx,y;
for(x=100;x>1;x--)for(y=z;y>1;y--);
}
voidwrite_com(ucharcom)
{
lcdrs=0;
P2=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
voidwrite_date(uchardate)
{
lcdrs=1;
P2=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
voidinit_lcd()
{
lcden=0;
lcdrw=0;
write_com(0x38);
write_com(0x01);
write_com(0x0c);
write_com(0x06);
write_com(0x80);
for(i=0;i<16;i++)
{write_date(t0[i]);delay(0);
}write_com(0x80+0x40);for(i=0;i<16;i++)
{
write_date(t1[i]);delay(0);
}
}
//温度采集模块
voidtmpDelay(intnum)//延时函数
{while(num--);
}/****************************************************************
**************/
voidInit_DS18B20()〃初始化ds1820
{
unsignedcharx=0;
DQ=1;〃DQ复位
tmpDelay(8);//稍做延时
DQ=0;//单片机将DQ拉低
tmpDelay(80);//精确延时大于480us
DQ=1;//拉高总线
tmpDelay(14);
x=DQ;//稍做