找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5102|回复: 0
收起左侧

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

[复制链接]
ID:274871 发表于 2018-1-11 16:59 | 显示全部楼层 |阅读模式
pt100热敏电阻+AD824S放大并由ATmega8单片机主控的测温系统仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
0.jpg 0.png

ATmega8单片机源程序如下:
  1. /*****************************************************
  2. This program was produced by the
  3. CodeWizardAVR V2.03.4 Standard
  4. Automatic Program Generator
  5. ?Copyright 1998-2008 Pavel Haiduc, HP InfoTech s.r.l.

  6. Project :
  7. Version :
  8. Date    : 2011-4-16
  9. Author  :
  10. Company :
  11. Comments:


  12. Chip type           : ATmega8
  13. Program type        : Application
  14. Clock frequency     : 8.000000 MHz
  15. Memory model        : Small
  16. External RAM size   : 0
  17. Data Stack size     : 256
  18. *****************************************************/

  19. #include <mega8.h>
  20. //#include <delay.h>
  21. #include <stdlib.h>
  22. #include <string.h>
  23. // Alphanumeric LCD Module functions
  24. #asm
  25.    .equ __lcd_port=0x18 ;PORTB
  26. #endasm
  27. #include <lcd.h>

  28. #include <delay.h>

  29. #define ADC_VREF_TYPE 0xC0
  30. #define MCPCS   PORTD.0
  31. #define MCPSCK  PORTD.1
  32. #define MCPDATA PIND.2
  33. #define A 3.9083e-3
  34. #define B -5.775e-7
  35. #define C -4.183e-12
  36. unsigned long read_spi(void);
  37. float CalTem(float PT100R)
  38. {
  39. double fT,fR,fT0;
  40. char i=0;
  41. fR=PT100R;
  42. fT0=(fR/100-1)/A;
  43. if ((fR>=80.31)&&(fR<100)) //-30~0 度
  44. {
  45.    for(i=0;i<50;i++)
  46.     {
  47.       fT=fT0+(fR-100*(1+A*fT0+B*fT0-100*C*fT0*fT0+C*fT0*fT0*fT0))/
  48.       (100*(A+2*B*fT0-300*C*fT0*fT0+4*C*fT0*fT0*fT0));
  49.       if(fabs(fT-fT0)<0.001) break;
  50.       else
  51.       fT0=fT;
  52.     }
  53. }  else if(fR>=100&&fR<=390.481) // 0~850 度
  54. {
  55.    for (i=0;i<50;i++)
  56.    {
  57.      fT=fT0+(fR-100*(1+A*fT0+B*fT0*fT0))/(100*(A+2*B*fT0));
  58.      if (fabs(fT-fT0)<0.001) break;
  59.      else
  60.      fT0=fT;
  61.    }
  62.   
  63. }  else fT=-1000.0;
  64. return fT;
  65. };
  66. unsigned long read_mcp(void)
  67. {
  68. long a[]={0,0,0,0,0};
  69. long x=0;
  70. char i=0;
  71. char k=5;       // 数组大小 -1
  72. for (i=0;i<5;i++)
  73. {
  74. a[i]=read_spi(); // 连续3次读出数据
  75. delay_us(5);
  76. }
  77. //中值滤波
  78. while (k>0)
  79. {
  80. for (i=0;(i<(k-1));i++) // 从低到高排序
  81. {
  82.   if (a[i]>a[i+1])
  83.   {
  84.   x=a[i+1];
  85.   a[i+1]=a[i];
  86.   a[i]=x;
  87.   };
  88. };
  89. k--;
  90. };
  91. return a[2]; // 舍弃最大数据和最小数据。
  92. }

  93. unsigned long read_spi(void)
  94. {              
  95. volatile  char i=0;
  96. volatile  long int result=0,x=0;
  97. MCPCS=0;//    CS 先一个100us 低电平脉冲
  98. delay_us(100);
  99. MCPCS=1;
  100. delay_ms(80); // 高电平等待80ms 等待转换完成
  101. MCPCS=0;      // 置 CS 低电平 开始发生 sck 脉冲
  102. for (i=0; i<24;i++) // 24 位数据
  103. {
  104.   MCPSCK=0;    // sck 脉冲下降沿
  105.   delay_us(1); // 等5us 等待稳定
  106.   //result=result<<1;
  107.   x=MCPDATA;   // 读出一位
  108.   while (MCPDATA!=x)  // 抖动处理 2次读出电平相同说明数据稳定
  109.   {
  110.    delay_us(1);
  111.    x=MCPDATA;
  112.   };
  113.   result<<=1;   
  114.   result|=x;//(x<<(23-i));
  115.   delay_us(5);
  116.   MCPSCK=1;   // 发送sck 上升沿
  117.   delay_us(10);   
  118. };
  119. MCPCS=1; // cs=1
  120. return result>>6;
  121. }
  122. // Read the AD conversion result
  123. unsigned int read_adc(unsigned char adc_input)
  124. {
  125. ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
  126. // Delay needed for the stabilization of the ADC input voltage
  127. delay_us(10);
  128. // Start the AD conversion
  129. ADCSRA|=0x40;
  130. // Wait for the AD conversion to complete
  131. while ((ADCSRA & 0x10)==0);
  132. ADCSRA|=0x10;
  133. return ADCW;
  134. }

  135. // 校准温度计查表   没20度一个校准,
  136. //                     -50  -30  -10  10  30   50    70  90   110   130 150   
  137. 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};
  138. const int   ADCSTEP[]={  1 ,96  ,189 ,282, 374,466 ,557 ,648,738,827 ,916};

  139. float CalcuTem(int ADC)  // 温度校准计算     没有使用
  140. {
  141. int i=0;
  142. float r;
  143. for (i=0; i<10;i++)
  144. {
  145.    if ((ADC<ADCSTEP[i+1])&&(ADC>=ADCSTEP[i])) break;
  146. };
  147. r=(ADC-ADCSTEP[i]);
  148. r=r/CAL_Tem[i];
  149. r=r-50;///CAL_Tem[i]-50+i*20+;
  150. r=r+i*20.0;
  151. return r;
  152. }
  153. volatile char stradc[15]="\0";
  154. void main(void)
  155. {
  156. // Declare your local variables here
  157. volatile  long int MCPADC=0;
  158. volatile unsigned int adc=0;
  159. volatile float  fadc=0;

  160. // Input/Output Ports initialization
  161. // Port B initialization
  162. // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
  163. // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
  164. PORTB=0x00;
  165. DDRB=0x00;

  166. // Port C initialization
  167. // Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
  168. // State6=T State5=T State4=T State3=T State2=T State1=T State0=T
  169. PORTC=0x00;
  170. DDRC=0x00;

  171. // Port D initialization
  172. // Func7=out Func6=out Func5=out Func4=out Func3=out Func2=int Func1=out Func0=out
  173. // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=1
  174. PORTD=0x07;
  175. DDRD=0xFB;

  176. // Timer/Counter 0 initialization
  177. // Clock source: System Clock
  178. // Clock value: Timer 0 Stopped
  179. TCCR0=0x00;
  180. TCNT0=0x00;

  181. // Timer/Counter 1 initialization
  182. // Clock source: System Clock
  183. // Clock value: Timer 1 Stopped
  184. // Mode: Normal top=FFFFh
  185. // OC1A output: Discon.
  186. // OC1B output: Discon.
  187. // Noise Canceler: Off
  188. // Input Capture on Falling Edge
  189. // Timer 1 Overflow Interrupt: Off
  190. // Input Capture Interrupt: Off
  191. // Compare A Match Interrupt: Off
  192. // Compare B Match Interrupt: Off
  193. TCCR1A=0x00;
  194. TCCR1B=0x00;
  195. TCNT1H=0x00;
  196. TCNT1L=0x00;
  197. ICR1H=0x00;
  198. ICR1L=0x00;
  199. OCR1AH=0x00;
  200. OCR1AL=0x00;
  201. OCR1BH=0x00;
  202. OCR1BL=0x00;

  203. // Timer/Counter 2 initialization
  204. // Clock source: System Clock
  205. // Clock value: Timer 2 Stopped
  206. // Mode: Normal top=FFh
  207. // OC2 output: Disconnected
  208. ASSR=0x00;
  209. TCCR2=0x00;
  210. TCNT2=0x00;
  211. OCR2=0x00;

  212. // External Interrupt(s) initialization
  213. // INT0: Off
  214. // INT1: Off
  215. MCUCR=0x00;

  216. // Timer(s)/Counter(s) Interrupt(s) initialization
  217. TIMSK=0x00;

  218. // Analog Comparator initialization
  219. // Analog Comparator: Off
  220. // Analog Comparator Input Capture by Timer/Counter 1: Off
  221. ACSR=0x80;
  222. SFIOR=0x00;

  223. // ADC initialization
  224. // ADC Clock frequency: 125.000 kHz
  225. // ADC Voltage Reference: Int., cap. on AREF
  226. ADMUX=ADC_VREF_TYPE & 0xff;
  227. ADCSRA=0x86;

  228. // LCD module initialization
  229. lcd_init(16);

  230. while (1)
  231.       {     
  232.       
  233.    
  234.       MCPADC=0;
  235. ……………………

  236. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
ourdev_632978S7VPZ0.rar (28.62 KB, 下载次数: 159)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表