圣源电子制作

 找回密码
 立即注册
查看: 10116|回复: 0
打印 上一主题 下一主题

热电偶制作温度计-7段码显示-AT89S52-C程序-DIY制作-转载自国外网站

[复制链接]
跳转到指定楼层
楼主
发表于 2011-12-4 15:38:07 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
董事会已开发Wichit Sirichote。 它可用于各种项目作为通用开发板。 例如作家用于温度,交流电源插座,额外电流电压电流测量电路连接到ADC的输入。



本身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.        



复制代码

下载:
C程序-www.syyyd.com-.zip (1.49 KB, 下载次数: 43)
89s52projectboard.pdf (28.84 KB, 下载次数: 53)

回复

使用道具 举报

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

本版积分规则

QQ|手机版|联系我们|闽公网安备 35012102000020号|闽ICP备11020110号-1|圣源电子

GMT+8, 2024-9-20 00:52 , Processed in 0.045619 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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