久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2662|回復: 4
收起左側

求問大神,單片機蜂鳴器為什么不響呀?

[復制鏈接]
ID:765412 發表于 2020-5-30 23:03 | 顯示全部樓層 |閱讀模式
蜂鳴器不響,我自己也不太懂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
回復

使用道具 舉報

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 | 顯示全部樓層
可是看看聯調是不是有問題
回復

使用道具 舉報

ID:748788 發表于 2020-5-31 11:02 | 顯示全部樓層
先檢查蜂鳴器有沒有問題
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 精品中文在线 | 91在线区| 亚洲一区av | 久久久精| av二区三区 | 欧美成年网站 | 中文精品视频 | 免费午夜电影 | 成人免费在线观看视频 | 亚洲网址 | 国产午夜精品一区二区三区嫩草 | 亚洲精品视频在线看 | 国产三级网站 | 国产乱码精品一区二区三区中文 | 欧美电影免费网站 | 免费在线观看av的网站 | 国产伦精品一区二区三区精品视频 | 国产欧美一级 | 欧美日本亚洲 | 欧美精品一区二区三区在线播放 | 天天干b| 伊人久麻豆社区 | 在线播放中文字幕 | 日韩精品一区二区三区视频播放 | 一级黄a视频 | 亚州精品成人 | 高清国产一区二区 | 韩日一区二区三区 | 欧美最猛性xxxxx亚洲精品 | 国产又色又爽又黄又免费 | 99国内精品久久久久久久 | 综合久久av | 久久久久久黄 | 国产在线观看 | 最新日韩欧美 | 亚洲三级在线观看 | 国产成视频在线观看 | 久久草在线视频 | 国产高清精品一区二区三区 | 国产成人精品久久 | 日本久久网 |