历史上的今天
返回首页

历史上的今天

今天是:2024年11月08日(星期五)

正在发生

2019年11月08日 | ATmega8+PT100热敏电阻+AD824S proteus仿真与源程序

2019-11-08 来源:51hei

pt100热敏电阻+AD824S放大并由ATmega8单片机主控的测温系统仿真原理图如下
0.jpg?imageView2/2/w/5500.png?imageView2/2/w/550

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;

……………………



推荐阅读

史海拾趣

Gustav Klauke GmbH公司的发展小趣事

Gustav Klauke GmbH在电子行业中的五个发展故事

故事一:创立与电气时代的崛起

1879年,Gustav Klauke GmbH在德国雷姆沙伊德成立,正值第二次工业革命带来的“电气时代”大爆发。创始人Gustav Klauke凭借其对精工品质的执着追求,将公司的业务聚焦于电气连接技术和电缆作业工具的研发。随着全球电气工业的迅速发展,Klauke迅速成为该领域的佼佼者,为供电系统的各个环节提供可靠且实用的解决方案,满足了社会对电气产品日益增长的多元化需求。

故事二:产品创新与多元化发展

历经百年开拓,Klauke的产品线不断丰富和完善。从最初的钟表维修钳子,到电缆接线端子的生产,再到电池驱动的液压工具的研发,Klauke始终走在行业前沿。特别是1994年推出的首款电池驱动液压工具,标志着公司在电气连接技术上的重大突破。至今,Klauke已拥有多达280种工具,2000多个型号,超过10000个优质部件,广泛应用于电力、铁路和工业等多个领域。

故事三:品质与认证的国际认可

Klauke深知电气连接作业对安全可靠性的极高要求,因此始终将产品质量放在首位。公司不仅拥有IEC(国际电工委员会)、UL(美国保险商试验所)、DNV(挪威船级社)和GL(德国劳氏船级社)等特殊行业的权威资质认证,还通过严格的产品测试报告,确保每一款产品都能达到国际最高标准。这种对品质的坚持,让Klauke在全球客户中赢得了极高的信誉和口碑。

故事四:全球化布局与业务拓展

随着全球市场的不断扩大,Klauke积极实施全球化战略。从德国本土出发,公司在全球范围内设立了多个分公司和销售办事处,如印度、奥地利、西班牙等。同时,公司还通过并购和合作等方式,不断拓展业务领域和市场份额。例如,2018年Gustav Klauke GmbH被艾默生收购,现隶属于“专业工具”部门,这一举措进一步提升了公司在全球电气工具市场的竞争力。

故事五:未来展望与技术创新

面对未来,Klauke继续秉承德国精工品质的优良传统,致力于技术创新和服务优化。公司正密切关注物联网和工业4.0等下一代趋势,并制定相应的战略计划。例如,新型电池供电液压工具配备了蓝牙接口,实现了移动数据读取和工具配置的便捷性。此外,Klauke还计划推出更多高适应性、精准性的电气连接解决方案,以更好地满足全球日益多元的施工作业需求。展望未来,Klauke将继续向下一个百年目标迈进,为电子行业的发展贡献更多力量。

Design Gateway公司的发展小趣事

随着Gateway业务的不断发展,公司开始寻求更多的市场曝光。1987年,Gateway在《Computer Shopper》杂志上投放了一版独特的广告,吸引了众多消费者的目光。1991年,公司推出了彰显其牧场起家背景的别具一格的奶牛花斑盒状商标,这一创新举措获得了全国消费者的认可,进一步提升了Gateway的品牌知名度和市场地位。

(请注意,由于篇幅限制,以上两个故事为简化版。在实际写作中,可以进一步扩展每个故事,包括更详细的背景信息、人物对话、市场反应等。)

由于篇幅所限,这里只提供了两个故事概要。如果需要更多关于Gateway或其他电子公司的发展故事,可以进一步研究和撰写。

粤翔(FlyWin)公司的发展小趣事
如电压比较器(如LM393),用于实时监测系统电压。
Habia Cable公司的发展小趣事
保护医疗设备中的数据安全,避免因掉电导致的数据丢失或设备故障。
East Texas Integrated Circuits公司的发展小趣事

随着市场的不断扩大,ETIC意识到必须不断提升自身的研发实力才能保持竞争优势。因此,公司加大了对研发的投入,引进了一批高端人才和先进的研发设备。同时,ETIC还积极与国内外高校和研究机构开展合作,共同开展前沿技术的研究和开发。这些努力使ETIC在集成电路领域的技术实力得到了显著提升。

成都芯进(CrossChip)公司的发展小趣事

随着技术的不断积累和市场的逐步拓展,成都芯进电子逐渐在磁传感器芯片领域崭露头角。他们不仅实现了霍尔效应和磁阻效应磁传感器芯片的量产,还成功研发了电流传感器芯片、电机驱动芯片和电源管理芯片等系列产品。这些产品的推出,不仅丰富了公司的产品线,也进一步提升了公司的市场竞争力。

问答坊 | AI 解惑

基于DSL的IPTV测试

本帖最后由 jameswangsynnex 于 2015-3-3 20:02 编辑 使用 DSL 传输 Internet 协议电视 (IPTV) 是一种新兴的、令人振奋的技术,可以为服务提供商提供全新的商业机遇。ADSL2+ 和 VDSL2 数据速率可以轻松实现在一根电话线上集成语音、视频和数据服务 ...…

查看全部问答>

求助!中英文对照论文

求助一篇关于单片机的LED点阵显示屏控制设计的,与其有关的中英文对照论文,5000字,谢谢了!!!…

查看全部问答>

socket数据接收处理问题C#

问题描述: 在“private void btnDiagnosticClicked(object sender, EventArgs e)”方法中 执行“RecData = MainMenu.socketHH.GetRecData();”“RecData”一直接收为空。 而在“private void ReceiveCallback(IAsyncResult ar)”方法中 “recB ...…

查看全部问答>

HDL 实践

经过我仔细测试,发现如下问题;   ALTERA 的Quartus 9.0 以及以下版本不支持SYSTEM C; 但Quartus 9.1 支持SYSTEM C 语法。学习HDL的几点重要提示: 1.了解HDL的可综合性问题:HDL有两种用途:系统仿真和硬件实现。 如果程序只用于仿真,那么 ...…

查看全部问答>

STR710中断切换求助

做UC/os移植,做时钟节拍,在中断中,只有执行OSIntExit功能,系统就无论如何也进不了TIME1的时间中断了,但软中断可以执行。弄到头痛了都不知什么原因,郁闷中…… void T1TIMI_IRQHandler(void) {     TIM_FlagClear ( TIM1 , ...…

查看全部问答>

关于应用MSP430F449设计一个电流表的量程问题

我们在利用F449进行设计一个电流表,在对固定电阻取电压时考虑以下几个问题: 1.F449的供电电压是9v(我是说那个变压器),那么对于单片机进行AD转换时的驱动电压是多少?也就是我所能得到的电压的范围是多少?? 2.F449在进行AD转换过程中,所 ...…

查看全部问答>

求助

#ifndef    MSP430XF449_H #include <msp430x44x.h> #endif 请问这几句话是什么意思,常见的不是 #ifndef   **** #define  **** #endif 吗?…

查看全部问答>

IAR-CCS和mspgcc对中断处理

本文简明扼要的描述了这三种编译器对中断的处理方法,及进行移植时所要进行的代码更改方法。 凡是下载者,请留言,谢谢…

查看全部问答>

关于quartus仿真中的simulation report不能获取问题!!

我用的是modelsim-altera仿真的,具体是写好testbench后自动调用web版的modelsim进行仿真,但是仿真结束后再processing中的simulation report总是无法获取,请大家帮我想想怎么才能得到它呢,这个报告里有宏模块ram仿真的数据的。。。…

查看全部问答>

速度上手LM4F LaunchPad 产生PWM波

发现网上关于TI的LM4F120 Launchpad 资料太少了,其中大部分都是TI员工或者其合作伙伴提供的,例程太少,导致新手上手很慢 我只是要实现几路PWM波输出而已,昨天努力了一天,发现并不容易,至少没有可参考的例程,好在我不断地找资料,最后终于写 ...…

查看全部问答>