微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 新人求助温度显示加一个温度设定值蜂鸣器报警

新人求助温度显示加一个温度设定值蜂鸣器报警

时间:10-02 整理:3721RD 点击:
    ds18b20温度显示程序,4位共阳数码管显示。我想加一个温度高于设定值蜂鸣器响,低于则关闭。但是弄了好久都没成功,求大神看看。
#include<reg52.h>
#define ui unsigned int
#define uc unsigned char           //宏定义
sbit DQ =P3^7;                             //定义DS18B20总线I/O        
bit bdata fuhao;
uc qian,bai,shi,ge;
uc code led[]                =        {0x5F,0x44,0x9D,0xD5,0xC6,0xD3,0xDB,0x47,0xDF,0xD7};
uc code led_dian[]        =        {0x7f,0x64,0xbd,0xf5,0xe6,0xf3,0xfb,0x67,0xff,0xf7};
//============================================================================================
//====================================DS18B20=================================================
//============================================================================================
/*****延时子程序*****/
void Delay(int num)
{
        while(num--) ;
}
/*****初始化DS18B20*****/
void Init_DS18B20()
{
        DQ = 1;         //DQ复位
        Delay(8);    //稍做延时
        DQ = 0;         //单片机将DQ拉低
        Delay(80);   //精确延时,大于480us
        DQ = 1;         //拉高总线
        Delay(40);
}
/*****读一个字节*****/
uc ReadOneChar()
{
        uc i=0;
        uc dat = 0;
        for (i=8;i>0;i--)
        {
                DQ = 0;     // 给脉冲信号
                dat>>=1;
                DQ = 1;     // 给脉冲信号
                if(DQ)
                dat|=0x80;
                Delay(4);
        }
        return(dat);
}
/*****写一个字节*****/
void WriteOneChar(uc dat)
{
        uc i=0;
        for (i=8; i>0; i--)
        {
                DQ = 0;
                DQ = dat&0x01;
                Delay(5);
                DQ = 1;
                dat>>=1;
        }
}
/*****读取温度*****/
ui ReadTemperature()
{
  ui a=0,b=0,t=0;
  float tt=0;
  Init_DS18B20();
  WriteOneChar(0xCC);  //跳过读序号列号的操作
  WriteOneChar(0x44);  //启动温度转换
  Init_DS18B20();
  WriteOneChar(0xCC);  //跳过读序号列号的操作
  WriteOneChar(0xBE);  //读取温度寄存器
  a=ReadOneChar();     //读低8位
  b=ReadOneChar();    //读高8位
  t=b;
  t<<=8;
  t=t|a;
  if(t&0xf800)
  {
        t=~t+1;
        fuhao=1;
  }
  else
  fuhao=0;
  tt=t*0.0625;
  t=tt*10+0.5;     //放大10倍输出并四舍五入
  return(t);
}
/*****读取温度*****/
void check_wendu()
{
        ui f;
        f=ReadTemperature();                          //获取温度值并减去DS18B20的温漂误差
        qian=f/1000;
        bai=(f%1000)/100;                                                     //计算得到十位数字
        shi=((f%1000)%100)/10;                                            //计算得到个位数字
        ge=((f%1000)%100)%10;                                                      //计算得到小数位
}
/*****显示开机初始化等待画面*****/
void Disp_init()
{
        P0 = 0x7f;      //显示----
        P2 = 0x7f;
        Delay(100);
        P2 = 0xdf;
        Delay(100);   
        P2 = 0xf7;
        Delay(100);
        P2 = 0xfd;
        Delay(100);
        P2 = 0xff;         //关闭显示
}
/*****显示温度子程序*****/
void Disp_Temperature()     //显示温度
{
        if(qian==0)
        {
                if(fuhao==1)
                P0=0x7f;      //1011 1111
                else
                P0=0xff;
                P2=0xfd;
                Delay(10);
                P2 = 0xff;
        }
        else if(qian!=0)
        {
                P0 =~led[qian];
                P2 = 0xfd;
                Delay(10);
                P2 = 0xff;
        }
        if((bai==0)&&(qian==0))
        {
                P0=0xff;    //
                P2=0xf7;
                Delay(10);
                P2=0xff;
        }
        else if((bai==0)&&(qian!=0))
        {
                P0=~led[bai];
                P2=0xf7;
                Delay(10);
                P2=0xff;
        }
        else if(bai!=0)
        {
                P0=~led[bai];    //
                P2=0xf7;
                Delay(10);
                P2=0xff;
        }
        P0=~led_dian[shi];    //
        P2=0xdf;
        Delay(10);
        P2=0xff;
        P0=~led[ge];    //显示符号
        P2=0x7f;
        Delay(10);
        P2=0xff;         //关闭显示
}
/*****主函数*****/
void main()
{
        uc z;
        for(z=0;z<100;z++)
        {
                Disp_init();
                check_wendu();
        }
        while(1)
        {
                check_wendu();
                for(z=0;z<10;z++)
                Disp_Temperature();
        }
}

  这是加的蜂鸣器代码,蜂鸣器io口随便定义一个到时。
  if(temp>=310)         //当温度超过31度(仅作试验用,实际可设为其他更高的值),蜂鸣器便会报警。
                {
                        
                        beep=0;
                }
                else
                {
                        beep=1;

怎么加,貌似还要定义,困扰好久,新人初学不久,泪谢了!

早闻此论坛神人多!

难道都没起床么!

多去看一下别人写好的程序慢慢读一下应该就可以解决,建议仿真一下,proteus

仿真 还不怎么会用

直接把读出的温度和上限温度比较就好了

怎么个比较法呢?求助!

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top