单片机
返回首页

基于ATMEGA8A单片机+MAX6675的K型热电偶程序Proteus测试

2021-12-21 来源:51hei

采用avr系列ATMEGA8A单片机,数码管采用74hc595静态驱动,读取MAX6675芯片并进行温度转换。



冷结补偿钾热电偶数字转换器(0℃至+1024℃)
MAX6675执行冷结补偿,并将K型热电偶的信号数字化。数据以12位分辨率、SPI兼容、只读格式输出。该转换器可将温度解析为0.25°C,读数最高可达+1024°C,热电偶精度在0°C至+700°C范围内为8 LSb。max 6675采用小型8引脚SO4封装。应用●工业●家电●暖通空调

特点●K型热电偶输出的直接数字转换●冷结补偿●简单的SPI兼容串行接口● 12位,0.25°C分辨率●开放式热电偶检测



简单来说,读16个二进制,只有中间3到14是有效的,取出来,然后乘以分辨率0.25就是多少摄氏度。


单片机源程序如下:

  1. #include

  2. #include


  3. #include


  4. #define Date16 PORTD.5

  5. #define CLK PORTD.7

  6. #define RCLK PORTD.6



  7. #define DateIN PINB.0

  8. #define MCLK PORTB.1

  9. #define CS PORTB.2


  10. const unsigned char Dis_Code[] = {0xFC, 0x60, 0xDA, 0xF2, 0x66, 0XB6, 0xBE, 0xE0, 0XFE, 0xF6};


  11. unsigned char Blk_Flg,Blk_Bit;

  12. unsigned char Disp_Timer, Dis_Buffer[8];


  13. unsigned int wendu,T_Timer;





  14. unsigned int Read6675(void)

  15. {

  16. unsigned int date6675=0;

  17. unsigned char i;

  18.      CS=0;

  19.      delay_us(15);

  20.      MCLK=0;

  21.      delay_us(15);

  22.      for(i=0;i<16;i++)

  23.      {


  24.        date6675<<=1;

  25.        delay_us(15);

  26.        MCLK=1;

  27.        delay_us(15);

  28.        if(DateIN==1) date6675|=0X01;

  29.        delay_us(15);

  30.        MCLK=0;

  31.        delay_us(15);

  32.      }

  33.      CS=1;

  34.      delay_us(15);

  35. //     MCLK=1;

  36.      if((date6675&0X0004)!=0)   date6675=4095;

  37.      else  date6675>>=3;

  38.      return  date6675;


  39. }



  40. void T_zhuanhuan(void)

  41. {

  42.    float temp;

  43.    temp=Read6675();

  44.    temp*=2.5;

  45.    wendu=(unsigned int)temp;

  46. }



  47. int EEPROMwrite( int location, unsigned char byte)

  48. {

  49.     unsigned char oldSREG;


  50.     while (EECR & 0x02);


  51.     EEAR = location;


  52.     EEDR = byte;


  53.     oldSREG = SREG;

  54.     SREG &= ~0x80;


  55.     EECR |= 0x04;

  56.     EECR |= 0x02;


  57.     SREG = oldSREG;

  58.     return 0;

  59. }

  60. unsigned char EEPROMread( int location)

  61. {

  62.     while (EECR & 0x02);


  63.     EEAR = location;


  64.     EECR |= 0x01;


  65.     return (EEDR);

  66. }



  67. void Disp_Led(void)

  68. {

  69.     unsigned char Dis_Temp_B1,Dis_Temp_B2,Dis_Temp_B3 ;

  70.     RCLK=1 ;

  71.     for(Dis_Temp_B1=0;Dis_Temp_B1<5;Dis_Temp_B1++)

  72.     {

  73.         Dis_Temp_B3=1 ;

  74.         for(Dis_Temp_B2=0;Dis_Temp_B2<8;Dis_Temp_B2++)

  75.         {

  76.             if((Dis_Buffer[Dis_Temp_B1]&Dis_Temp_B3)!=0)

  77.             Date16=1 ;

  78.             else

  79.             Date16=0 ;

  80.             CLK=0 ;

  81.             CLK=1 ;

  82.             Dis_Temp_B3*=2 ;

  83.         }

  84.     }

  85.     RCLK=0 ;

  86.     RCLK=1 ;

  87. }

  88. void Dex_To_Bcd(int Dis_Value,unsigned char Blk_En,unsigned char Bcd_T_B1)

  89. {

  90.     Dis_Buffer[4]=Dis_Code[Dis_Value/10000];

  91.     Dis_Value%=10000 ;

  92.     Dis_Buffer[3]=Dis_Code[Dis_Value/1000];

  93.     Dis_Value%=1000 ;

  94.     Dis_Buffer[2]=Dis_Code[Dis_Value/100];

  95.     Dis_Value%=100 ;

  96.     Dis_Buffer[1]=Dis_Code[Dis_Value/10];

  97.     Dis_Value%=10 ;

  98.     Dis_Buffer[0]=Dis_Code[Dis_Value];

  99.     if((Blk_Flg==1)&&(Blk_En!=0))

  100.     {

  101.         switch(Blk_Bit)

  102.         {

  103.             /*0*/

  104.             case 0 :

  105.             break ;

  106.             /*1*/

  107.             case 1 :

  108.             if(Bcd_T_B1==4)Bcd_T_B1=3 ;

  109.             break ;

  110.             /*2*/

  111.             case 2 :

  112.             if(Bcd_T_B1==3||Bcd_T_B1==4)Bcd_T_B1=2 ;

  113.             break ;

  114.             /*3*/

  115.             case 3 :

  116.             if(Bcd_T_B1==2||Bcd_T_B1==3||Bcd_T_B1==4)Bcd_T_B1=1 ;

  117.             break ;

  118.             /*4*/

  119.             case 4 :

  120.             Bcd_T_B1=0 ;

  121.             break ;

  122.             default :

  123.             break ;

  124.         }

  125.     }


  126.     if(Bcd_T_B1==1&&Dis_Buffer[4]==0xFC)Dis_Buffer[4]=0x00 ;

  127.     if(Bcd_T_B1==2&&Dis_Buffer[4]==0xFC)

  128.     {

  129.         Dis_Buffer[4]=0x00 ;

  130.         if(Dis_Buffer[3]==0xFC)

  131.         

  132. ……………………


进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • PIC单片机控制的遥控防盗报警器电路

  • 红外线探测报警器

  • 短波AM发射器电路设计图

  • 使用ESP8266从NTP服务器获取时间并在OLED显示器上显示

  • 开关电源的基本组成及工作原理

  • 用NE555制作定时器

    相关电子头条文章