173 2438 5004
KEROS加密芯片——品牌直销 | 免费样品 | 技术支持
当前位置:网站首页 > 资讯中心 正文 资讯中心

单片机采集温度输出数码管

htxw 2023-03-15 资讯中心 24 ℃

51单片机的温度采集系统设计

第一章 确定系统功能与性能

本系统的功能主要有数据采集、数据处理、输出控制。能对0~1000 �0�2c范围内的各种电加热炉的温度进行精密测量,同时,四位LED显示器直接跟踪显示被控对象的温度值,准确度高,显示清晰,稳定可靠,使用方便(在具体设计编程、调试过程中,为了调试方便,编程把温度范围设在0~100 �0�2c)。

本系统的原理框图如下图所示。

数据采集部分能完成对被测信号的采样,显示分辨率0.1�0�2c,测量精度0.1�0�2c,控制精度0.1�0�2c,可以实现采集信号的放大及A/D转换,并自动进行零漂校正,同时按设定值、所测温度值、温度变化速率,自动进行FID参数自整定和运算,并输出0~10mA控制电流,配以主回路实现温度的控制。数据处理分为预处理、功能性处理、抗干扰等子功能。输出控制部分主要是数码管显示控制。

第二章 确定系统基本结构及硬件设计

本单片机应用系统结构是以单片机为核心外部扩展相关电路的形式。确定了系统中的单片机、存储器分配及输入/输出方式就可大体确定出单片机应用系统的基本组成。

1)单片机选用MCS-51系统的8031

8031是INTEL公司MCS-51系列单片机中最基本的产品,它采用INTEL公司可靠的CHMOS工艺技术制造的高性能8位单片机,属于标准的MCS-51的HCMOS产品。它结合了HMOS的高速和高密度技术及CHMOS的低功耗特征,标准MCS-51单片机的体系结构和指令系统。

8031内置中央处理单元、128字节内部数据存储器RAM、32个双向输入/输出(I/O)口、2个16位定时/计数器和5个两级中断结构,一个全双工串行通信口,片内时钟振荡电路。但80C31片内并无程序存储器,需外接ROM。

此外,8031还可工作于低功耗模式,可通过两种软件选择空闲和掉电模式。在空闲模式下冻结CPU而RAM定时器、串行口和中断系统维持其功能。掉电模式下,保存RAM数据,时钟振荡停止,同时停止芯片内其它功能。8031有PDIP(40pin)和PLCC(44pin)两种封装形式。

主要功能特性:

· 标准MCS-51内核和指令系统

· 外部程序存储器ROM地址空间64kB

· 32个可编程双向I/O口

· 128x8bit内部RAM(可扩充64kB外部存储器)

· 2个16位可编程定时/计数器

· 时钟频率3.5-16MHz

· 5个中断源

· 5.0V工作电压

· 全双工串行通信口

· 布尔处理器

· 2层优先级中断结构

· 兼容TTL和CMOS逻辑电平

· PDIP(40)和PLCC(44)封装形式

用8051单片机做温度采集与显示(LED数码管)请问用C语言怎么写。给个例程

#includereg52.h //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义

#includestdio.h

#include "18b20.h"

#include "1602.h"

#include "delay.h"

bit ReadTempFlag;//定义读时间标志

void Init_Timer0(void);//定时器初始化

/*------------------------------------------------

串口通讯初始化

------------------------------------------------*/

void UART_Init(void)

{

SCON = 0x50; // SCON: 模式 1, 8-bit UART, 使能接收

TMOD |= 0x20; // TMOD: timer 1, mode 2, 8-bit 重装

TH1 = 0xFD; // TH1: 重装值 9600 波特率 晶振 11.0592MHz

TR1 = 1; // TR1: timer 1 打开

//EA = 1; //打开总中断

//ES = 1; //打开串口中断

TI=1;

}

/*------------------------------------------------

主函数

------------------------------------------------*/

void main (void)

{

int temp;

float temperature;

char displaytemp[16];//定义显示区域临时存储数组

LCD_Init(); //初始化液晶

DelayMs(20); //延时有助于稳定

LCD_Clear(); //清屏

Init_Timer0();

UART_Init();

Lcd_User_Chr(); //写入自定义字符

LCD_Write_String(0,0," ");

LCD_Write_Char(13,1,0x01);//写入温度右上角点

LCD_Write_Char(14,1,'C'); //写入字符C

while (1) //主循环

{

if(ReadTempFlag==1)

{

ReadTempFlag=0;

temp=ReadTemperature();

temperature=(float)temp*0.0625;

sprintf(displaytemp,"Temp % 7.3f",temperature);//打印温度值

LCD_Write_String(0,1,displaytemp);//显示第二行

}

}

}

/*------------------------------------------------

定时器初始化子程序

------------------------------------------------*/

void Init_Timer0(void)

{

TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响

//TH0=0x00; //给定初值

//TL0=0x00;

EA=1; //总中断打开

ET0=1; //定时器中断打开

TR0=1; //定时器开关打开

}

/*------------------------------------------------

定时器中断子程序

------------------------------------------------*/

void Timer0_isr(void) interrupt 1

{

static unsigned int num;

TH0=(65536-2000)/256; //重新赋值 2ms

TL0=(65536-2000)%256;

num++;

if(num==300) //

{

num=0;

ReadTempFlag=1; //读标志位置1

}

}

/*-----------------------------------------------

名称:LCD1602

论坛:

编写:shifang

日期:2009.5

修改:无

内容:

引脚定义如下:1-VSS 2-VDD 3-V0 4-RS 5-R/W 6-E 7-14 DB0-DB7 15-BLA 16-BLK

------------------------------------------------*/

#include "1602.h"

#include "delay.h"

sbit RS = P2^4; //定义端口

sbit RW = P2^5;

sbit EN = P2^6;

#define RS_CLR RS=0

#define RS_SET RS=1

#define RW_CLR RW=0

#define RW_SET RW=1

#define EN_CLR EN=0

#define EN_SET EN=1

#define DataPort P0

/*------------------------------------------------

判忙函数

------------------------------------------------*/

bit LCD_Check_Busy(void)

{

DataPort= 0xFF;

RS_CLR;

RW_SET;

EN_CLR;

_nop_();

EN_SET;

return (bit)(DataPort 0x80);

}

/*------------------------------------------------

写入命令函数

------------------------------------------------*/

void LCD_Write_Com(unsigned char com)

{

// while(LCD_Check_Busy()); //忙则等待

DelayMs(5);

RS_CLR;

RW_CLR;

EN_SET;

DataPort= com;

_nop_();

EN_CLR;

}

/*------------------------------------------------

写入数据函数

------------------------------------------------*/

void LCD_Write_Data(unsigned char Data)

{

//while(LCD_Check_Busy()); //忙则等待

DelayMs(5);

RS_SET;

RW_CLR;

EN_SET;

DataPort= Data;

_nop_();

EN_CLR;

}

/*------------------------------------------------

清屏函数

------------------------------------------------*/

void LCD_Clear(void)

{

LCD_Write_Com(0x01);

DelayMs(5);

}

/*------------------------------------------------

写入字符串函数

------------------------------------------------*/

void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s)

{

if (y == 0)

{

LCD_Write_Com(0x80 + x); //表示第一行

}

else

{

LCD_Write_Com(0xC0 + x); //表示第二行

}

while (*s)

{

LCD_Write_Data( *s);

s ++;

}

}

/*------------------------------------------------

写入字符函数

------------------------------------------------*/

void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data)

{

if (y == 0)

{

LCD_Write_Com(0x80 + x);

}

else

{

LCD_Write_Com(0xC0 + x);

}

LCD_Write_Data( Data);

}

/*------------------------------------------------

初始化函数

------------------------------------------------*/

void LCD_Init(void)

{

LCD_Write_Com(0x38); /*显示模式设置*/

DelayMs(5);

LCD_Write_Com(0x38);

DelayMs(5);

LCD_Write_Com(0x38);

DelayMs(5);

LCD_Write_Com(0x38);

LCD_Write_Com(0x08); /*显示关闭*/

LCD_Write_Com(0x01); /*显示清屏*/

LCD_Write_Com(0x06); /*显示光标移动设置*/

DelayMs(5);

LCD_Write_Com(0x0C); /*显示开及光标设置*/

}

/*------------------------------------------------

设定二个自定义字符,LCD1602中自定义字符的地址为0x00--0x07,

即可定义8个字符

这里我们设定把一个自定义字符放在0x00位置(000),

另一个放在0x01位子(001)

------------------------------------------------*/

void Lcd_User_Chr(void)

{ //第一个自定义字符

LCD_Write_Com(0x40); //"01 000 000" 第1行地址 (D7D6为地址设定命令形式D5D4D3为字符存放位置(0--7),D2D1D0为字符行地址(0--7))

LCD_Write_Data(0x00); //"XXX 11111" 第1行数据(D7D6D5为XXX,表示为任意数(一般用000),D4D3D2D1D0为字符行数据(1-点亮,0-熄灭)

LCD_Write_Com(0x41); //"01 000 001" 第2行地址

LCD_Write_Data(0x04); //"XXX 10001" 第2行数据

LCD_Write_Com(0x42); //"01 000 010" 第3行地址

LCD_Write_Data(0x0e); //"XXX 10101" 第3行数据

LCD_Write_Com(0x43); //"01 000 011" 第4行地址

LCD_Write_Data(0x0e); //"XXX 10001" 第4行数据

LCD_Write_Com(0x44); //"01 000 100" 第5行地址

LCD_Write_Data(0x0e); //"XXX 11111" 第5行数据

LCD_Write_Com(0x45); //"01 000 101" 第6行地址

LCD_Write_Data(0x1f); //"XXX 01010" 第6行数据

LCD_Write_Com(0x46); //"01 000 110" 第7行地址

LCD_Write_Data(0x04); //"XXX 11111" 第7行数据

LCD_Write_Com(0x47); //"01 000 111" 第8行地址

LCD_Write_Data(0x00); //"XXX 00000" 第8行数据

//第二个自定义字符

LCD_Write_Com(0x48); //"01 001 000" 第1行地址

LCD_Write_Data(0x03); //"XXX 00001" 第1行数据

LCD_Write_Com(0x49); //"01 001 001" 第2行地址

LCD_Write_Data(0x03); //"XXX 11011" 第2行数据

LCD_Write_Com(0x4a); //"01 001 010" 第3行地址

LCD_Write_Data(0x00); //"XXX 11101" 第3行数据

LCD_Write_Com(0x4b); //"01 001 011" 第4行地址

LCD_Write_Data(0x00); //"XXX 11001" 第4行数据

LCD_Write_Com(0x4c); //"01 001 100" 第5行地址

LCD_Write_Data(0x00); //"XXX 11101" 第5行数据

LCD_Write_Com(0x4d); //"01 001 101" 第6行地址

LCD_Write_Data(0x00); //"XXX 11011" 第6行数据

LCD_Write_Com(0x4e); //"01 001 110" 第7行地址

LCD_Write_Data(0x00); //"XXX 00001" 第7行数据

LCD_Write_Com(0x4f); //"01 001 111" 第8行地址

LCD_Write_Data(0x00); //"XXX 00000" 第8行数据

}

#include"delay.h"

#include"18b20.h"

/*------------------------------------------------

18b20初始化

------------------------------------------------*/

bit Init_DS18B20(void)

{

bit dat=0;

DQ = 1; //DQ复位

DelayUs2x(5); //稍做延时

DQ = 0; //单片机将DQ拉低

DelayUs2x(200); //精确延时 大于 480us 小于960us

DelayUs2x(200);

DQ = 1; //拉高总线

DelayUs2x(50); //15~60us 后 接收60-240us的存在脉冲

dat=DQ; //如果x=0则初始化成功, x=1则初始化失败

DelayUs2x(25); //稍作延时返回

return dat;

}

/*------------------------------------------------

读取一个字节

------------------------------------------------*/

unsigned char ReadOneChar(void)

{

unsigned char i=0;

unsigned char dat = 0;

for (i=8;i0;i--)

{

DQ = 0; // 给脉冲信号

dat=1;

DQ = 1; // 给脉冲信号

if(DQ)

dat|=0x80;

DelayUs2x(25);

}

return(dat);

}

/*------------------------------------------------

写入一个字节

------------------------------------------------*/

void WriteOneChar(unsigned char dat)

{

unsigned char i=0;

for (i=8; i0; i--)

{

DQ = 0;

DQ = dat0x01;

DelayUs2x(25);

DQ = 1;

dat=1;

}

DelayUs2x(25);

}

/*------------------------------------------------

读取温度

------------------------------------------------*/

unsigned int ReadTemperature(void)

{

unsigned char a=0;

unsigned int b=0;

unsigned int t=0;

Init_DS18B20();

WriteOneChar(0xCC); // 跳过读序号列号的操作

WriteOneChar(0x44); // 启动温度转换

DelayMs(10);

Init_DS18B20();

WriteOneChar(0xCC); //跳过读序号列号的操作

WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度

a=ReadOneChar(); //低位

b=ReadOneChar(); //高位

b=8;

t=a+b;

return(t);

}

单片机串口传输数据DS18B20温度数据,数码管显示每隔几秒发生一次跳动到别的数字然后还原,是什么问题

明显是程序的问题

先把程序分成几个部分,让每个部分单独工作,看看有没有问题,如果都没有问题,再一个一个组合到一起,每加一个部分就测试一下,基本可以找到问题

在做单片机测温实验(数码管显示)时,数码管只显示一个温度,而且不是当前的室温,可能的原因有什么?

其实很简单。

1、计算单片机延时程序的最小延时长度;

2、详细的阅读18B20的DS,按照里面的时序要求安排单片机延时(这点最重要)。

3、调试时不要连续读18B20,最好搞个按键,按一次读一次,这样利于找到问题;

4、一点一点的增减延时,尤其是在发送和接收接受之间的延时(我认为你就是这里延时不够,而且连续读,所以读到的是mach指令,然后是返回的85°信号);

5、有条件的话,使用逻辑分析仪观察数据收发情况,问题可以一目了然。

——经验是累计的,关键是熟读DS。

这是当年我调不出来是,21IC论坛上兄弟给我的建议。我照做了,结果就调出来了。

温度采集系统,就是用单片机做的温度采集系统然后用数码管把温度显示出来算不算一种高速的数据采集系统?

假设用DS18B20做温度采集,要知道传感器有个采集时间,并不是说总线的速度怎样,而是传感器内部需要时间,如果给个范围,大约是0.1秒以上,一般说明书会写明。

既然是单片机,那么高速就谈不上了。不过高速可以有另一种解释,在多路温度采集时候,速度特别快,而不再单个,单个速度不变,只不过,在有限时间能处理多少路温度采集。

我们又知道,数码管显示,如果不基于硬件,或者不是静态显示,则消耗单片机的运算时间,那么就更谈不上什么高速了。

既然传感器响应时间谈不上高速,那么只有在多路采集上,才能说明你的硬件设计的效果,况且温度采集,我感觉不是那么需要高速。

你要说做个热成像,根据热辐射显示出图像,并且预算出每像素点的温度,这个才称之为高速。

给你点建议,想高速了,还是用FPGA去实现,嵌入nios核加上你自己编写的硬件ip,再加个115200波特率的ip核,外设弄多路ad,你弄个多路温度也行 电压也行,比方1秒钟采集5000次电压信号。这个我感觉叫高速,作为学生,基本大家没什么意见。

单片机采集温度输出数码管的介绍到此就结束了,感谢您耐心阅读,谢谢。

本文标签:单片机采集温度输出数码管

<