数字体温计protues仿真图和程序资料.docx
- 文档编号:4575698
- 上传时间:2022-12-06
- 格式:DOCX
- 页数:24
- 大小:394.35KB
数字体温计protues仿真图和程序资料.docx
《数字体温计protues仿真图和程序资料.docx》由会员分享,可在线阅读,更多相关《数字体温计protues仿真图和程序资料.docx(24页珍藏版)》请在冰豆网上搜索。
数字体温计protues仿真图和程序资料
系统程序
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitBUFFER=P1^5;
sbitDQ=P3^7;
sbitlcdrs=P2^6;
sbitlcden=P2^7;
sbitlcdrw=P2^5;
sbitAN=P2^0;
sbitAM=P2^1;
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);//跳过ROM
write_byte(0x44);//启动温度测量
delay(200);//给出温度测量时间
init_ds18b20();
write_byte(0xcc);//跳过ROM
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]+'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);
}
仿真图
程序清单
#include
#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)
{
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;//稍做延时后如果x=0则初始化成功x=1则初始化失败
tmpDelay(20);
}
unsignedcharReadOneChar()//读一个字节
{
unsignedchari=0;
unsignedchardat=0;
for(i=8;i>0;i--)
{
DQ=0;//给脉冲信号
dat>>=1;
DQ=1;//给脉冲信号
if(DQ)
dat|=0x80;
tmpDelay(4);
}
return(dat);
}
voidWriteOneChar(unsignedchardat)//写一个字节
{
unsignedchari=0;
for(i=8;i>0;i--)
{
DQ=0;
DQ=dat&0x01;
tmpDelay(5);
DQ=1;
dat>>=1;
}
}
unsignedintReadtemp()//读取温度
{
unsignedchara=0;
unsignedcharb=0;
unsignedintt=0;
floattt=0;
Init_DS18B20();
WriteOneChar(0xCC);//跳过读序号列号的操作
WriteOneChar(0x44);//启动温度转换
Init_DS18B20();
WriteOneChar(0xCC);//跳过读序号列号的操作
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;delay(500);}
else
{d1=1;d2=1;}
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]);
}
voidmain()
{
init_lcd();
while
(1)
{
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
LJMPMAIN
;=============================子程序区===========================
;RESETDS18B20
;================================================================
INITDS1820:
SETBTEMPDIN
NOP
NOP
CLRTEMPDIN
MOVR6,#0A0H;DELAY480us
DJNZR6,$
MOVR6,#0A0H
DJNZR6,$
SETBTEMPDIN
MOVR6,#32H;DELAY70us
DJNZR6,$
MOVR6,#3CH
LOOP1820:
MOVC,TEMPDIN
JCINITDS1820OUT
DJNZR6,LOOP1820
MOVR6,#064H
DJNZR6,$
SJMPINITDS1820
RET
INITDS1820OUT:
SETBTEMPDIN
RET
;======读DS18B20的程序,从DS18B20中读出一个字节的数据=============
READDS1820:
MOVR7,#08H
SETBTEMPDIN
NOP
NOP
READDS1820LOOP:
CLRTEMPDIN
NOP
NOP
NOP
SETBTEMPDIN
MOVR6,#07H;DELAY15us
DJNZR6,$
MOVC,TEMPDIN
MOVR6,#3CH;DELAY120us
DJNZR6,$
RRCA
SETBTEMPDIN
DJNZR7,READDS1820LOOP
MOVR6,#3CH;DELAY120us
DJNZR6,$
RET
;========写DS18B20的程序,从DS18B20中写一个字节的数据=============
WRITEDS1820:
MOVR7,#08H
SETBTEMPDIN
NOP
NOP
WRITEDS1820LOP:
CLRTEMPDIN
MOVR6,#07H;DELAY15us
DJNZR6,$
RRCA
MOVTEMPDIN,C
MOVR6,#34H;DELAY104us
DJNZR6,$
SETBTEMPDIN
DJNZR7,WRITEDS1820LOP
RET
;=========================READTEMP===========================
READTEMP:
LCALLINITDS1820
MOVA,#0CCH
LCALLWRITEDS1820;SKIPROM
MOVR6,#34H;DELAY104us
DJNZR6,$
MOVA,#44H
LCALLWRITEDS1820;STARTCONVERSION
MOVR6,#34H;DELAY104
DJNZR6,$
RET
READTEMP1:
LCALLINITDS1820
MOVA,#0CCH
LCALLWRITEDS1820;SKIPROM
MOVR6,#34H;DELAY104us
DJNZR6,$
MOVA,#0BEH
LCALLWRITEDS1820;SCRATCHPAD
MOVR6,#34H;DELAY104us
DJNZR6,$
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 仿真 程序 资料