|
- #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] = { //共阴数码管段码16进制
- 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71
- };
-
- union { //4位数码管当前显示的段码 更改数码管显示的段码 只需更改此数组
- u8 c[4];
- u32 l;
- } show;
- u32 float2seg4(float val){ //浮点小数转4位共阴数码管段码数据 小数范围:-999~9999
- bit neg = (val < 0); //是否为负数
- union {
- u8 c[4];
- 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[0] = 0x40; //负号
- ret.c[1] = nbr[(val2/1000)%10];
- ret.c[2] = nbr[(val2/100)%10];
- ret.c[3] = nbr[(val2/10)%10];
- } else {
- ret.c[0] = nbr[(val2/1000)%10];
- ret.c[1] = nbr[(val2/100)%10];
- ret.c[2] = nbr[(val2/10)%10];
- ret.c[3] = nbr[val2%10];
- }
- if(dot){
- ret.c[dot-1] |= 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[seg];
- if (++seg >= 4) seg = 0;
- }
复制代码 |
|