本帖最后由 白河 于 2021-12-24 22:57 编辑
如题,18b20温度检测范围有限,想用pt100或热电偶替换,怎么实现?
程序及仿真图如下
#include <reg51.h>
#include <intrins.h>
#include <stdio.h>
/**********************************************************************
端口定义及宏定义
**********************************************************************/
sbit GW=P1^0; //定义P1.0位为高温指示灯
sbit ZC=P1^1; //定义P1.1位为正常指示灯
sbit DW=P1^2; //定义P1.2位为低温指示灯
sbit SR=P1^3; //定义P1.3位为散热电机
sbit JR=P1^4; //定义P1.4位为加热电阻
sbit BUZ=P1^5; //定义P1.5位为高温或低温报警铃
sbit CJ=P3^7; //定义P3.7位为温度采集数据入口
sbit W1=P2^0; //定义P2.0位为数码管第一位选通信号
sbit W2=P2^1; //定义P2.1位为数码管第二位选通信号
sbit W3=P2^2; //定义P2.2位为数码管第三位选通信号
sbit W4=P2^3; //定义P2.3位为数码管第四位选通信号
sbit W5=P2^4; //定义P2.4位为数码管第五位选通信号
sbit W6=P2^5; //定义P2.5位为数码管第六位选通信号
sbit KEY=P2^6; //定义P2.6位为总开关
sbit XSD=P0^7; //定义P0.7位为数码管小数点输入信号
#define XSG P0 //宏定义 定义P0口为数码管显示信息输入端
#define WDSX 80 //宏定义 定义温度上限为80
#define WDXX 40 //宏定义 定义温度下限为40
void delay1(unsigned char i); //定义延时函数
void delay2(unsigned int t); //定义延时函数,延时11us
void GWCL(); //定义高温处理函数
void DWCL(); //定义低温处理函数
void ZCCL(); //定义正常处理函数
Init_DS18B20(void); //DS18B20的初始化函数
Readonechar(void); //读一个字节函数
Writeonechar(unsigned int dat); //写一个字节函数
Readtemperature(void); //读取温度函数
void XS(unsigned int B,unsigned int S,unsigned int G); //定义显示函数
/**********************************************************************
主函数
**********************************************************************/
main()
{
unsigned int temp,b,s,g; //定义显示值,百位,十位,个位
if(KEY)
{
temp=Readtemperature(); //读取温度值
b=temp/100; //计算温度百位值
s=(temp%100)/10; //计算温度十位值
g=(temp%100)%10; //计算温度个位值
XS(b,s,g); //调用显示函数
if(temp>WDSX) //判断温度是否高于规定温度
{
GWCL(); //调用高温处理函数
}
else if(temp<WDXX) //判断温度是否低于规定温度
{
DWCL(); //调用低温处理函数
}
else
{
ZCCL(); //正常函数
}
}
}
/**********************************************************************
延时函数1
**********************************************************************/
void delay1(unsigned char i)
{
unsigned char j;
for(i;i>0;i--)
{
for(j=256;j>0;j--);
}
}
/**********************************************************************
短暂延时(11us)
**********************************************************************/
void delay2(unsigned int t)
{
while(t--);
}
/**********************************************************************
高温处理函数
**********************************************************************/
void GWCL()
{
ZC=1; //关闭正常指示灯
DW=1; //关闭低温指示灯
JR=1; //关闭加热电阻
GW=0; //高温指示灯亮
BUZ=0; //报警铃响
SR=0; //散热电机转动
}
/**********************************************************************
低温处理函数
**********************************************************************/
void DWCL()
{
ZC=1; //关闭正常指示灯
GW=1; //关闭高温指示灯
SR=1; //关闭散热电机
DW=0; //低温指示灯亮
BUZ=0; //报警铃响
JR=0; //加热电阻工作
}
/**********************************************************************
正常处理函数
**********************************************************************/
void ZCCL()
{
GW=1; //关闭高温指示灯
SR=1; //关闭散热电机
DW=1; //关闭低温指示灯
JR=1; //关闭加热电阻
BUZ=1; //关闭蜂鸣器
ZC=0; //正常指示灯亮
}
/**********************************************************************
DS18B20初始化函数
**********************************************************************/
Init_DS18B20(void)
{
unsigned int x=0;
CJ=1; //CJ的复位信号
delay2(8); //延时
CJ=0; //将CJ电平拉低
delay2(80); //延时大于480ms以上
CJ=1; //将CJ电平拉高
delay2(14); //延时60us以上
x=CJ; //如果x=1,初始化失败,如果x=0,初始化成功
delay2(20); //延时
}
/**********************************************************************
写一个字节
**********************************************************************/
Writeonechar(unsigned int dat)
{
unsigned int i=0;
for(i=8;i>0;i--)
{
CJ=0; //低电平脉冲信号
CJ=dat&0x01; //最低位移出
delay2(5);
CJ=1; //高电平信号
dat>>=1; //dat右移一位,最高位补0
}
delay2(4);
}
/**********************************************************************
读取一个字节
**********************************************************************/
Readonechar(void)
{
unsigned int i=0;
unsigned int dat=0;
for(i=8;i>0;i--)
{
CJ=0; //低电平脉冲信号
dat>>=1; //dat右移一位,最高位补0
CJ=1; // 高电平脉冲信号
if(CJ)
{
dat|=0x80;
}
delay2(4); //延时
}
return(dat); //返回dat值
}
/**********************************************************************
读取温度
**********************************************************************/
Readtemperature(void)
{
unsigned int L=0; //定义温度低八位
unsigned int H=0; //定义温度高八位
unsigned int tem;
Init_DS18B20();
Writeonechar(0xCC); //跳过读序列号操作
Writeonechar(0x44); //启动温度转换
Init_DS18B20();
Writeonechar(0xCC); //跳过读序列号操作
Writeonechar(0xBE); //读取温度寄存器
L = Readonechar(); //读取温度值低位
H = Readonechar(); //读取温度值高位
L=L>>4;
tem=H<<4;
tem=tem|L;
return (tem);
}
/**********************************************************************
数码管显示函数
**********************************************************************/
void XS(unsigned int B,unsigned int S,unsigned int G)
{
unsigned char code TAB[]={0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,
0xc6,0xa1,0x86,0x8e,
0x9c}; //数码管段码表
XSG=TAB[B];
W1=1; //选通数码管第一位
delay1(200); //延时
W1=0; //关闭数码管第一位
W2=1;
XSG=TAB[S];
delay1(200);
W2=0;
W3=1;
XSG=TAB[G];
XSD=0; //显示小数点
delay1(200);
W3=0;
W4=1;
XSG=TAB[0];
delay1(200);
W4=0;
W5=1;
XSG=TAB[16]; //显示“。”
delay1(100);
W5=0;
W6=1;
XSG=TAB[12]; //显示“C”
delay1(100);
W6=0;
}
|