#include<reg51h>
#define uchar unsigned char
#define uint unsigned int
sbit SPK=P1^0;
sbit K1=P1^7;
//发声函数,注意这里是用扬声器,不能用普通的蜂鸣器
void Alarm(uchar t)
{
uchari,j;
for(i=0;i<200;i++)
{
SPK=~SPK;
for(j=0;j<t;j++); //由参数t行成不同的频率产生不同的声音
}
}
voidmain()
{
SPK=0;
while(1)
{
if(K1==1)
{
Alarm(90);
Alarm(120);
}
}
}
#include <intrinsh>
#define uchar unsigned char
#define uint unsigned int
#define out P0 ;
#define INT8U unsigned char //宏定义
#define INT16U unsigned int
sbit smg1=P2^0;
sbit smg2=P2^1;
sbit smg3=P2^2;
sbit smg4=P2^3;
sbit Beep=P1^5; //蜂鸣器引脚定义
sbit led=P1^6;
sbit led1=P1^7; //设置灯光报警键
sbit DQ=P2^4; //ds18b20端口
void init_ds18b20(void); //ds18b20初始化子程序
void delay(uchar); //ds18b20工作延时子程序
uchar readbyte(void);//向ds18b20读一个字节数据
//
void writebyte(uchar);//向ds18b20写一个字节数据
uint retemp();//计数变量
uchar key;
uchar a,b,c,d; //计数变量
uchar x[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uint retemp()
{
uint a,b,t;
init_ds18b20(); //初始化ds18b20
writebyte(0xcc); // 跳过读序列号的 *** 作
writebyte(0x44); // 启动温度转换
init_ds18b20();
writebyte(0xcc); //跳过读序号列号的 *** 作
writebyte(0xbe); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
a=readbyte(); //读出温度低位LSB
b=readbyte(); //读出温度高位MSB
t=b; //将温度高八位送t
t<<=8; //乘以256移到高八位
t=t|a; //高低八位组合成温度值
if(t<0x8000) //如果温度为正计算正温度值
{
key=0;
t=t0625;
}
else //否则温度为负,取反
{
key=1;
t=(~t+1)0625;
}
return(t); //返回温度值
}
void main()
{
uint i,t;
EA = 1; //开总中断
TMOD = 0x01; //定时器0工作方式1
TR0=1;
delay(100);
while(1)
{
t=retemp(); 读温度值
a=x[t/1000]; //温度千位数
b=x[t/100%10]; //温度百位数
c=x[t/10%10]-0x80; //温度十位数
d=x[t%10]; //温度个位数
if(key==1) //如果key=1
a=0xbf; //a为“负号"
if((key==0)&&(t>320)) //如果key=0 且t大于320
{
led1=0; //点亮led1
ET0=1; //开启定时器0中断
}
else if(t<290) //如果温度小于290
{
led=0; //点亮led
ET0=1; //开启定时器0中断
}
else //否则
{
led1=1; //关闭led1
led=1; //关闭led
ET0=0; //关闭定时器0中断
}
for(i=0;i<50;i++) //循环50次
{smg1=1;P0=a;delay(100);smg1=0; //显示千位
smg2=1;P0=b;delay(100);smg2=0; //显示百位
smg3=1;P0=c;delay(100);smg3=0; //显示十位
smg4=1;P0=d;delay(100);smg4=0; //显示个位
}
}
}
/ds18b20工作延时子程序/
void delay (uchar i)
{
do
{_nop_();
_nop_();
_nop_();
i--;
}
while(i);}
/ds18b20初始化子程序/
void init_ds18b20()
{
uchar x=0;
DQ=0; //单片机将DQ拉低
delay (120);
DQ=1; //拉高总线
delay(16);
delay(80);
}
/读一个字节/
uchar readbyte ()
{uchar i=0,date=0;
for(i=8;i>0;i--)
{
DQ=0; // 给脉冲信号
delay(1);
DQ=1; // 给脉冲信号
date>>=1;
if(DQ)date|=0x80;
delay(11);
}
return(date);
}
/写一个字节/
void writebyte(uchar dat)
{uchar i=0;
for(i=8;i>0;i--) //写8位数
{
DQ=0;
DQ=dat&0x01; //写dat的D0位
delay(12);
DQ=1;
dat>>=1;
delay(5);
}
}
/
函数名:中断函数
描 述:产生矩形脉冲使蜂鸣器发声
/
void BeepTimer0(void) interrupt 1
{
Beep = ~Beep;
TH0 = 65335 / 256; //定时器赋初值
TL0 = 65335 % 256;
}
没时间给你写了,大概意思就是开一个T0,初值65536-50000(05秒)触发一次,再设定一个变量每触发加1,每两次控制蜂鸣器变量取反,直到60时,长开,就这个意思,挺简单的,自己写写吧
//我这个是无源蜂鸣器,希望你喜欢
#include <reg51h>
sbit beep=P3^1; //报警蜂鸣器
sbit key=P3^2; //按键
#define uchar unsigned char
#define uint unsigned int
void delay(uint a) //延时
{
while(a--);
}
void delaybeep( uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void Beep(void) //报警声音
{
uint i;
for(i=20;i>0;i--) //取反蜂鸣器驱动口,以产生频率
{
beep=~beep; //音调设置
delaybeep(10);
}
for(i=10;i>0;i--)
{
beep=~beep;
delay(8);
}
}
void main()
{
uchar i=0;
while(1)
{
if(key==0)
{
delay(1); // 消抖动
if(key==0)
{
while(!key); //松手检测
i++;
}
}
if((i%3)==1)
{
Beep();
}
if((i%3)==2)
{
i=0;
beep=0;
}
}
}
由于单片机驱动能力有限,常常连接三极管驱动蜂鸣器。
这得看三极管的型号,不同的型号程序稍有不同。
主要是设置是“1”还是“0”驱动,这得看你的电路的连接。
1)如果连接PNP三极管驱动,设置P3_3=0,则蜂鸣器一直响;如果设置
P3_3=0;//响
delay_500ms();
P3_3=1;//不响
delay_500ms();//蜂鸣器每一秒响一次
2)如果连接NPN三极管驱动,设置P3_2=1,则蜂鸣器一直响;如果设置
P3_2=1;//响
delay_500ms();
P3_2=0;//不响
delay_500ms();//蜂鸣器每一秒响一次
以上就是关于关于单片机驱动蜂鸣器发出滴滴的声音的程序怎么写全部的内容,包括:关于单片机驱动蜂鸣器发出滴滴的声音的程序怎么写、关于C51单片机温度报警程序的问题 谁能帮我在每段程序后加汉字解释 及怎么实现温度显示及蜂鸣器报警的、c51单片机: 利用定时器+蜂鸣器实现定时报警功能,30秒内,每一秒响一下,30秒时间到了,蜂鸣器长鸣 求程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)