⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 h23.c

📁 51单片机程序C和汇编
💻 C
字号:

#include <reg51.h>

#define LEDLen 6
#define LowTemp   (-99)   // A/D 0
#define HighTemp  99      // A/D 255

xdata unsigned char OUTBIT _at_ 0x9002;
xdata unsigned char OUTSEG _at_ 0x9004;   // 段控制口
xdata unsigned char IN     _at_ 0x9001;
xdata unsigned char ADPort _at_ 0x8000;

signed char CurTemp;
unsigned char LEDBuf[LEDLen];
code unsigned char LEDMAP[] = {
  0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,
  0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71
};

void Delay(unsigned char CNT)
{
  unsigned char i;

  do{
    i = 100;
    do{
    }while(--i);
  }while (--CNT);
}

void DisplayLED()
{
  unsigned char i;
  unsigned char Pos;
  unsigned char LED;

  // 初始位置为右边
  Pos = 0x20;
  for (i = 0; i < LEDLen; i++) {
    // 关闭所显示位
    OUTBIT = 0;
    // 取出显示数据
    LED = LEDBuf[i];
    OUTSEG = LED;
    // 输出位选通信号,选择一位LED点亮
    OUTBIT = Pos;
    // 延时
    Delay(2);
    // 移位,选择下一位LED准备点亮
    Pos >>= 1;
  }
  OUTBIT = 0;
}


void DisplayResult()
{
  signed char T;

  T = CurTemp;
  if (T < 0) {
    //如果温度低于零度,显示'-'号
    LEDBuf[0] = 0x40;
    T = - T;
  } else LEDBuf[0] = 0;
  //显示温度十位数
  LEDBuf[1] = LEDMAP[T / 10];
  //显示温度个位数
  LEDBuf[2] = LEDMAP[T % 10];

  LEDBuf[3] = 0;
}

unsigned char ReadAD()
{
  unsigned int i;

  // 启动A/D变换
  ADPort = 0;
  //延时100us,
  for (i=0; i<20; i++);
  //得到A/D采样值
  return (0xff - ADPort);
}

void ReadTemp()
{
  unsigned char i;
  signed int Temp;

  Temp = 0;
  //采样16次,取平均数
  for (i=0; i<16; i++) {
    Temp += ReadAD();
  };
  //AD采样值转换为实际温度
  CurTemp = (Temp >> 4) * (HighTemp-LowTemp) / 256 + LowTemp;
}


void main()
{
  unsigned char dtimer;

  while (1) {
    for(dtimer=15; dtimer>0; dtimer--){
      // 当前温度和设定温度送显示缓冲
      DisplayResult();
      // 显示当前温度和设定温度
      DisplayLED();
    };
    // 读入当前温度
    ReadTemp();
  }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -