微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > AD转换/蜂鸣器

AD转换/蜂鸣器

时间:10-02 整理:3721RD 点击:
以下代码是AD转换使光敏电阻阻值在数码管上显示,如果阻值大于100,则蜂鸣器响。但是写完代码调试后发现蜂鸣器确实在响,但是响的声音非常微小,没有独立实现蜂鸣器时响的声音大,麻烦各位帮忙看看哪里出现了问题?
//光敏电阻报警设置
//AD转换,光敏电阻阻值在数码管上显示
#include<reg51.h>
#include<intrins.h>
//---重定义关键词---//
#define uchar unsigned char
#define uint  unsigned int
#define ulong  unsigned long
#define GPIO_DIG P0
//---定义使用的IO口---//
sbit CLK  = P3^0;          //时钟         
sbit CS   = P3^1;          //片选
sbit DIN  = P3^2;          //输入
sbit DOUT = P3^3;          //输出
sbit beep=P2^6;
uint Read_AD_Data(uchar cmd);
uint SPI_Read(void);
void SPI_Write(uchar dat);
//--定义全局变量--//
unsigned char code DIG_CODE[17]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的显示码
unsigned char table1[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
unsigned char DisplayData[8];                //用来存放要显示的8位数的值
void DigDisplay(void);
void delay()
{
    char i,j;
            for(i; i > 0; i--)                 
        for(j = 200; j > 0; j--);
}
void SPI_Start(void)
{
        CLK = 0;
        CS  = 1;
        DIN = 1;
        CLK = 1;
        CS  = 0;               
}
/****************************************************************************
*函数名:SPI_Write
*输  入:dat:写入数据
*输  出:无
*功  能:使用SPI写入数据
****************************************************************************/
void SPI_Write(uchar dat)
{
        uchar i;
        CLK = 0;
        for(i=0; i<8; i++)
        {
                DIN = dat >> 7;          //放置最高位
                dat <<= 1;
                CLK = 0;                        //上升沿放置数据
                CLK = 1;
        }
}
/****************************************************************************
*函数名:SPI_Read
*输  入:无
*输  出:dat:读取 到的数据
*功  能:使用SPI读取数据
****************************************************************************/
uint SPI_Read(void)
{
        uint i, dat=0;
        CLK = 0;
        for(i=0; i<12; i++)                //接收12位数据
        {
                dat <<= 1;
                CLK = 1;
                CLK = 0;
                dat |= DOUT;
        }
        return dat;       
}
/****************************************************************************
*函数名:Read_AD_Data
*输  入:cmd:读取的X或者Y
*输  出:endValue:最终信号处理后返回的值
*功  能:读取触摸数据
****************************************************************************/
uint Read_AD_Data(uchar cmd)
{
        uchar i;
        uint AD_Value;
        CLK = 0;
        CS  = 0;
        SPI_Write(cmd);
        for(i=6; i>0; i--);         //延时等待转换结果
        CLK = 1;          //发送一个时钟周期,清除BUSY
        _nop_();
        _nop_();
        CLK = 0;
        _nop_();
        _nop_();
        AD_Value=SPI_Read();
        CS = 1;
        return AD_Value;       
}

void main(void)
{
        unsigned char altemp=100;
         
        uint temp,count;
        while(1)
        {
          if(count==50)
          {
                  count=0;
        //        temp = Read_AD_Data(0x94);                //   AIN0 电位器
        //        temp = Read_AD_Data(0xD4);                //   AIN1 热敏电阻
                temp = Read_AD_Data(0xA4);                //   AIN2 光敏电阻
        //        temp = Read_AD_Data(0xE4);                //   AIN3 外部输入
          }
          count++;
          
          DisplayData[0]=DIG_CODE[0];
          DisplayData[1]=DIG_CODE[0];
          DisplayData[2]=DIG_CODE[0];
          DisplayData[3]=DIG_CODE[0];
          DisplayData[4]=DIG_CODE[temp%10000/1000];
          DisplayData[5]=DIG_CODE[temp%1000/100];
          DisplayData[6]=DIG_CODE[temp%100/10];
          DisplayData[7]=DIG_CODE[temp%10/1];
          DigDisplay();
          if(temp>altemp)
          {
          beep=1;
          delay();
          beep=0;
          //delay();
          }
          else
          beep=0;
          
        }
}
void DigDisplay(void)
{
        unsigned char i;
        unsigned int j;
        for(i=0;i<8;i++)
        {
                P1=table1[i];
                GPIO_DIG=DisplayData[i];//发送段码
                j=50;                                                 //扫描间隔时间设定
                while(j--);       
                GPIO_DIG=0x00;//消隐
        }
}

在程序没有变动的情况下,声音小应该找硬件的问题把

程序部分我自己修改了 但是要把蜂鸣器部分独自拿出来实现 声音是正常的 要是加入到以上程序里发出的声音就不正常了

这样说明就是你硬件线路的问题   

蜂鸣器没有连续发声,中间有中断

什么意思 应该怎么改程序

驱动无源蜂鸣器?只玩过555驱动 单片机程序不懂!坑呀!

很好的资料,值得学习

很好的资料,值得学习

P2.6高电平驱动不足!看看硬件电路!

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

网站地图

Top