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;//消隐
}
}
//光敏电阻报警设置
//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高电平驱动不足!看看硬件电路!