圣源电子制作

标题: 热电偶制作温度计-7段码显示-AT89S52-C程序-DIY制作-转载自国外网站 [打印本页]

作者: sydz    时间: 2011-12-4 15:38
标题: 热电偶制作温度计-7段码显示-AT89S52-C程序-DIY制作-转载自国外网站
董事会已开发Wichit Sirichote。 它可用于各种项目作为通用开发板。 例如作家用于温度,交流电源插座,额外电流电压电流测量电路连接到ADC的输入。
(, 下载次数: 40)
(, 下载次数: 33)
(, 下载次数: 30)
(, 下载次数: 33)

本身2x12bit ADC输入,4位7段LED指示灯,连接器字母数字液晶,四个开关,16个I / O端口引脚为数字数据通信和ISP的适配器(89S系列允许ISP编程) 。 有像温度传感器的情侣例如读通过ADC输入的程序。 因此它可能是实际的板或者干脆学习89S52的微控制器。

程序:
  1. /*
  2.   Firmware for Thermistor sensor input, the 89S52 Project Board.
  3.   The sensor is tied to analog input channel1.
  4.   Channel0 is available for experimenting with another sensors.

  5.   Copyright (C) 2007, Wichit Sirichote, kswichit@kmitl.ac.th

  6. */

  7. #include<reg52.h>
  8. #include<stdio.h>

  9. float read_temp1(void);
  10. float read_temp1_filter(void);


  11. sbit ADCDATA = P1^4;
  12. sbit CS = P3^6;
  13. sbit CLK = P2^4;
  14. sbit LEDDATA = P3^7;
  15. sbit STROBE = P2^5;
  16. sbit LED = P1^2;

  17. char segment[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x39};

  18. int timer3, timer4;
  19. char cputick;
  20. char buffer[4];
  21. int x1,x2,x3,x4,x5;
  22. unsigned int temp1;


  23. // return 12-bit ADC data 0 - 4095
  24. int read_ADC(char n)
  25. {                               
  26.         char i,channel;                 
  27.         int k;
  28.         k=0;
  29.         CS=0;
  30.         if(n==0) channel=0x0d;
  31.         else channel=0x0f;

  32.         for(i=0;i<4;i++)
  33.         {
  34.                 CLK = 0;
  35.                 if(channel&8) ADCDATA = 1;
  36.                 else ADCDATA = 0;
  37.                 CLK = 1;
  38.                 channel <<=1;
  39.         }
  40.                 ADCDATA = 1;
  41.                 CLK = 0;

  42.         for(i=0;i<12;i++)
  43.         {
  44.                 k<<=1;
  45.                 CLK=1;
  46.                 CLK=0;
  47.                 if(ADCDATA) k|=1;
  48.                 else k&=~1;
  49.         }
  50.                 CS = 1;
  51.         return k&0xfff;
  52. }

  53. // write 32-bit data to CMOS shift register 4094
  54. void write_led()
  55. {       
  56.         char m,n;
  57.         for(n=0;n<4;n++)
  58.         {
  59.                 for(m=0;m<8;m++)
  60.                 {
  61.                         if(buffer[n]&0x80) LEDDATA=1;
  62.                         else LEDDATA=0;
  63.                         CLK =1;
  64.                         buffer[n]<<=1;
  65.                         CLK =0;
  66.                 }
  67.         }
  68.         STROBE=1;        // strobe all 32-bit to the output
  69.         ;
  70.         STROBE=0;
  71. }


  72. // display temperature in celcius
  73. void update()
  74. {
  75.                
  76.                 temp1=read_temp1_filter()*10;
  77.                 //temp1=(read_temp1_filter()*9/5+32)*10;   // display temperature in F degrees
  78.                 buffer[0]=segment[temp1/100];
  79.                 temp1=temp1%100;
  80.                 buffer[1]=segment[temp1/10];
  81.                 buffer[1]|=0x80;   // put decimal point
  82.                 buffer[2]=segment[temp1%10];
  83.                 buffer[3]=segment[10];
  84.        
  85. }



  86. /*

  87. // display ADC raw data 0-4095 for 0 to +5V input at channel 0
  88. // select below function when calibrating the input sensor!
  89. void update()
  90. {
  91.                
  92.                 temp1=read_ADC(1);
  93.                 buffer[0]=segment[temp1/1000];
  94.                 temp1=temp1%1000;
  95.                 buffer[1]=segment[temp1/100];
  96.                 temp1= temp1%100;
  97.                 buffer[2]=segment[temp1/10];
  98.                 buffer[3]=segment[temp1%10];
  99.        
  100. }

  101. */

  102. // print temperature to display
  103.   
  104. void print_ADC()
  105. {
  106.         if(++timer3>10)
  107.         {
  108.                 timer3=0;
  109.                 update();
  110.                 write_led();          
  111.         }
  112. }

  113. // toggle LED every 50 ticks
  114. void blinkLED()
  115. {
  116.     if(++timer4>50)
  117.         {
  118.          timer4 = 0;
  119.          LED ^= 1;
  120.          }
  121.          
  122. }

  123. // return filtered data using 5-point moving average
  124. int low_pass_filter1(void)
  125. {
  126.         x5=x4;
  127.         x4=x3;
  128.         x3=x2;
  129.         x2=x1;
  130.         x1=read_ADC(1);
  131.         return(x1+x2+x3+x4+x5)/5;
  132. }

  133. // return calibrated temperature in celcius
  134. float read_temp1_filter(void)
  135. {
  136.         return(0.0323*low_pass_filter1()-15.122);
  137. }

  138. void timer0int(void) interrupt 1 using 1
  139. {
  140. TH0 = 0xd8; // reload value for 100Hz produced by 12MHz XTAL
  141. TL0 = 0xf0; //        for 11.0592MHz, reload value = 0xDC00
  142. cputick++;
  143. }

  144. void main()
  145. {
  146.         EA=1;
  147.         ET0=1;
  148.         TMOD|=0x01;
  149.         TR0=1;
  150.         cputick =0;

  151.         while(1)
  152.         {
  153.         while(!cputick)
  154.          continue;
  155.          cputick = 0;
  156.      // below tasks will be executed every 10ms
  157.          print_ADC();
  158.      blinkLED();
  159.        
  160.         }
  161. }
  162.        



复制代码

下载:
(, 下载次数: 43)
(, 下载次数: 53)






欢迎光临 圣源电子制作 (http://syyyd.com/) Powered by Discuz! X3.4