GPIO 发表于 2023-2-23 17:39:20

C51/STC系列单片机 MAX6675 K型热电偶芯片驱动程序源码 数码管显示温度:0~1023.75℃


#define u8 unsigned char
#define u16 unsigned int
#define u32 unsigned long

#include "STC12C5A60S2.h"
#include "intrins.h"
sbit SO = P3 ^ 6;
sbit SCK = P3 ^ 4;
sbit CS = P3 ^ 5;

#define IO_SEG P0                        //P2.0~P2.7:数码管段码,强推挽
#define T1ms 0x9E58                        //1ms 定时器初值 根据晶振频率修改
sbit io_dig1 = P2 ^ 0;                //位码(千位,强推挽)
sbit io_dig2 = P2 ^ 1;                //位码(百位,强推挽)
sbit io_dig3 = P2 ^ 2;                //位码(十位,强推挽)
sbit io_dig4 = P2 ^ 3;                //位码(个位,强推挽)

u16 MAX6675_ReadReg(){
        u8 i;
        u16 dat = 0;
        CS= 0;
        SCK = 0;
        for(i=0;i<16; i++){
                SCK = 1;
                dat <<= 1;
                if(SO){
                        dat |= 1;
                }
                SCK = 0;
        }
        CS = 1;
        return dat;
}

void InitTimer0(){
    TMOD = 0x01;
    TH0 = T1ms >> 8;
    TL0 = T1ms;
    EA = 1;
    ET0 = 1;
    TR0 = 1;
}
u8 code nbr = {                //共阴数码管段码16进制
    0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71
};
            
union {   //4位数码管当前显示的段码 更改数码管显示的段码 只需更改此数组
    u8 c;
    u32 l;
} show;


u32 float2seg4(float val){      //浮点小数转4位共阴数码管段码数据 小数范围:-999~9999
        bit neg = (val < 0);                //是否为负数
    union {
      u8 c;
      u32 l;
    } ret;
    u16 val2;                //小数化整用
    u8 dot = 0;                //小数点位置 0:无 1:千位 2:百位 3:十位 4:个位
    if(val >= 9999){
                val = 9999;
        } else if(val <= -999){
                val = -999;
        }
    if(neg) val = 0 - val;
    if(val >= 0 && val < 10){
                val2 = val * 1000;
                dot = 1;
        } else if(val >= 10 && val < 100){
                val2 = val * 100;
                dot = 2;
        } else if(val >= 100 && val < 1000){
                val2 = val * 10;
                dot = 3;
        } else if(val >= 1000 && val < 10000){
      val2 = val;
      dot = 0;
    }

    if(neg){
                if(++dot == 4){
                        dot = 0;
                }
      ret.c = 0x40;                //负号
                ret.c = nbr[(val2/1000)%10];
                ret.c = nbr[(val2/100)%10];
                ret.c = nbr[(val2/10)%10];
    } else {
                ret.c = nbr[(val2/1000)%10];
                ret.c = nbr[(val2/100)%10];
                ret.c = nbr[(val2/10)%10];
      ret.c = nbr;
    }
    if(dot){
                ret.c |= 0x80;
        }
    return ret.l;
}
bit delay;
u16 delay_ms;

void main(){
        float temp;                //测量温度 (单位:摄氏度,精度0.25度)
        u16 D;
        AUXR |= 0x80;
    InitTimer0();       
        while(1){
                D = MAX6675_ReadReg();
                        if(D & 4){                        //离线
                                show.l = 0x40404040;                //显示:----
                        } else {                        //在线
                                temp = (float)(D>>3)/4;                //计算温度
                                show.l = float2seg4(temp);        //显示温度
                        }
                delay_ms = 500;
                delay = 1;
                while(delay);
        }
}

void Timer0Interrupt() interrupt 1 {         //1mS 定时器0中断
    static u8 seg = 0;//当前正在扫描的数码管段码 4位数码管 范围:0~3
    TH0 = T1ms >> 8;
    TL0 = T1ms;
                if(delay && !--delay_ms){
                        delay = 0;
                }
    //数码管动态扫描处理
    IO_SEG = 0x00;                //消影
    io_dig1 = 1; io_dig2 = 1; io_dig3 = 1; io_dig4 = 1;
    switch (seg) {                //位码
      case 0:io_dig1 = 0; break;
      case 1:io_dig2 = 0; break;
      case 2:io_dig3 = 0; break;
      case 3:io_dig4 = 0; break;
    }
    IO_SEG = ~show.c;
    if (++seg >= 4) seg = 0;

}
页: [1]
查看完整版本: C51/STC系列单片机 MAX6675 K型热电偶芯片驱动程序源码 数码管显示温度:0~1023.75℃