找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2350|回复: 4
打印 上一主题 下一主题
收起左侧

求问大神,单片机蜂鸣器为什么不响呀?

[复制链接]
跳转到指定楼层
楼主
蜂鸣器不响,我自己也不太懂c语言,求大神指导,谢谢!
#include<reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int

sbit DQ=P1^3;      //DS18B20  定义使用单片机P17端口

sbit lcdrs=P2^7;  //1602数据/命令选择端
sbit lcdrw=P2^6;  //1602读/写选择端
sbit lcden=P2^5;  //1602使能

sbit RJDQ=P1^4;    //红色LED 超过正常范围值点亮
sbit BJDQ=P1^5;    //蓝色LED 低于正常范围值点亮

sbit BELL=P2^4;    //蜂鸣器报警控制端

sbit K1=P1^0;      //设置键/确定键
sbit K2=P1^1;      //数字调整键  加1
sbit K3=P1^2;      //箭字调整键  减1


uint wendu=0;  //温度初始数值0度

uchar tem_h=30,tem_l=10;//温湿度上下限变量

uchar keyflag_1=0;  //按键标志位   根据按键次数执行操作内容


/********************延时函数,延时一毫秒************************/
void delay(uint z)
{
    uint x,y;
    for(x=z;x>0;x--)
        for(y=112;y>0;y--);
}
/**************************1602显示****************************/

void write_cmd(char cmd)  //写指令函数
{
    lcdrs=0;//低电位送指令
    P0=cmd;
    delay(1);
    lcden=1;
    delay(1);
    lcden=0;

}
void write_data(uchar dat) //写数据函数
{
    lcdrs=1;//高电位送数据
    P0=dat ;
    delay(1);
    lcden=1;
    delay(1);
    lcden=0;
}
void write_str(uchar *str)//写字符串函数
{
    while(*str!='\0')
    {
        write_data(*str++);
        delay(60);
    }
}

/***************************初始化******************************/
void init()
{

    lcdrw=0;//先将RW拉低
    lcden=0;//再把EN拉低
    write_cmd(0x38);//显示模式设置
    write_cmd(0x0c);//开启显示屏,关光标,光标不闪烁
    write_cmd(0x06);//显示地址递增,即写一个数据后,显示位置右移一位
    write_cmd(0x01);//清除屏幕
    write_cmd(0x80);//数据指针 把光标移到第一行第一个位置
}
/************************DS18B20程序*************************/
bit init_DS18B20()
{
    uchar num;
    bit flag;
    DQ=1;
    for(num=0;num<2;num++);  //先拉高
    DQ=0;
    for(num=0;num<200;num++);  // 480-960us    powerup
    DQ=1;
    for(num=0;num<20;num++);   // >60us   wait
    flag=DQ;                   // 响应
    for(num=0;num<150;num++);  //  60-240us ds18b20存在信号
    DQ=1;
    return flag;
}

void DS18B20_WR_CHAR(uchar byte)//写18b20数据//
{   
    uchar num;
    uchar num1;
    for(num1=0;num1<8;num1++)
    {      
        DQ=0;       //拉低
        _nop_();    //下拉1us
        _nop_();
        DQ=byte&0x01;             //写数据,从地位开始
        for(num=0;num<20;num++);   // >60us   wait
        byte>>=1;   
        DQ=1;     //拉高   
        _nop_();
        _nop_();
    }                              //8位数据,一位一位的写入ds18b20
}

uchar DS18B20_RD_CHAR()            //读18b20数据
{
    uchar num;
    uchar num1;
    uchar byte=0;
    for(num1=0;num1<8;num1++)
    {
        DQ=0;   //拉低
        _nop_();
        DQ=1;
        for(num=0;num<1;num++);  // <10us  
        byte>>=1;
        if(DQ==1)
            byte|=0x80;
        else
            byte|=0x00;
        DQ=1;   //拉高
        _nop_();
        _nop_();
        for(num=0;num<20;num++);  // >60us

    }
    return byte;
}
void DS18B20_WENDU()
{
    uchartemperaturel=0;
    uchartemperatureh=0;


    if(init_DS18B20()==0)
    {
        DS18B20_WR_CHAR(0xcc);  //发命令:Skip ROM,跳过读序列号
        DS18B20_WR_CHAR(0x44);  //启动温度转换

        if(init_DS18B20()==0)
        {   
            DS18B20_WR_CHAR(0xcc);   //发命令:SkipROM,跳过读序列号
            DS18B20_WR_CHAR(0xBE);   //读取温度
            _nop_();
            temperaturel=DS18B20_RD_CHAR();     //温度值低8为存入temperaturel
            temperatureh=DS18B20_RD_CHAR();     //温度值高8为存入temperatureh
            wendu=(temperatureh*256+temperaturel)*0.625;//完成数据整合,温度比正常大10倍
            init_DS18B20();                                 
        }           
    }
}

void keyscan()  //按键扫描
{
    if(K1==0)   
    {
        delay(5);
        if(K1==0)
            {
             keyflag_1++;  //键一按下,标志位加1
             while(!K1);
            }   
    }
    if(keyflag_1==3){keyflag_1=0;write_cmd(0x0c);}
    if(keyflag_1==1){write_cmd(0x89);write_cmd(0x0d);}//温度上限末位打开光标
    if(keyflag_1==2){write_cmd(0x8f);write_cmd(0x0d);} //温度下限末位打开光标
    if(keyflag_1!=0)
    {           
        if(K2==0)   //限值加键
        {      
            delay(5);     //按键消除抖动判断
            if(K2==0)
            {
                while(!K2);
                if(keyflag_1==1)
                {
                 tem_h++;
                if(tem_h==100)tem_h=0;            
                write_cmd(0x88);
                write_data(tem_h/10+48);
                 write_data(tem_h%10+48);                       
                }
                if(keyflag_1==2)
                {
                tem_l++;
                if(tem_l==100)tem_l=0;
                write_cmd(0x8e);
                write_data(tem_l/10+48);
                write_data(tem_l%10+48);
                }
            }
        }
        if(K3==0)        //限值减键
        {
            delay(5);     //按键消除抖动判断
            if(K3==0)
            {
                while(!K3);
                if(keyflag_1==1)
                {
                 tem_h--;
                if(tem_h==0)tem_h=99;            
                write_cmd(0x88);
                write_data(tem_h/10+48);
                 write_data(tem_h%10+48);                       
                }
                if(keyflag_1==2)
                {
                tem_l--;
                if(tem_l==0)tem_l=99;
                write_cmd(0x8e);
                write_data(tem_l/10+48);
                write_data(tem_l%10+48);
                }
            }
        }                                      
    }   
}

/**********************报警判断函数  ******************************/

void baojing()  
{
  uchar u;
u=((wendu/100)%10)*10+(wendu/10)%10; //如果用同一个wendu变量,进入功能选择是,wendu原来的值没有保存变为0

if(u>=tem_h)   //温度大于设定上限值
        {RJDQ=0; BELL=0;} //红灯亮 蜂鸣器响
          elseif(u<tem_l) //温度低于下限值
                 {BJDQ=0; BELL=0;}  //蓝灯亮  蜂鸣器响  
                           else{BELL=1;BJDQ=1;RJDQ=1;}  //正常值  红蓝灯关  蜂鸣器关

}


/************************主函数******************************/
void main()
{
    init(); //初始化1602界面
   write_str(" SET: H=   L=   ");
    write_cmd(0x88);
    write_data((tem_h/10)+48);
    write_data(tem_h%10+48);
    write_cmd(0x8e);
    write_data((tem_l/10)+48);
    write_data(tem_l%10+48);
    write_cmd(0xc0);
    write_str("  temp:       ");
    DS18B20_WENDU();
    delay(1000);
    while(1)
    {   
        keyscan();
        if((init_DS18B20()==0)&&(keyflag_1==0))   
        {   
            DS18B20_WENDU();  
            write_cmd(0xc7);//把光标移到第二行第七个位置
            write_data((wendu/100)%10+48);
            write_data((wendu/10)%10+48);
            write_data('.');
            write_data(wendu%10+48);
            write_data(0xdf);
            write_data('C');
         }  
     baojing();     
    }
}

51hei图片20200530230010.png (138.26 KB, 下载次数: 90)

51hei图片20200530230010.png
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:213173 发表于 2020-5-31 08:08 | 只看该作者
把报警程序里BELL=0;改为驱动无源蜂鸣器语句即可。另外你的仿真图与程序中使用的端口不符。

  1. /**********************报警判断函数  ******************************/
  2. void baojing()  
  3. {
  4.         uchar u,i,t;

  5.         u=((wendu/100)%10)*10+(wendu/10)%10; //如果用同一个wendu变量,进入功能选择是,wendu原来的值没有保存变为0       
  6.         if(u>=tem_h)   //温度大于设定上限值
  7.         {
  8.                 RJDQ=0; //红灯亮 蜂鸣器响
  9.                 t=250;
  10.                 while(t--)
  11.                 {       
  12.                         BELL=~BELL;
  13.                         for(i=0;i<28;i++);                //0.24ms半周期=2083Hz
  14.                 }                                                       
  15.                 BELL=1;       
  16.                 delay(250);
  17.         }
  18.         else if(u<tem_l) //温度低于下限值
  19.         {
  20.                 BJDQ=0; //蓝灯亮  蜂鸣器响
  21.                 t=250;
  22.                 while(t--)
  23.                 {       
  24.                         BELL=~BELL;
  25.                         for(i=0;i<28;i++);                //0.24ms半周期=2083Hz
  26.                 }                                                       
  27.                 BELL=1;
  28.                 delay(250);
  29.         }   
  30.         else
  31.         {
  32.                 BELL=1;
  33.                 BJDQ=1;
  34.                 RJDQ=1;
  35.         }
  36. }
复制代码
回复

使用道具 举报

板凳
ID:765412 发表于 2020-5-31 10:14 | 只看该作者
wulin 发表于 2020-5-31 08:08
把报警程序里BELL=0;改为驱动无源蜂鸣器语句即可。另外你的仿真图与程序中使用的端口不符。

想再问一下,让蜂鸣器报警时一直响滴——,而不是滴-滴-滴-,应该改哪里呀
回复

使用道具 举报

地板
ID:729457 发表于 2020-5-31 10:57 | 只看该作者
可是看看联调是不是有问题
回复

使用道具 举报

5#
ID:748788 发表于 2020-5-31 11:02 | 只看该作者
先检查蜂鸣器有没有问题
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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