这个程序,简易的网上有库文件;精确的得你自己解决,源代码之类的不可能给你,也没人会替你写程序,需要程序结构图,网上大把有。
原因很简单,使用超声波精确测距,设计大量算法,这些算法都是程序员测试调试结果,用于商业化了,不可能放出来共享。简易的,程序算法简单,但存在大量计算测距误报。
蜂鸣器是一种一体化结构的电子讯响器,本文介绍如何用单片机驱动蜂鸣器,他广泛应用于计算机、打印机、复印机、报警器、电话机等电子产品中作发声器件。蜂鸣器主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型。
电磁式蜂鸣器由振荡器、电磁线圈、磁铁、振动膜片及外壳等组成。接通电源后,振荡器产生的音频信号电流通过电磁线圈,使电磁线圈产生磁场,振动膜片在电磁线圈和磁铁的相互作用下,周期性地振动发声。
压电式蜂鸣器主要由多谐振荡器、压电蜂鸣片、阻抗匹配器及共鸣箱、外壳等组成。多谐振荡器由晶体管或集成电路构成,当接通电源后(15~15V直流工作电压),多谐振荡器起振,输出15~25kHZ的音频信号,阻抗匹配器推动压电蜂鸣片发声。
下面是电磁式蜂鸣器的外形及结构图。。。电磁式蜂鸣器实物图:电磁式蜂鸣器结构示意图:图 1图 2 电磁式蜂鸣器内部构成:1 防水贴纸
2 线轴
3 线圈
4 磁铁 5 底座
6 引脚
7 外壳
8 铁芯9 封胶
10 小铁片
11 振动膜
12 电路板
一、电磁式蜂鸣器驱动原理
蜂鸣器发声原理是电流通过电磁线圈,使电磁线圈产生磁场来驱动振动膜发声的,因此需要一定的电流才能驱动它,单片机IO引脚输出的电流较小,单片机输出的TTL电平基本上驱动不了蜂鸣器,因此需要增加一个电流放大的电路。S51增强型单片机实验板通过一个三极管C8550来放大驱动蜂鸣器,原理图见下面图3:
S51增强型单片机实验板蜂鸣器驱动原理图:图 3
如图所示,蜂鸣器的正极接到VCC(+5V)电源上面,蜂鸣器的负极接到三极管的发射极E,三极管的基级B经过限流电阻R1后由单片机的P37引脚控制,当P37输出高电平时,三极管T1截止,没有电流流过线圈,蜂鸣器不发声;当P37输出低电平时,三极管导通,这样蜂鸣器的电流形成回路,发出声音。因此,我们可以通过程序控制P37脚的电平来使蜂鸣器发出声音和关闭。
程序中改变单片机P37引脚输出波形的频率,就可以调整控制蜂鸣器音调,产生各种不同音色、音调的声音。另外,改变P37输出电平的高低电平占空比,则可以控制蜂鸣器的声音大小,这些我们都可以通过编程实验来验证。
二、蜂鸣器列子 下面我们举几个简单的单片机驱动蜂鸣器的编程和电路设计的列子。
1、简单的蜂鸣器实验程序:本程序通过在P37输出一个音频范围的方波,驱动实验板上的蜂鸣器发出蜂鸣声,其中DELAY延时子程序的作用是使输出的方波频率在人耳朵听觉能力之内的20KHZ以下,如果没有这个延时程序的话,输出的频率将大大超出人耳朵的听觉能力,我们将不能听到声音。更改延时常数,可以改变输出频率,也就可以调整蜂鸣器的音调。大家可以在实验中更改#228为其他值,听听蜂鸣器音调的改变。
2、倒车警示音实验程序:我们知道各种卡车、货柜车在倒车时候,会发出倒车的蜂鸣警示提示音,同时警示黄灯也同步闪烁,提醒后面的人或车辆注意。本实验例程就实现倒车警示功能,通过实验板上的蜂鸣器发出警示音,同时通过实验板上P12和P15上的两个**发光二极管来发出**警示灯。
3、“叮咚”电子门铃实验程序:常见的家用电子门铃在有客人来访时候,如果按压门铃按钮时,室内会发出“叮咚”声音,本实验程序模拟电子门铃的发音,当我们按压实验板上的K1按钮时候,蜂鸣器发出“叮咚”音乐声,是一个比较实用的程序。
那你就得根据你这个温度传感器的得到的温度然后在做数据处理,用个全局变量Temps接收温度,接收后,可以用个定时器定期检测一下这个温度是否达到所需的温度,在蜂鸣器报警。
if((Temps<18) || (Temps>23))
beep=1;//假如蜂鸣器高电平响
else
beep=0;
有时候在行车过程中我们会遇到汽车异响情况,那汽车异响是什么原因呢下面一起来看看汽车异响原因介绍。
汽车异响类型
1、车身异响
这个问题通常是因为车身刚度不够,导致车辆在行驶中发生形变,车门与车框摩擦或者抖动,或者有的地方脱焊而产生钢板之间的摩擦等,在门窗上贴胶条或者在摩擦部位垫橡胶等方法或许可以减轻或者消除异响,但治标不治本,还有一些车的车身部件之间固定不好也可能造成异响,一般紧上螺丝就能解决。
2、悬挂异响
一遇到颠簸四个轮子附近就发出“咚咚”或者“咔嚓”的声音,多半是减震器问题或者悬挂部件松动造成,请一定到正规维修店仔细检查,因为悬挂部件不仅与乘坐的舒适度有关,还事关行车安全,千万不可小视。
3、轮胎异响
轮胎响声一定是有节奏的,而且车速快频率就高,如果是低沉的“啪啪”声,多半是轮胎胎面变形、起包、磨损严重或气压不足,如果是“嗒嗒”声,则可能是胎面夹杂了小石子,如果轮胎呼呼呼地响,而且车身明显抖动甚至方向跑偏,不用说肯定是轮胎爆了,下车换胎吧。
汽车异响是什么原因
4、发动机护板异响
螺丝在经常运动的车上往往会发生位移,如果经常听到像是进气格栅位置发出的“啪啦啪啦”的异响,除了格栅真的松动外,那么车主还是要检查下发动机护板螺丝是否松动,或者发动机护板与底片发生松动,造成的异响,除了紧固螺丝外,还应该在异响部位垫些纸板类的物品,就可以轻松消除异响。
5、发动机舱异响
这里出现异响的可能性比较多,皮带啸叫声比较刺耳,一般是因为皮带打滑造成的,发动机在运转时如果外部有金属件干摩擦的声音,一般是发电机、水泵、转向助力泵轴承损坏的表现,发动机运转时有漏气的声音,则可能是排气系统堵塞、真空管泄漏或断裂,需要提醒的是,如果是发动机内的异响,车主多半是无法解决的,最好送厂检修。
6、变速箱异响
车子在行驶中如果变速箱内部有“沙沙”声,而踩下离合器后又消失,则说明噪音来源是变速箱故障,有可能是变速箱轴承或齿轮磨损、轴承斑点所致。
接口自己看清楚。程序如下
//
#include "reg51h"
#include "intrinsh" //_nop_();延时函数用
#include "mathh"
#define disdata P0 //段码输出口
#define discan P2 //扫描口
#define uchar unsigned char
#define uint unsigned int
sbit duqu=P3^6; //温度输入口
sbit dian=P0^7; //LED小数点控制
sbit beep=P1^6; //蜂鸣器
sbit key0=P3^0;
sbit key1=P3^1;
sbit key02=P3^2;
sbit key03=P3^3;
sbit led0=P1^0; //红灯
sbit led1=P1^1; //绿灯
sbit led2=P1^2; //黄灯
uint h;
uint temp;
uchar r;
char high=40,low=15;
uchar sign;
uchar st=1;
uchar ti;
uchar pp;
uchar ee;
uchar nn;
//温度小数部分用查表法//
uchar code ditab[16]=
{0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};
//
uchar code dis_7[15]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67,0x00,0x40,0x76,0x38,0x39};
//共阴LED段码表 "0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "不亮" "-" "H" "L" "C"
uchar code scan_con[4]={0x70,0xb0,0xd0,0xe0}; //列扫描控制字
uchar data temp_data[2]={0x00,0x00}; //读出温度暂放
uchar data display[5]={0x00,0x00,0x00,0x00,0x00}; //显示单元数据,共4个数据和一个运算暂用
/11us延时函数/
void delay(uint t)
{
for (;t>0;t--);
}
/显示扫描函数/
void scan()
{
char k;
for(k=0;k<4;k++) //4位LED扫描控制
{
discan=scan_con[k]; //位选
disdata=dis_7[display[k]]; //数据显示
if (k==1){dian=1;} //小数点显示
delay(200);
}
}
/DS18B20复位函数/
ow_reset(void)
{
char presence=1;
while(presence)
{
while(presence)
{
duqu=1;_nop_();_nop_(); //从高拉倒低
duqu=0;
delay(50); //550 us
duqu=1;
delay(6); //66 us
presence=duqu; //presence=0 复位成功,继续下一步
}
delay(45); //延时500 us
presence=~duqu;
}
duqu=1; //拉高电平
}
/DS18B20写命令函数/
//向1-WIRE 总线上写1个字节
void write_byte(uchar val)
{
uchar i;
for(i=8;i>0;i--)
{
duqu=1;_nop_();_nop_(); //从高拉倒低
duqu=0;_nop_();_nop_();_nop_();_nop_(); //5 us
duqu=val&0x01; //最低位移出
delay(6); //66 us
val=val/2; //右移1位
}
duqu=1;
delay(1);
}
/DS18B20读1字节函数/
//从总线上取1个字节
uchar read_byte(void)
{
uchar i;
uchar value=0;
for(i=8;i>0;i--)
{
duqu=1;_nop_();_nop_();
value>>=1;
duqu=0;_nop_();_nop_();_nop_();_nop_(); //4 us
duqu=1;_nop_();_nop_();_nop_();_nop_(); //4 us
if(duqu)value|=0x80;
delay(6); //66 us
}
duqu=1;
return(value);
}
/读出温度函数/
uint read_temp()
{
ow_reset(); //总线复位
delay(200);
write_byte(0xcc); //发命令
write_byte(0x44); //发转换命令
ow_reset();
delay(1);
write_byte(0xcc); //发命令
write_byte(0xbe);
temp_data[0]=read_byte(); //读温度值的第字节
temp_data[1]=read_byte(); //读温度值的高字节
temp=temp_data[1];
temp<<=8;
temp=temp|temp_data[0]; // 两字节合成一个整型变量。
return temp; //返回温度值
}
/温度数据处理函数/
//二进制高字节的低半字节和低字节的高半字节组成一字节,这个
//字节的二进制转换为十进制后,就是温度值的百、十、个位值,而剩
//下的低字节的低半字节转化成十进制后,就是温度值的小数部分
//
work_temp(uint tem)
{
uchar n=0;
nn=0;
if(tem>6348) // 温度值正负判断
{tem=65536-tem;n=1;nn=1;} // 负温度求补码,标志位置1
display[4]=tem&0x0f; // 取小数部分的值
display[0]=ditab[display[4]]; // 存入小数部分显示值
display[4]=tem>>4; // 取中间八位,即整数部分的值
display[3]=display[4]/100; // 取百位数据暂存
display[1]=display[4]%100; // 取后两位数据暂存
display[2]=display[1]/10; // 取十位数据暂存
display[1]=display[1]%10;
r=display[1]+display[2]10+display[3]100;
/符号位显示判断/
if(!display[3])
{
display[3]=0; //最高位为0时不显示
if(!display[2])
{
display[2]=0; //次高位为0时不显示
}
}
if(n){display[3]=0x0b;} //负温度时最高位显示"-"
}
/蜂鸣器报警函数/
void BEEP()
{
if(r>=high||r<=low)
{
beep=1;led1=1;
if(r>=high)
{
led0=0;led2=1;
}
else if (r<=low)
{
led2=0;led0=1;
}
}
else if ((nn==1)&&(r>=abs(low)))
{
led2=0;led0=1;beep=1;led1=1;
}
else
{
beep=0;led1=0;led0=1;led2=1;
}
}
/初始化函数/
void init()
{
beep=0;
EA=1;
EX0=0;
EX1=0;
IT0=1;
IT1=1;
TMOD=0x11;
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
TH1=(65536-833)/256;
TL1=(65536-833)%256;
sign=0;
ti=high;
}
/温度/上下限调整切换/
void key11()
{
while(key1==0)
{
delay(300);
if(key1==0)
{
st++;
if(st==4)
st=1;
}
while(!key1);
delay(300);
while(!key1);
}
}
/切换调整上下限/
void key10()
{
while(key0==0)
{
delay(300); //消抖动
if(key0==0)
{
sign=!sign;
}
while(!key0);
delay(300);
while(!key0);
}
}
/上下限加1/
void key2()
{
while(key02==0)
{
delay(400);
if(key02==0)
{
if(sign)
{ low=low+1;
if(low>high)
{pp=low;low=high;high=pp;}
}
else
{high=high+1;ti=high;}
}
while(!key02);
delay(400);
while(!key02);
}
}
/上下限减1/
void key3()
{
while(key03==0)
{
delay(400);
if(key03==0)
{
if(sign)
low=low-1;
else
{ high=high-1;ti=high;
if(low>high)
{pp=low;low=high;high=pp;}
}
}
while(!key03);
delay(400);
while(!key03);
}
}
/上限温度显示/
void high1()
{
uchar k;
if(high<100)
{ display[0]=high%10;
display[1]=high/10;
display[2]=10;
display[3]=12;
for(k=0;k<4;k++)
{
discan=scan_con[k];
disdata=dis_7[display[k]];
if (k==1){dian=0;}
delay(300);
disdata=0x00;
delay(100);
}
}
else
{
display[0]=high%10;
display[1]=high%100/10;
display[2]=high/100;
display[3]=12;
for(k=0;k<4;k++)
{
discan=scan_con[k];
disdata=dis_7[display[k]];
if (k==1){dian=0;}
delay(300);
disdata=0x00;
delay(100);
}
}
}
/下限温度显示/
void low1()
{
uchar ki;
if(low>=0)
{ display[0]=low%10;
display[1]=low/10;
display[2]=10;
display[3]=13;
for(ki=0;ki<4;ki++)
{
discan=scan_con[ki];
disdata=dis_7[display[ki]];
if (ki==1){dian=0;}
delay(100);
disdata=0x00;
delay(100);
}
}
else
{
ee=abs(low);
display[0]=ee%10;
display[1]=ee/10;
display[2]=11;
display[3]=13;
for(ki=0;ki<4;ki++)
{
discan=scan_con[ki];
disdata=dis_7[display[ki]];
if (ki==1){dian=0;}
delay(100);
disdata=0x00;
delay(100);
}
}
}
/主函数/
void main()
{
init();
disdata=0x00; //初始化端口
discan=0x00;
for(h=0;h<4;h++) //开机显示"0000"
{display[h]=0;}
ow_reset(); //开机先转换一次
write_byte(0xcc); //Skip ROM
write_byte(0x44); //发转换命令
for(h=0;h<100;h++) //开机显示"0000"
{scan();}
while(1)
{
switch(st) //分支
{
case 1:{
work_temp(read_temp());
scan(); //显示温度
BEEP();
break;
}
case 2: {
high1(); // 显示上限温度
key10();
key2();
key3();
break;
}
case 3: {
low1(); //显示下限温度
key10();
key2();
key3();
break;
}
}
key11();
}
}
//结束//
以上就是关于基于单片机的倒车防撞预警采用AT89c51,四位一体数码管,三极管驱动蜂鸣器报警,请问这个程序全部的内容,包括:基于单片机的倒车防撞预警采用AT89c51,四位一体数码管,三极管驱动蜂鸣器报警,请问这个程序、关于蜂鸣器报警原理的相关论文、帮忙写一个51单片机程序 18-23度以外会会用蜂鸣器自动报警等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)