目录

一、主要功能

二、使用步骤

三、硬件资源

四、软件设计

五、实验现象

一、主要功能

1、数码管显示温度
2、按键​设置对应上下限阈值
3、高于阈值或低于阈值声光警报

二、使用步骤

基于51单片机的数字温度计数码管显示系统设计,主要包含温度采集、数据处理和动态显示三大模块。

三、硬件资源

1、51单片机核心模块
2、按键模块
3、温度传感器
4、蜂鸣器模块
5、LED灯模块
6、数码管显示模块

四、软件设计

# include <reg51.h>  
#define uint unsigned int 
#define uchar unsigned char   //宏定义
#define Disdata P2      //段码输出口
#define discan  P0       //扫描口
sbit p34=P0^0; 
sbit p35=P0^1;
sbit p36=P0^2; 
sbit dp=P2^7; 
sbit p37=P0^3;
sbit DQ=P1^0;    //定义DS18B20总线I/O
sbit set=P1^6;    //定义选择报调整警温度上限和下限(1为上限,0为下限)
/****P1.4和P1.4为调整温度报警增加键和减少键******/
sbit SET=P3^2; 
sbit add=P1^4;
sbit dec=P1^5;
sbit led_red=P1^2;        //超过上限温度或低于下限温度,红灯亮·
sbit led_green=P1^3;        //温度在正常范围内,绿灯亮
sbit speaker=P3^5;   //定义响铃
int temp1;  
signed char m;     //温度值全局变量
 bit sign=0;     //外部中断状态标志 
 signed char shangxian=28;  //上限报警温度,默认值为38
 signed char xiaxian=25;   //下限报警温度,默认值为5
 uchar code  LEDData[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf}; /*****延时子程序*****/
 uchar code dis_7[12]={0xc0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xFF,0xBF};
 /*共阳LED段码表 "0","1","2","3","4","5","7","8","9","不亮","-"*/
 uchar code scan_con[4]={0xf1,0xF2,0xF4,0xF8};  //列扫描控制字
 uchar data temp_data[2]={0x00,0x00}; //读出温度暂存
 uchar data display[5]={0x00,0x00,0x00,0x00,0x00}; //显示单元数据,共4个数据,其中一个作为运算暂存用
 void Delay(uint i)
 {  
 while( i-- );
 }
  /******************显示扫描函数**********************/
void scan()
 {
     char k;
    for(k=0;k<4;k++)       //循环扫描4个口,并显示
    {
    Disdata=dis_7[display[k]];
    if(k==1){dp=0;}
    discan=scan_con[k];
    Delay(65);
    discan=0xff;
    }
    
 }

void Init_DS18B20(void) 
{  
  unsigned char x=0;    
    DQ=1;    Delay(8);    //稍做延时 
   DQ=0;         //单片机将DQ拉低  
 Delay(80);   //精确延时,大于480us 
  DQ=1;         //拉高总线 
  Delay(14); 
   x=DQ;           //稍做延时后,如果x=0则初始化成功,x=1则初始化失败  
 Delay(20);
 }  
 /***************18b20读一字节函数****************/
  unsigned char ReadOneChar(void) 
{   
 unsigned char i=0; 
  unsigned char dat=0; 
  for (i=8;i>0;i--)  
 {     
 DQ=0;     // 给脉冲信号   
  dat>>=1;   
   DQ=1;     // 给脉冲信号 
    if(DQ)     dat|=0x80;  
   Delay(4); 
  }   
 return(dat); }  

 void WriteOneChar(unsigned char dat) 
{    unsigned char i=0; 
  for (i=8; i>0; i--) 
  { 
     DQ=0;   
   DQ=dat&0x01;  
   Delay(5);     
DQ=1;     dat>>=1; 
  }
 }  
void Tmpchange(void) //发送温度转换命令
 {  
  Init_DS18B20(); 
   WriteOneChar(0xCC);  //跳过读序号列号的操作  
 WriteOneChar(0x44);  //启动温度转
   }
unsigned int ReadTemperature(void)
 {   
 unsigned char a=0; 
  unsigned char b=0; 
  unsigned int t=0;  
 float tt=0;  
 Tmpchange();
   Init_DS18B20();  
  WriteOneChar(0xCC);  //跳过读序号列号的操作 
  WriteOneChar(0xBE);  //读取温度寄存器  
 a=ReadOneChar();     //读低8位 
  b=ReadOneChar();    //读高8位 
  t=b;   t<<=8;   t=t|a;    tt=t*0.0625;    t= tt*100+0.5;     //放大10倍输出并四舍五入 
  return(t); }     /*****显示开机初始化等待画面*****/
Disp_init()     {   
 P2 = 0x80;      //显示- 
 p34=1;p35=0;p36=0;p37=0;
 Delay(200); 
 P2 = 0x80;
   p34=0;p35=1;p36=0;p37=0; 
 Delay(200); 
  P2 = 0x80; 
    p34=0;p35=0;p36=1;p37=0; 
 Delay(200); 
  P2 = 0x80; 
   p34=0;p35=0;p36=0;p37=1; 
 Delay(200); 
  P2 = 0x80; 
  }

/*****主函数*****/
 void main(void)
 {   
  uint h;
  IT0=1;  
  IT1=1; 
  EX0=1; 
  EX1=1; 
  EA=1;
  for(h=0;h<4;h++)
    {
        display[h]=8;        //开机显示8888
    } 
  ReadTemperature(); 
  speaker=0;   
 for(h=0;h<500;h++)
    {
        scan();        //开机显示“8888”2s
}
 while(1)  
 {      
  if(temp1==0)
      {
        work_temp();
        beep();             //检测是否超过上限或低于下限
        keyscan();        //按键检测
        }
        else
        {
        keyscan();       //按键检测
        }    
 }
}
 

五、实验现象

演示视频:

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐