ATmega8+PT100热敏电阻+AD824S proteus仿真与源程序

2019-11-08来源: 51hei关键字:ATmega8  PT100热敏电阻  AD824S

pt100热敏电阻+AD824S放大并由ATmega8单片机主控的测温系统仿真原理图如下
0.jpg0.png

ATmega8单片机源程序如下:

/*****************************************************

This program was produced by the

CodeWizardAVR V2.03.4 Standard

Automatic Program Generator

?Copyright 1998-2008 Pavel Haiduc, HP InfoTech s.r.l.


Project : 

Version : 

Date    : 2011-4-16

Author  : 

Company : 

Comments: 



Chip type           : ATmega8

Program type        : Application

Clock frequency     : 8.000000 MHz

Memory model        : Small

External RAM size   : 0

Data Stack size     : 256

*****************************************************/


#include

//#include

#include

#include

// Alphanumeric LCD Module functions

#asm

   .equ __lcd_port=0x18 ;PORTB

#endasm

#include


#include


#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;

if ((fR>=80.31)&&(fR<100)) //-30~0 度

{

   for(i=0;i<50;i++)

    {

      fT=fT0+(fR-100*(1+A*fT0+B*fT0-100*C*fT0*fT0+C*fT0*fT0*fT0))/

      (100*(A+2*B*fT0-300*C*fT0*fT0+4*C*fT0*fT0*fT0));

      if(fabs(fT-fT0)<0.001) break;

      else

      fT0=fT;

    } 

}  else if(fR>=100&&fR<=390.481) // 0~850 度

{

   for (i=0;i<50;i++)

   {

     fT=fT0+(fR-100*(1+A*fT0+B*fT0*fT0))/(100*(A+2*B*fT0));

     if (fabs(fT-fT0)<0.001) break;

     else

     fT0=fT;

   }

  

}  else fT=-1000.0;

return fT;

};

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])) 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]="";

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;

OCR1BL=0x00;


// Timer/Counter 2 initialization

// Clock source: System Clock

// Clock value: Timer 2 Stopped

// Mode: Normal top=FFh

// OC2 output: Disconnected

ASSR=0x00;

TCCR2=0x00;

TCNT2=0x00;

OCR2=0x00;


// External Interrupt(s) initialization

// INT0: Off

// INT1: Off

MCUCR=0x00;


// Timer(s)/Counter(s) Interrupt(s) initialization

TIMSK=0x00;


// Analog Comparator initialization

// Analog Comparator: Off

// Analog Comparator Input Capture by Timer/Counter 1: Off

ACSR=0x80;

SFIOR=0x00;


// ADC initialization

// ADC Clock frequency: 125.000 kHz

// ADC Voltage Reference: Int., cap. on AREF

ADMUX=ADC_VREF_TYPE & 0xff;

ADCSRA=0x86;


// LCD module initialization

lcd_init(16);


while (1)

      {     

      

    

      MCPADC=0;

……………………



关键字:ATmega8  PT100热敏电阻  AD824S 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic479380.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:AVR16 AVR128的DS18B20温度传感器protues仿真与源码
下一篇:MEGA2560主控自行车骑行监测器

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

AVR ATmega1280定时器PWM输出程序
#include "kernel.h"unsigned int PWM_Buf[6];//6路PWM频率unsigned long timer0_ticks;unsigned long timer0_tickssec;unsigned long timer1_ticks;unsigned long timer1_ticksmin;unsigned long timer2_ticks;unsigned long timer2_tickssec;unsigned long timer3_ticks;unsigned long timer3_ticksmin;unsigned long timer4_ticks;uns
发表于 2019-11-20
atmega8l直接驱动笔段式lcd驱动程序
#include"include.h"uchar lcdtab[3][10][3]={{{0x07,0x01,0x03},{0x04,0x00,0x02},{0x06,0x03,0x01},{0x06,0x02,0x03},{0x05,0x02,0x02},{0x03,0x02,0x03},{0x03,0x03,0x03},{0x06,0x00,0x02},{0x07,0x03,0x03},{0x07,0x02,0x03}},{{0x18,0x14,0x0c},{0x10,0x10,0x00},{0x18,0x08,0x0c},{0x18,0x18,0x08},{0x10,0x1c,0x00},{0x08,0x1
发表于 2019-11-18
Atmega32A驱动LCD1602显示屏
对于初学者来说,最烦躁的可能就是调试程序,往往小小一个问题,要找个一个小时,甚至几个小时才能解决,这个程序是刚调试完的,整整九个多小时啊,现在看着挺简单的,没调试好前根本不敢肯能调得好.高手别笑,初学者参考编程环境Atmel Studio 7.0 和Proteus 8仿真,说明:仿真和真实电路是有点区别的,仿真Proteus 8只能用内部晶振,最大8MHz,我的DIY板是16M,所以实际电路总是比仿真的跑快好多单片机源程序:/** LCD1602_AVR.h** Created: 2017/3/19 23:07:51*  Author: lyl*LCD1602的基本操作时序      &nbs
发表于 2019-11-11
Atmega32A驱动LCD1602显示屏
ATMEGA16L实现时间和温度的循环显示程序分享
//ICC-AVR application builder : 2/13 20:52:33/******************************************************************************** 版权:     ** 单片机:   ATMAGE16L* 晶振:     外部8MHz* 编译器:   ICC 7.22** 文件名:   main.c* 作者:     木子工作室* 版本:     1.0* 完成日期: * 功能描述: 在12M晶振下,
发表于 2019-11-09
基于ATmega128单片机的红外控制电机系统源码
单片机源程序如下:#include "Main.h"SIGNAL(SIG_OVERFLOW0) //中断每1秒发一个数{                TCNT0 = 200;         TIMSK &= ~_BV(TOIE0);  //TIMSK中TOIE0置0        if(++g_bCount>1)        {     
发表于 2019-11-09
AVR stdio写的ATMEGA16控制步进电机正反转和速度
AVR stdio写的ATMEGA16控制步进电机正反转和速度,供大家免费参阅和批评适合初学者,总共七个按键  三个按键控制三个速度正转,三个按键控制三个速度反转,一个按键控制停止。本程序控制步进电机是和步进电机驱动器相连接的,所以脉冲只有一路,如果想直接连步进电机只需要稍加改动即可。 主程序预览:#define F_CPU 800000UL#include <avr/io.h>#include <util/delay.h>#define INT8U unsigned int#define INT16U unsigned intconst INT8U FFW[]={0x01
发表于 2019-11-09
AVR stdio写的ATMEGA16控制步进电机正反转和速度
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved