要实现 OLED 显示温度并多次读取的功能,您可以采用如下步骤:
1 硬件准备:首先需要准备好一个 OLED 屏幕模块和一个温度传感器模块,比如 DS18B20,以及相应的连接线。将 OLED 屏幕模块和温度传感器模块按照引脚对应连接起来。
2 软件编程:根据您所使用的开发板和编程语言,编写相应程序。可以使用一些已有的库或示例代码,如 Adafruit_SSD1306、Adafruit_GFX、OneWire 等库,这些库可以帮助您轻松控制 OLED 屏幕和温度传感器。
3 测试和调试:将程序通过开发板上传到硬件上,然后观察 OLED 屏幕是否显示出温度数值,并且多次读取温度数值进行测试。如果出现问题,可以通过调试程序来查找问题。
总之,OLED 显示温度并多次读取的功能实现需要注意硬件和软件两个方面的准备与实现,具体步骤可以根据您所使用的具体硬件和编程环境进行相应的调整。要实现 OLED 显示温度并多次读取的功能,您可以采用如下步骤:
1 硬件准备:首先需要准备好一个 OLED 屏幕模块和一个温度传感器模块,比如 DS18B20,以及相应的连接线。将 OLED 屏幕模块和温度传感器模块按照引脚对应连接起来。
2 软件编程:根据您所使用的开发板和编程语言,编写相应程序。可以使用一些已有的库或示例代码,如 Adafruit_SSD1306、Adafruit_GFX、OneWire 等库,这些库可以帮助您轻松控制 OLED 屏幕和温度传感器。
3 测试和调试:将程序通过开发板上传到硬件上,然后观察 OLED 屏幕是否显示出温度数值,并且多次读取温度数值进行测试。如果出现问题,可以通过调试程序来查找问题。
总之,OLED 显示温度并多次读取的功能实现需要注意硬件和软件两个方面的准备与实现,具体步骤可以根据您所使用的具体硬件和编程环境进行相应的调整。
程序如下:
知道传感器的量程;
传感器输出4-20MA的接入PLC模拟量模块;
按照公式在PLC内部四则运算即可:PLC的读数VW10={[(AIW0-6400)x(传感器最大值-传感器最小值)]/(32000-6400)}+传感器最小值。
1plc简介:
可编程逻辑控制器是种专门为在工业环境下应用而设计的数字运算 *** 作电子系统。它采用一种可编程的存储器,在其内部存储执行逻辑运算、顺序控制、定时、计数和算术运算等 *** 作的指令,通过数字式或模拟式的输入输出来控制各种类型的机械设备或生产过程。
2优点:
(1)可靠性高。由于PLC大都采用单片微型计算机,因而集成度高,再加上相应的保护电路及自诊断功能,提高了系统的可靠性。
(2)编程容易。PLC的编程多采用继电器控制梯形图及命令语句,其数量比微型机指令要少得多,除中、高档PLC外,一般的小型PLC只有16条左右。由于梯形图形象而简单,因此容易掌握、使用方便,甚至不需要计算机专业知识,就可进行编程。
(3)组态灵活。由于PLC采用积木式结构,用户只需要简单地组合,便可灵活地改变控制系统的功能和规模,因此,可适用于任何控制系统。
(4)输入/输出功能模块齐全。PLC的最大优点之一,是针对不同的现场信号(如直流或交流、开关量、数字量或模拟量、电压或电流等),均有相应的模板可与工业现场的器件(如按钮、开关、传感电流变送器、电机启动器或控制阀等)直接连接,并通过总线与CPU主板连接。
整定公式为:(AIW - 6400)/25600 790 - 40。
首先,在西门子S7-200系列PLC中,0-20mA对应的数据范围为0到32000,4mA多对应的数值是6400,同理,4-20mA的数据值范围是6400到32000,这也就对应了所需的温度-40度到750度。
下一步,设模拟量的标准电信号为A0-Am(例如4-20mA),A/D转换后数值为D0-Dm(例如6400-32000),设模拟量的标准电信号是A,A/D转换后的相应数值为D。
然后,由于是线性关系,函数关系A=f(D)可以表示为数学方程:A=(D-D0)×(Am-A0)/(Dm-D0)+A0。标准化输出信号主要为0mA~10mA和4mA~20mA(或1V~5V)的直流电信号。
最后,不排除具有特殊规定的其他标准化输出信号。温度变送器按供电接线方式可分为两线制和四线制,除RWB型温度变送器为三线制外。
根据该方程式,编译并运行程序,观察程序状态,对照仪表显示值即得出温度的显示。
扩展资料温度变送器常见故障:
温度变送器技术已经非常成熟了,在各工厂中非常常见,温度变送器经常和一些仪表配套使用,在配套使用过程中经常有一些小的故障。比较常见的故障及解决方法如下。
1、被测介质温度升高或者降低时变送器输出没有变化,这种情况大多是温度变送器密封的问题,可能是由于温度变送器没有密封好或者是在焊接的时候不小心将传感器焊了个小洞,这种情况一般需要更换变送器外壳才能解决。
2、输出信号不稳定,这种原因是温度源本事的原因,温度源本事就是一个不稳定的温度,如果是仪表显示不稳定,那就是仪表的抗干扰能力不强的原因。
3、变送器输出误差大,这种情况原因就比较多,可能是选用的温度变送器的电阻丝不对导致量程错误,也有可以能是变送器出厂的时候没有标定好。
温度变送器故障排除:
1、因为温度变送器的三阀组漏气或堵塞造成误差出现。
2、温度变送器的零位偏高(或低),造成静、差压值偏大(或小),使计算气量比实际气量偏大(或小)。
3、温度变送器的准确度等级和量程范围选择不正确,或没有按照GB/T18603-2001《天然气计量系统技术要求》要求进行选型导致计量附加误差。
这是延时时间的问题
#include<reg52h>
#include"ds18b20h"
#define uchar unsigned char
#define uint unsigned int
sbit DQ=P3^3;
uchar temp_data[4];
/
函数名: void delay_us(uint xus)
功能: 延时时间为6us
调用函数:无
输入参数:xms,6us计数
输出参数:无
说明:总共延时时间为6us乘以xms,crystal=12Mhz
/
void delay_us(uint xus)
{
while(xus--);
}
/
函数名: DS18B20_init(void)
功能: DS18B20初始化
调用函数: void delay_us(uint xus);
输入参数: 无
输出参数: yes0
/
DS18B20_init(void)
{
uchar yes0;
DQ=1; //复位
delay_us(8); //延时
DQ=0; //单片机将DQ拉低
delay_us(90); //精确延时大于480us
DQ=1; //拉高总线
delay_us(8);
yes0=DQ; //如果yse0=0;则初始化成功,否则失败
delay_us(100);
DQ=1;
return(yes0); //返回信号
}
/
函数名: void Write_onebyte(uchar dat)
功能: 写入数据
调用函数: void delay_us(uint xus);
输入参数: uchar dat
输出参数: 无
/
void Write_onebyte(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
DQ=0;
DQ=dat&0x01;
delay_us(4);
DQ=1;
dat>>=1;
}
delay_us(4);
}
/
函数名: Read_onebyte(void)
功能: 读取数据
调用函数: void delay_us(uint xus);
输入参数: 无
输出参数: dat
/
Read_onebyte(void)
{
uchar i,dat=0;
for(i=0;i<8;i++)
{
DQ=0;
dat>>=1;
DQ=1;
if(DQ)
dat|=0x80;
delay_us(4);
}
return(dat);
}
/
函数名: void get_temperature()
功能: 读取温度值,处理温度数据
调用函数: Read_onebyte(void);void Write_onebyte(uchar dat);
void delay_us(uint xus);
输入参数: 无
输出参数: 无
/
void get_temperature()
{
uchar sign=0; //定义符号标志位
uint temp; //定义温度数据暂存
uchar temp_comp; //用来存放测量温度的整数部分
while(DS18B20_init()); //等待18B20初始化
Write_onebyte(0xcc); // 跳过rom
Write_onebyte(0x44); //启动温度检测
delay_us(300); //延时等待转换结束
while(DS18B20_init());
Write_onebyte(0xcc);
Write_onebyte(0xbe);
temp_data[0]=Read_onebyte(); //温度低8位
temp_data[1]=Read_onebyte(); //温度高8位
if(temp_data[1]>127)
{
temp_data[0]=(~temp_data[0])+1;
if((~temp_data[0])>=0xff)
{
temp_data[1]=(~temp_data[1])+1;
}
else
{
temp_data[1]=~temp_data[1];
sign=1;
}
}
temp=(temp_data[0]&0x0f)625;
temp_comp=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4); //取温度整数部分
disp_temp[0]=temp_comp/100+'0';
disp_temp[1]=temp_comp/10%10+'0';
disp_temp[2]=temp_comp%10+'0';
disp_temp[3]='';
disp_temp[4]=temp/1000+'0';
disp_temp[5]=temp/100%10+'0';
disp_temp[6]=temp/10%10+'0';
disp_temp[7]=temp%10+'0';
disp_temp[8]='\0';
if(disp_temp[0]=='0')
{
disp_temp[0]=0x20;
if(disp_temp[1]=='0')
{
disp_temp[1]=0x20;
}
}
}
C语言CPU测试温度程序
// Target : M8
// Crystal: 80000Mhz
/
不可在RESET时做LCD显示,因为DS18B20的复位回应时间只有80us,显示一个字符的时间
远大于这个值
/
#include <iom8vh>
#include <macrosh>
#include "1602Driverh"
#define Set_DQ1 DDRC |= 0x08; PORTC |= 0x08; //总线拉高
#define Set_DQ0 DDRC |= 0x08; PORTC &= 0xf7; //总线置低
#define Read_DQ PINC&0x08 //读总线
#define MatchROM 0xcc //匹配ROM
#define WriteMode 0x4e //写模式
#define TH 0x64 //设置温度上限100
#define TL 0x8a //设置温度下限-10
#define MatchTemp 0x7f //写温度匹配寄存器,12bit
#define ConverTem 0x44 //DS18B20温度转换命令
#define Get_Value 0xbe //读取温度寄存器值
char DelayMs = 0;
void port_init(void)
{
DDRD = 0xff;
PORTD = 0xff;
DDRB = 0xff;
PORTB = 0xff;
DDRC = 0xff;
PORTC = 0xff;
}
//TIMER1 initialize - prescale:1
// WGM: 0) Normal, TOP=0xFFFF
// desired value: 15uSec
// actual value: 14875uSec (08%)
void timer1_init(void)
{
TCCR1B = 0x00; //stop
TCNT1H = 0xFF; //setup
TCNT1L = 0x89;
OCR1AH = 0x00;
OCR1AL = 0x77;
OCR1BH = 0x00;
OCR1BL = 0x77;
ICR1H = 0x00;
ICR1L = 0x77;
TCCR1A = 0x00;
TCCR1B = 0x01; //start Timer
}
#pragma interrupt_handler timer1_ovf_isr:9
void timer1_ovf_isr(void)
{
//TIMER1 has overflowed
TCNT1H = 0xFF; //reload counter high value
TCNT1L = 0x89; //reload counter low value
if (DelayMs > 0)
{
DelayMs --;
}
}
void Delay_15us(unsigned int n)
/---Ms延时函数---/
{
DelayMs=n;
while(DelayMs > 0);
}
/
功能:主机向总线写0
/
void Writr0(void)
{
Set_DQ1;
Set_DQ0;
Delay_15us(5);
Set_DQ1;
Delay_15us(1);
}
/
功能:主机向总线写1
/
void Writr1(void)
{
Set_DQ1;
Set_DQ0;
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
Set_DQ1;
Delay_15us(2);
}
/
功能:向总线写一个字节
输入:需要写的字
/
void WriteBits(char Byte)
{
char i = 0;
for (i=0;i<8;i++)
{
if (Byte & 0x01)
{
Writr1();
}
else
{
Writr0();
}
Byte>>=1;
}
}
/
功能:DS18B20复位程序
返回:总线复位成功,返回1
/
char Reset1820(void)
{
static char CheckTimes = 0;
static char CheckValue = 1;
Delay_nms(1);
Set_DQ1;
Set_DQ0; //拉低总线480us
Delay_15us(34);
Set_DQ1;
DDRC &= 0xf7; //设置端口为输入状态,读取数据
PORTC |= 0x08;
while(PINC&0x08); //等待,直至确认复位成功
CheckValue = Read_DQ;
Delay_15us(32);
return CheckValue;
}
void Init1820(void)
{
if (Reset1820() == 0x08)
{
LCD_Write_String(0,0,"1820 Not Detect!");
LCD_Write_String(0,1," ");
}
else
{
LCD_Write_String(0,0,"Init DS18B20 OK!");
LCD_Write_String(0,1," ");
}
WriteBits(MatchROM);
WriteBits(WriteMode);
WriteBits(TH);
WriteBits(TL);
WriteBits(MatchTemp);
}
/
功能:从总线中读取数据位
返回:读取值
/
char ReadBit(void)
{
char i = 0;
char Read_Value = 0;
Set_DQ1;
Set_DQ0;
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
Set_DQ1;
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
DDRC &= 0xf7; //设置端口为输入状态,读取数据
PORTC |= 0x08;
asm("nop");
Read_Value = Read_DQ;
Delay_15us(3);
return Read_Value;
}
/
功能:从总线读取一个字节
返回:读取到的字符
/
char ReadBits(void)
{
char i = 0;
char b = 0;
char ReadBits_Value = 0;
for (i=8;i>0;i--)
{
ReadBits_Value = ReadBits_Value>>1;
b = ReadBit();
if(b)
{
ReadBits_Value = ReadBits_Value|0x80;
}
}
//DEC_Num_Disp(0,1,ReadBits_Value,5);
return ReadBits_Value;
}
/
功能:获得温度值
返回:温度值--摄氏温度
/
char Get_Temperature(void)
{
static int TempLow = 0;
static int TempHi = 0;
static char Temp2 = 0;
static long final = 0;
static Sign = 0; //温度的符号位
Reset1820();
WriteBits(MatchROM);
WriteBits(ConverTem);
//Delay_15us(6);
Reset1820();
WriteBits(MatchROM);
WriteBits(Get_Value);
Delay_15us(5);
TempLow = ReadBits(); //温度低位
Delay_15us(5);
Temp2 = ReadBits();
Sign = Temp2&0xf8; //符号位取高5位
TempHi = Temp2&0x07; //温度高位
if (Sign == 0) //正温的数据处理
{
final = (((TempHi)<<8)|TempLow)625;
LCD_Write_String(0,1," ");
}
else
{
final = (~(((TempHi)<<8)|TempLow)+1)625;
LCD_Write_String(0,1,"-");
}
if (final >= 37400)
{
LCD_Write_String(10,1,"Fever!");
}
if ((final < 37400)&(final>36000))
{
LCD_Write_String(10,1,"Normal");
}
if (final<=36000)
{
LCD_Write_String(10,1,"Low! ");
}
Point_Disp(1,1,final,6,3);
return final;
}
//call this routine to initialize all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
port_init();
timer1_init();
LCD_Init();
LCD_Write_Char(0x01,0); //清屏
MCUCR = 0x00;
GICR = 0x00;
TIMSK = 0x04; //timer interrupt sources
SEI(); //re-enable interrupts
//all peripherals are now initialized
}
void main(void)
{
init_devices();
Delay_nms(5);
LCD_Write_String(0,0,"1820 Not Detect!");
LCD_Write_String(0,1,"Reset after sure");
Init1820();
Delay_nms(100);
LCD_Write_String(0,0,"Body Temp Test:");
LCD_Write_String(0,1," C ");
while(1)
{
Get_Temperature();
}
}
以上就是关于oled显示温度多次读取全部的内容,包括:oled显示温度多次读取、PLC采集温度程序是什么、西门子plc200 温度变送器输入4-20mA 模块em231 如何编程读出温度,-40到750摄氏度等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)