数字体温计protues仿真图和程序资料Word格式.docx
- 文档编号:17510642
- 上传时间:2022-12-06
- 格式:DOCX
- 页数:24
- 大小:394.35KB
数字体温计protues仿真图和程序资料Word格式.docx
《数字体温计protues仿真图和程序资料Word格式.docx》由会员分享,可在线阅读,更多相关《数字体温计protues仿真图和程序资料Word格式.docx(24页珍藏版)》请在冰豆网上搜索。
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>
y--);
/****************************
初始化,检测DS18B20是否在线
*****************************/
voidinit_ds18b20()
{
DQ=1;
delay(8);
DQ=0;
delay(85);
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右移一位
ucharread_byte()
uinti,value;
value>
//右移一位,同时起延时作用
if(DQ==1)
value|=0x80;
//从高位开始读
delay(5);
returnvalue;
voidread_temp()
init_ds18b20();
write_byte(0xcc);
//跳过ROM
write_byte(0x44);
//启动温度测量
delay(200);
//给出温度测量时间
write_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]+'
temp_buffer[8]=Display_Digit[2]+'
temp_buffer[7]=Display_Digit[3]+'
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;
15;
write_2(Temp_Disp_Title[i]);
write_com(0x80+0x40);
12;
{
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;
lcden=0;
voidwrite_2(ucharda)
lcdrs=1;
P0=da;
voidinit1602()
lcdrw=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x80);
仿真图
程序清单
reg51.h>
#defineucharunsignedchar
#defineuintunsignedint
uchari;
sbitlcdrs=P3^0;
sbitlcdrw=P3^1;
sbitlcden=P3^2;
sbitd1=P1^0;
sbitd2=P1^1;
ucharcodet0[]="
thetemperature"
ucharcodet1[]="
is"
ucharcodewendu[]="
0123456789"
//利用一个温度表解决温度显示乱码
sbitDQ=P3^7;
//定义ds18B20总线IO
//液晶显示模块
voiddelay(uintz)
for(x=100;
1;
for(y=z;
y--);
P2=com;
voidwrite_date(uchardate)
P2=date;
voidinit_lcd()
write_com(0x01);
16;
{
write_date(t0[i]);
delay(0);
}
write_com(0x80+0x40);
write_date(t1[i]);
//温度采集模块
voidtmpDelay(intnum)//延时函数
while(num--);
}
/******************************************************************************/
voidInit_DS18B20()//初始化ds1820
unsignedcharx=0;
DQ=1;
//DQ复位
tmpDelay(8);
//稍做延时
DQ=0;
//单片机将DQ拉低
tmpDelay(80);
//精确延时大于480us
//拉高总线
tmpDelay(14);
x=DQ;
//稍做延时后如果x=0则初始化成功x=1则初始化失败
tmpDelay(20);
unsignedcharReadOneChar()//读一个字节
unsignedchari=0;
unsignedchardat=0;
for(i=8;
i>
i--)
DQ=0;
//给脉冲信号
dat>
DQ=1;
if(DQ)
dat|=0x80;
tmpDelay(4);
return(dat);
voidWriteOneChar(unsignedchardat)//写一个字节
i>
i--)
DQ=dat&
tmpDelay(5);
unsignedintReadtemp()//读取温度
unsignedchara=0;
unsignedcharb=0;
unsignedintt=0;
floattt=0;
Init_DS18B20();
WriteOneChar(0xCC);
//跳过读序号列号的操作
WriteOneChar(0x44);
//启动温度转换
//跳过读序号列号的操作
WriteOneChar(0xBE);
//读取温度寄存器
a=ReadOneChar();
//连续读两个字节数据//读低8位
b=ReadOneChar();
//读高8位
t=b;
t<
=8;
t=t|a;
//两字节合成一个整型变量。
tt=t*0.0625;
//得到真实十进制温度值,因为DS18B20可以精确到0.0625度,所以读回数据的最低位代表的是0.0625度
t=tt*10+0.5;
//放大十倍,这样做的目的将小数点后第一位也转换为可显示数字,同时进行一个四舍五入操作。
return(t);
voiddisplay()
unsignedintnum,num1;
//定义的时候用uchar宏定义就会出错
unsignedintshi,ge,xiaoshu;
//这里的num,shi,ge,xiaoshu必须用unsignedint无符号整数来表示,用unshignedchar字符型则显示错误
num=Readtemp();
num1=num/10;
if(num1>
37)
{d1=0;
d2=1;
delay(500);
if(num1<
10)
{d1=1;
d2=0;
else
shi=num/100;
ge=num/10%10;
xiaoshu=num%10;
write_com(0x80+0x40+5);
write_date(wendu[shi]);
write_com(0x80+0x40+6);
write_date(wendu[ge]);
write_com(0x80+0x40+7);
write_date(0x2e);
write_com(0x80+0x40+8);
write_date(wendu[xiaoshu]);
init_lcd();
display();
delay(10);
汇编程序
================================================================
DS18B20温度计
采用4位LED共阳显示器显示测温值,显示精度0.1℃,测温范围-55~+125℃
用AT89C51单片机,12MHz晶振
============================常数定义=============================
TIMELEQU0E0H;
20ms,定时器0时间常数
TIMEHEQU0B1H
TEMPHEADEQU36H
==========================工作内存定义============================
BITSTDATA20H
TIME1SOKBITBITST.1
TEMPONEOKBITBITST.2
TEMPLDATA26H
TEMPHDATA27H
TEMPHCDATA28H
TEMPLCDATA29H
=============================引脚定义===========================
TEMPDINBITP3.7
=============================中断向量区=========================
ORG0000H
LJMPSTART
ORG00BH
LJMPT0IT
=============================系统初始化==========================
ORG100H
START:
MOVSP,#60H
CLSMEM:
MOVR0,#20H
MOVR1,#60H
CLSMEM1:
MOV@R0,#00H
INCR0
DJNZR1,CLSMEM1
MOVTMOD,#00100001B;
定时器0工作方式1(16BIT)
MOVTH0,#TIMEL
MOVTL0,#TIMEH;
20ms
SJMPINIT
ERROR:
NOP
LJMPSTART
NOP
INIT:
NOP
SETBET0
SETBTR0
SETBEA
MOVPSW,#00H
CLRTEMPONEOK
LJMPMAIN
======================定时器0中断服务程序=======================
T0IT:
PUSHPSW
MOVPSW,#10H
MOVTH0,#TIMEH
MOVTL0,#TIMEL
INCR7
CJNER7,#32H,T0IT1
MOVR7,#00H
SETBTIME1SOK;
1s定时到标志
T0IT1:
POPPSW
RETI
=============================主程序=============================
MAIN:
LCALLDISP1;
调用显示子程序
JNBTIME1SOK,MAIN
CLRTIME1SOK;
测温每1s一次
JNBTEMPONEOK,MAIN2;
上电时先温度转换一次
LCALLREADTEMP1;
读出温度值子程序
LCALLCONVTEMP;
温度BCD码计算处理子程序
LCALLDISPBCD;
显示区BCD码温度值刷新子程序
LCALLDISP1;
消闪烁,显示一次
MAIN2:
LCALLREADTEMP;
温度转换开始
SETBTEMPONEOK
=============================子程序区===========================
RESETDS18B20
INITDS1820:
SETBTEMPDIN
CLRTEMPDIN
MOVR6,#0A0H;
DELAY480us
DJNZR6,$
MOVR6,#0A0H
SETBTEMPDIN
MOVR6,#32H;
DELAY70us
MOVR6,#3CH
LOOP1820:
MOVC,TEMPDIN
JCINITDS1820OUT
DJNZR6,LOOP1820
MOVR6,#064H
SJMPINITDS1820
RET
INITDS1820OUT:
SETBTEMPDIN
RET
======读DS18B20的程序,从DS18B20中读出一个字节的数据=============
READDS1820:
MOVR7,#08H
SETBTEMPDIN
NOP
READDS1820LOOP:
CLRTEMPDIN
NOP
SETBTEMPDIN
MOVR6,#07H;
DELAY15us
DJNZR6,$
MOVC,TEMPDIN
MOVR6,#3CH;
DELAY120us
RRCA
DJNZR7,READDS1820LOOP
DELAY120us
========写DS18B20的程序,从DS18B20中写一个字节的数据=============
WRITEDS1820:
WRITEDS1820LOP:
MOVTEMPDIN,C
MOVR6,#34H;
DELAY104us
DJNZR7,WRITEDS1820LOP
=========================READTEMP===========================
READTEMP:
LCALLINITDS1820
MOVA,#0CCH
LCALLWRITEDS1820;
SKIPROM
MOVR6,#34H;
DJNZR6,$
MOVA,#44H
STARTCONVERSION
DELAY104
RET
READTEMP1:
LCALLINITDS1820
LCALLWRITEDS1820;
MOVR6,#34H;
MOVA,#0BEH
SCRATCHPAD
MOVR5,#09H
MOVR0,#TEMPHEAD
MOVB,#00H
READTEMP2:
LCALLREADDS1820
MOV@R0,A
INCR0
READTEMP21:
LCALLCRC8CAL
DJNZR5,READTEMP2
MOVA,B
JNZREADTE
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数字 体温计 protues 仿真 程序 资料