设为首页收藏本站淘宝杂货铺

从F到0 - From F to 0

 找回密码
 注册已关闭
搜索
查看: 315|回复: 0
收起左侧

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

[复制链接]
发表于 2023-2-23 17:39:20 | 显示全部楼层 |阅读模式
MAX6675.jpg
  1. #define u8 unsigned char
  2. #define u16 unsigned int
  3. #define u32 unsigned long

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

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

  15. u16 MAX6675_ReadReg(){
  16.         u8 i;
  17.         u16 dat = 0;
  18.         CS  = 0;
  19.         SCK = 0;
  20.         for(i=0;i<16; i++){
  21.                 SCK = 1;
  22.                 dat <<= 1;
  23.                 if(SO){
  24.                         dat |= 1;
  25.                 }
  26.                 SCK = 0;
  27.         }
  28.         CS = 1;  
  29.         return dat;
  30. }

  31. void InitTimer0(){
  32.     TMOD = 0x01;
  33.     TH0 = T1ms >> 8;
  34.     TL0 = T1ms;
  35.     EA = 1;
  36.     ET0 = 1;
  37.     TR0 = 1;
  38. }
  39. u8 code nbr[16] = {                //共阴数码管段码16进制
  40.     0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71
  41. };
  42.               
  43. union {     //4位数码管当前显示的段码 更改数码管显示的段码 只需更改此数组
  44.     u8 c[4];
  45.     u32 l;
  46. } show;


  47. u32 float2seg4(float val){      //浮点小数转4位共阴数码管段码数据 小数范围:-999~9999
  48.         bit neg = (val < 0);                //是否为负数
  49.     union {
  50.         u8 c[4];
  51.         u32 l;
  52.     } ret;
  53.     u16 val2;                //小数化整用
  54.     u8 dot = 0;                //小数点位置 0:无 1:千位 2:百位 3:十位 4:个位
  55.     if(val >= 9999){
  56.                 val = 9999;
  57.         } else if(val <= -999){
  58.                 val = -999;
  59.         }
  60.     if(neg) val = 0 - val;
  61.     if(val >= 0 && val < 10){
  62.                 val2 = val * 1000;
  63.                 dot = 1;
  64.         } else if(val >= 10 && val < 100){
  65.                 val2 = val * 100;
  66.                 dot = 2;
  67.         } else if(val >= 100 && val < 1000){
  68.                 val2 = val * 10;
  69.                 dot = 3;
  70.         } else if(val >= 1000 && val < 10000){
  71.         val2 = val;
  72.         dot = 0;
  73.     }

  74.     if(neg){
  75.                 if(++dot == 4){
  76.                         dot = 0;
  77.                 }
  78.         ret.c[0] = 0x40;                //负号
  79.                 ret.c[1] = nbr[(val2/1000)%10];
  80.                 ret.c[2] = nbr[(val2/100)%10];
  81.                 ret.c[3] = nbr[(val2/10)%10];
  82.     } else {
  83.                 ret.c[0] = nbr[(val2/1000)%10];
  84.                 ret.c[1] = nbr[(val2/100)%10];
  85.                 ret.c[2] = nbr[(val2/10)%10];
  86.         ret.c[3] = nbr[val2%10];
  87.     }
  88.     if(dot){
  89.                 ret.c[dot-1] |= 0x80;
  90.         }
  91.     return ret.l;
  92. }
  93. bit delay;
  94. u16 delay_ms;

  95. void main(){
  96.         float temp;                //测量温度 (单位:摄氏度,精度0.25度)
  97.         u16 D;
  98.         AUXR |= 0x80;
  99.     InitTimer0();       
  100.         while(1){
  101.                 D = MAX6675_ReadReg();
  102.                         if(D & 4){                        //离线
  103.                                 show.l = 0x40404040;                //显示:----
  104.                         } else {                        //在线
  105.                                 temp = (float)(D>>3)/4;                //计算温度
  106.                                 show.l = float2seg4(temp);        //显示温度
  107.                         }
  108.                 delay_ms = 500;
  109.                 delay = 1;
  110.                 while(delay);
  111.         }
  112. }

  113. void Timer0Interrupt() interrupt 1 {         //1mS 定时器0中断
  114.     static u8 seg = 0;  //当前正在扫描的数码管段码 4位数码管 范围:0~3
  115.     TH0 = T1ms >> 8;
  116.     TL0 = T1ms;
  117.                 if(delay && !--delay_ms){
  118.                         delay = 0;
  119.                 }
  120.     //数码管动态扫描处理
  121.     IO_SEG = 0x00;                //消影
  122.     io_dig1 = 1; io_dig2 = 1; io_dig3 = 1; io_dig4 = 1;
  123.     switch (seg) {                //位码
  124.         case 0:io_dig1 = 0; break;
  125.         case 1:io_dig2 = 0; break;
  126.         case 2:io_dig3 = 0; break;
  127.         case 3:io_dig4 = 0; break;
  128.     }
  129.     IO_SEG = ~show.c[seg];
  130.     if (++seg >= 4) seg = 0;

  131. }
复制代码

相关帖子

您需要登录后才可以回帖 登录 | 注册已关闭

本版积分规则

QQ|手机版|Archiver|从F到0 ( 蒙ICP备17002595号-1 )
蒙公网安备15010402000325号

腾讯云安全认证

GMT+8, 2024-4-25 22:30 , Processed in 1.349077 second(s), 31 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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