历史上的今天
今天是:2024年11月08日(星期五)
2019年11月08日 | ATmega8+PT100热敏电阻+AD824S proteus仿真与源程序
2019-11-08 来源:51hei
pt100热敏电阻+AD824S放大并由ATmega8单片机主控的测温系统仿真原理图如下

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 }; 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; ……………………
史海拾趣
|
本帖最后由 jameswangsynnex 于 2015-3-3 20:02 编辑 使用 DSL 传输 Internet 协议电视 (IPTV) 是一种新兴的、令人振奋的技术,可以为服务提供商提供全新的商业机遇。ADSL2+ 和 VDSL2 数据速率可以轻松实现在一根电话线上集成语音、视频和数据服务 ...… 查看全部问答> |
|
问题描述: 在“private void btnDiagnosticClicked(object sender, EventArgs e)”方法中 执行“RecData = MainMenu.socketHH.GetRecData();”“RecData”一直接收为空。 而在“private void ReceiveCallback(IAsyncResult ar)”方法中 “recB ...… 查看全部问答> |
|
做UC/os移植,做时钟节拍,在中断中,只有执行OSIntExit功能,系统就无论如何也进不了TIME1的时间中断了,但软中断可以执行。弄到头痛了都不知什么原因,郁闷中…… void T1TIMI_IRQHandler(void) { TIM_FlagClear ( TIM1 , ...… 查看全部问答> |
|
我们在利用F449进行设计一个电流表,在对固定电阻取电压时考虑以下几个问题: 1.F449的供电电压是9v(我是说那个变压器),那么对于单片机进行AD转换时的驱动电压是多少?也就是我所能得到的电压的范围是多少?? 2.F449在进行AD转换过程中,所 ...… 查看全部问答> |
|
关于quartus仿真中的simulation report不能获取问题!! 我用的是modelsim-altera仿真的,具体是写好testbench后自动调用web版的modelsim进行仿真,但是仿真结束后再processing中的simulation report总是无法获取,请大家帮我想想怎么才能得到它呢,这个报告里有宏模块ram仿真的数据的。。。… 查看全部问答> |
|
发现网上关于TI的LM4F120 Launchpad 资料太少了,其中大部分都是TI员工或者其合作伙伴提供的,例程太少,导致新手上手很慢 我只是要实现几路PWM波输出而已,昨天努力了一天,发现并不容易,至少没有可参考的例程,好在我不断地找资料,最后终于写 ...… 查看全部问答> |




