ATmaga8单片机Pt100温度计源程序+Proteus仿真设计

news/2024/11/22 20:31:01/

目录

1、项目功能 

2、仿真图

​3、程序

资料下载地址:ATmaga8单片机Pt100温度计源程序+Proteus仿真设计

1、项目功能 

设计Pt100铂电阻测量温度的电路,温度测量范围是0-100摄氏度,要求LCD显示。画出电路图,标注元器件参数,简单说明测量原理和调节方式。根据要求,本设计的测温模拟电路使用热电阻Pt100温度传感器利用其感温效应,热电阻随环境温度的变化而变化,在电路图中将电阻值的变化转换成电压的变化,再将电压值作为输入信号输入至AD转换器中进行模拟信号到数字信号的转换,其输出端接单片机,向单片机内依据公式写入源程序,将被测温度在显示器上显示出来:
测量温度范围0℃~100℃;
分辨率为0.1℃;
LCD数码直读显示。
本设计系统包括了温度测量单元,信号处理单元,A/D 转换模块,数据处理与控制模块,温度显示五个部分。

2、仿真图

 3、程序

#include <lcd.h>#include <delay.h>#define ADC_VREF_TYPE 0xC0
#define MCPCS   PORTD.0
#define MCPSCK  PORTD.1
#define MCPDATA PIND.2
#define A 3.9083e-3
#define B -5.775e-7
#define C -4.183e-12
unsigned long read_spi(void);
float CalTem(float PT100R)
{
double fT,fR,fT0;
char i=0;
fR=PT100R;
fT0=(fR/100-1)/A;return fT0;
};
unsigned long read_mcp(void)
{
long a[]={0,0,0,0,0};
long x=0;
char i=0;
char k=5;       // 数组大小 -1
for (i=0;i<5;i++)
{
a[i]=read_spi(); // 连续3次读出数据
delay_us(5);
}
//中值滤波
while (k>0)
{
for (i=0;(i<(k-1));i++) // 从低到高排序
{if (a[i]>a[i+1]){x=a[i+1];a[i+1]=a[i];a[i]=x;};
};
k--;
};
return a[2]; // 舍弃最大数据和最小数据。
}unsigned long read_spi(void)
{              
volatile  char i=0;
volatile  long int result=0,x=0;
MCPCS=0;//    CS 先一个100us 低电平脉冲
delay_us(100);
MCPCS=1;
delay_ms(80); // 高电平等待80ms 等待转换完成
MCPCS=0;      // 置 CS 低电平 开始发生 sck 脉冲
for (i=0; i<24;i++) // 24 位数据
{MCPSCK=0;    // sck 脉冲下降沿delay_us(1); // 等5us 等待稳定//result=result<<1;x=MCPDATA;   // 读出一位while (MCPDATA!=x)  // 抖动处理 2次读出电平相同说明数据稳定{delay_us(1);x=MCPDATA;};result<<=1;   result|=x;//(x<<(23-i));delay_us(5);MCPSCK=1;   // 发送sck 上升沿delay_us(10);   
};
MCPCS=1; // cs=1
return result>>6;
}
// Read the AD conversion result
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
// Delay needed for the stabilization of the ADC input voltage
delay_us(10);
// Start the AD conversion
ADCSRA|=0x40;
// Wait for the AD conversion to complete
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCW;
}// 校准温度计查表   没20度一个校准,
//                     -50  -30  -10  10  30   50    70  90   110   130 150   
const float CAL_Tem[]={4.7 ,4.65,4.65,4.6,4.6 ,4.55,4.55,4.50,4.45,4.45,4.45};
const int   ADCSTEP[]={  1 ,96  ,189 ,282, 374,466 ,557 ,648,738,827 ,916};float CalcuTem(int ADC)  // 温度校准计算     没有使用
{
int i=0;
float r;
for (i=0; i<10;i++)
{if ((ADC<ADCSTEP[i+1])&&(ADC>=ADCSTEP[i])) break;
};
r=(ADC-ADCSTEP[i]);
r=r/CAL_Tem[i];
r=r-50;///CAL_Tem[i]-50+i*20+;
r=r+i*20.0;
return r;
}
volatile char stradc[15]="\0";
void main(void)
{
// Declare your local variables here
volatile  long int MCPADC=0;
volatile unsigned int adc=0;
volatile float  fadc=0;// Input/Output Ports initialization
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x00;// Port C initialization
// Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;// Port D initialization
// Func7=out Func6=out Func5=out Func4=out Func3=out Func2=int Func1=out Func0=out
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=1
PORTD=0x07;
DDRD=0xFB;// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
TCCR0=0x00;
TCNT0=0x00;// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;


http://www.ppmy.cn/news/1549122.html

相关文章

Spring Boot项目pom.xml文件详解

文章目录 Spring Boot项目pom.xml文件详解一、引言二、POM文件基础结构1、POM文件概述 三、项目依赖详解1、Spring Boot Web Starter2、MyBatis Spring Boot Starter3、MySQL Connector/J4、Lombok5、Spring Boot Test Starter 四、构建插件五、总结 Spring Boot项目pom.xml文件…

Python学习------第十天

数据容器-----元组 定义格式&#xff0c;特点&#xff0c;相关操作 元组一旦定义&#xff0c;就无法修改 元组内只有一个数据&#xff0c;后面必须加逗号 """ #元组 (1,"hello",True) #定义元组 t1 (1,"hello") t2 () t3 tuple() prin…

【H2O2|全栈】MySQL的云端部署

目录 前言 开篇语 准备工作 MySQL移除 为什么需要移除&#xff1f; 移除操作 Yum仓库 yum简介 rpm安装 yum库安装 MySQL安装 使用yum安装 开机自启动 检查运行状态 MySQL配置 初始密码 ​编辑登录 修改root密码 退出MySQL 字符集配置 重启数据库 结束语 …

嵌入式学习(13)-塔石TAS-LAN-476串口服务器

一、概述 TAS-LAN-476是一款实现物理串口转物理网口的设备&#xff0c;TAS-LAN-476 是工业级数据终端产品&#xff0c;该产品以以太网的方式为工业用户提供数据传输通道。设备软件功能完善&#xff0c;覆盖绝大多数常规应用场景&#xff0c;用户只需通过简单的设置&#xff0c…

C语言-11-18笔记

1.C语言数据类型 类型存储大小值范围char1 字节-128 到 127 或 0 到 255unsigned char1 字节0 到 255signed char1 字节-128 到 127int2 或 4 字节-32,768 到 32,767 或 -2,147,483,648 到 2,147,483,647unsigned int2 或 4 字节0 到 65,535 或 0 到 4,294,967,295short2 字节…

AFSim脚本学习

定时更新 定时检测两个平台的距离&#xff0c;若距离小于某个值时触发函数 # File generated by Wizard 2.9.0 on Nov 21, 2024.platform_type TANK WSF_PLATFORMicon tankmover WSF_GROUND_MOVERend_moverend_platform_typeplatform tank_red TANKposition 24:42:36.68n 121:…

力扣 LeetCode 226. 翻转二叉树(Day7:二叉树)

解题思路&#xff1a; 递归 翻转二叉树&#xff0c;前序和后序都是可以的&#xff0c;但中序不行 中序会导致左边始终没有处理&#xff0c;所以如果一定要中序&#xff0c;两次内部递归都要用root.left class Solution {public TreeNode invertTree(TreeNode root) {if (ro…

Elmentui实现订单拆单功能

Elmentui实现订单拆分开票功能 需求 订单在开票时候&#xff0c;允许按照订单明细行和数量拆分开票&#xff0c;一个订单需要一次性完成全部明细行拆分才能提交开票 思路 实现一个订单拆单的功能&#xff0c;支持按照行和数量拆分&#xff0c;使用elementui 首先有一个table显…