m0_64887787 2021-12-05 21:42
浏览 24
已结题

有无朋友讲解一下这个程序

#include <reg51.h>
#include <intrins.h>
#include <DS18B20.h>
#define uchar unsigned char
#define uint unsigned int
#define SMGIO P0

sbit SET=P1^0; //定义设定上下限键
sbit ADD=P1^1; //定义增加键
sbit DEC=P1^2; //定义减小限键
sbit SMG1=P2^0; //定义数码管第一位
sbit SMG2=P2^1; //定义数码管第二位
sbit SMG3=P2^2; //定义数码管第三位
sbit SMG4=P2^3; //定义数码管第四位
sbit BEEP=P1^7; //定义蜂鸣器报警
uint tempValue; //变量 存储当前温度值
uint HI_Alarm=30; //初始上限
uint LO_Alarm=10; //初始下限
uchar SMG_CC[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共阴极数码管0-9编码
uchar SMG_CC_DOT[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef}; //共阴极数码管0-9编码 带小数点
//
/* 1ms延时 */
/
/
void delayms(uint x)
{
uchar i;
while(x--)
{
for(i=150;i>0;i--);
}
}

void Display_Temperature() //显示温度
{
char smg1,smg2,smg3,smg4;
smg1=tempValue/1000; //以下表示将温度值拆分开
smg2=(tempValue-smg1*1000)/100;
smg3=(tempValue%100)/10;
smg4=tempValue%10;
if(tflag==1) //负数显示
{
SMGIO=SMG_CC[smg4]; //显示小数位
SMG4=0;
delayms(1);
SMG4=1;
SMGIO=SMG_CC_DOT[smg3]; //显示个数位
SMG3=0;
delayms(1);
SMG3=1;
if(smg2==0)
{
SMGIO=0x40; //显示十数位
SMG2=0;
delayms(1);
SMG2=1;
SMGIO=0x00; //显示百数位
SMG1=0;
delayms(1);
SMG1=1;
}
else
{
SMGIO=SMG_CC[smg2]; //显示十数位
SMG2=0;
delayms(1);
SMG2=1;
SMGIO=0x40; //显示十数位
SMG1=0;
delayms(1);
SMG1=1;
}
}
else //正数显示
{
SMGIO=SMG_CC[smg4]; //显示小数位
SMG4=0;
delayms(1);
SMG4=1;
SMGIO=SMG_CC_DOT[smg3]; //显示个数位
SMG3=0;
delayms(1);
SMG3=1;
if(smg1==0)
{
SMGIO=0x00;
SMG1=0;
delayms(1);
SMG1=1;
if(smg2==0)
{
SMGIO=0x00;
SMG1=0;
delayms(1);
SMG1=1;
}
else
{
SMGIO=SMG_CC[smg2];
SMG2=0;
delayms(1);
SMG2=1;
}
}
else
{
SMGIO=SMG_CC[smg1];
SMG1=0;
delayms(1);
SMG1=1;
SMGIO=SMG_CC[smg2];
SMG2=0;
delayms(1);
SMG2=1;
}

    }

}
void Display_HI_Alarm()
{
SMGIO=0x76; //显示H
SMG1=0;
delayms(1);
SMG1=1;
SMGIO=0x40; //显示-
SMG2=0;
delayms(1);
SMG2=1;

SMGIO=SMG_CC[HI_Alarm/10];    //显示报警高值十位
SMG3=0;
delayms(1);
SMG3=1;
SMGIO=SMG_CC[HI_Alarm%10];    //显示报警高值个数位
SMG4=0;
delayms(1);
SMG4=1;    

}
void Display_LO_Alarm()
{
SMGIO=0x38; //显示L
SMG1=0;
delayms(1);
SMG1=1;
SMGIO=0x40; //显示-
SMG2=0;
delayms(1);
SMG2=1;

SMGIO=SMG_CC[LO_Alarm/10];    //显示报警高值十位
SMG3=0;
delayms(1);
SMG3=1;
SMGIO=SMG_CC[LO_Alarm%10];    //显示报警高值个数位
SMG4=0;
delayms(1);
SMG4=1;    

}
void SET_KEY()
{ bit SET_FLAG=1;
if(SET==0) //设定按键按下
{
delayms(40);
if(SET==1) //延时去除抖动再次判断是否按下按键
{
while(SET_FLAG==1)
{
Display_HI_Alarm(); //设定上限温度值
if(ADD==0) //增加按键
{
delayms(40); //延时去除抖动再次判断是否按下按键
if(ADD==1)
HI_Alarm++; //温度值加一
}
if(DEC==0) //减小按键
{
delayms(40);
if(DEC==1) //延时去除抖动再次判断是否按下按键
HI_Alarm--; //温度值减一
}
if(SET==0) //以下表示 再次按下设定按键 进入设定下限程序
{
delayms(40);
if(SET==1) //延时去除抖动再次判断是否按下按键
{
while(1)
{
Display_LO_Alarm(); //设定下限温度值
if(ADD==0) //增加按键
{
delayms(40);
if(ADD==1) //延时去除抖动再次判断是否按下按键
LO_Alarm++; //温度值加一
}
if(DEC==0) //减小按键
{
delayms(40);
if(DEC==1) //延时去除抖动再次判断是否按下按键
LO_Alarm--; //温度值减一
}
if(SET==0) //设定按键按下
{
delayms(40);
if(SET==1)
{ //延时去除抖动再次判断是否按下按键
SET_FLAG=0;
break; //上下限设定完成 退出
}
}
}
}
}
}
}
}
}
void BJ_LED()
{
if(tempValue>=HI_Alarm10||tempValue<=LO_Alarm10) //如果温度超过上下限
BEEP=0; //蜂鸣器报警
else BEEP=1;

}

void main()
{
BEEP=1; //表示先清除报警
while(1)
{
tempValue=ReadTemperature(); //读取温度值
Display_Temperature(); //显示温度数据
BJ_LED(); //调用报警函数
SET_KEY(); //调用按键读取函数

}

}

  • 写回答

0条回答 默认 最新

    报告相同问题?

    问题事件

    • 系统已结题 12月13日
    • 创建了问题 12月5日

    悬赏问题

    • ¥100 需要跳转番茄畅听app的adb命令
    • ¥50 寻找一位有逆向游戏盾sdk 应用程序经验的技术
    • ¥15 请问有用MZmine处理 “Waters SYNAPT G2-Si QTOF质谱仪在MSE模式下采集的非靶向数据” 的分析教程吗
    • ¥50 opencv4nodejs 如何安装
    • ¥15 adb push异常 adb: error: 1409-byte write failed: Invalid argument
    • ¥15 nginx反向代理获取ip,java获取真实ip
    • ¥15 eda:门禁系统设计
    • ¥50 如何使用js去调用vscode-js-debugger的方法去调试网页
    • ¥15 376.1电表主站通信协议下发指令全被否认问题
    • ¥15 物体双站RCS和其组成阵列后的双站RCS关系验证