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]