找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3183|回复: 8
收起左侧

单片机程序中如何加一个喇叭,按一个按键就响一下那种,求思路

[复制链接]
ID:872264 发表于 2021-1-2 22:07 | 显示全部楼层 |阅读模式
83黑币
单片机程序中如何加一个喇叭,按一个按键就响一下那种,最好再加一个能撤销输入错误的功能

电路图

电路图


单片机源程序如下:
  1. #include<Reg52.h>
  2. int SELECT[8]={0X7F,0XBF,0XDF,0XEF,0XF7,0XFB,0XFD,0XFE};         //位选数组
  3. int LED[17]={0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F,0X77,0X7C,0X39,0X5E,0X79,0X71,0X40};
  4. //LED数码管字形码集合数组
  5. int SELECT1[2][4]={0X01,0X02,0X04,0X08,0X10,0X20,0X40,0X80};//筛选异或结果集合数组
  6. int DISPLAY[8]={0X40,0X40,0X40,0X40,0X40,0X40,0X40,0X40};//初始化显示数组
  7. int flag;

  8. void delay(int ms)
  9. {
  10.         int i,j;
  11.         for(i=ms;i>0;i--)
  12.                 for(j=110;j>0;j--);        
  13. }
  14. //延时函数 (1ms)

  15. void display(int wei,int L[])//wei为位选数目
  16. {         
  17.         int k;
  18.         for(k=0;k<wei;k++){
  19.                 P0=SELECT[wei-1-k];
  20.                 P2=L[k];
  21.                 delay(1);
  22.                 P2=0X00;//消隐
  23.         }
  24. }//显示函数——P0位选,P2段选

  25. int button(int pp,int new)//p1为0X0F(筛选行)或0XF0(筛选列)
  26. {        int a,p,q,m;//new为当前P1端口按键状态,a为异或结果,p、q为循环计数变量,m为所在行、列
  27.         if(new==pp)
  28.                 {flag=0;return flag;}        //未有按键按下标志
  29.         else{
  30.                 delay(1);
  31.                 if(new!=pp)
  32.                 {        
  33.                         a=new^pp;
  34.                         for(p=0;p<2;p++)
  35.                                 for(q=0;q<4;q++)
  36.                                         if(SELECT1[p][q]==a) m=q+1;        //遍历异或结果集合数组后找到所在行、列
  37.                         }
  38.                 return m;
  39.                 }//筛选出行或列
  40. }//判断按键所在行列位置,P1为按键接口端

  41. void main()
  42. {        int x,y,sum,n,temp;//x为行,y为列,sum为键值
  43.         while(1){
  44.         P1=0X0F;temp=P1;
  45.         x=button(0X0F,temp);
  46.         P1=0XF0;temp=P1;//用于判断是否是新的按键值
  47.         y=button(0XF0,temp);
  48.         if(y==0)
  49.                 display(8,DISPLAY);
  50.         else{
  51.                 flag++;
  52.                 sum=4*(x-1)+(y-1);
  53.                 if(flag==1)
  54.                         for(n=0;n<7;n++)
  55.                                 DISPLAY[n]=DISPLAY[n+1];
  56.                         DISPLAY[7]=LED[sum];//更改显示数组
  57.                 display(8,DISPLAY) ;
  58.         }
  59.         }
  60. }
复制代码


回复

使用道具 举报

ID:333294 发表于 2021-1-2 22:57 | 显示全部楼层
单看原理图来说,单片机IO的驱动能力有限,最好加个三极管来驱动一下;驱动程序上面,直接高电平低电平控制就行了,至于按一个按键响一下,你就做个判断,按下了就拉高喇叭的引脚电平不就行了,有疑问的话再问
回复

使用道具 举报

ID:872416 发表于 2021-1-3 01:08 | 显示全部楼层
接喇叭没试过,蜂鸣器就试过,但是单片机io口供电不足以驱动,得外接电源,同时得接3极管以达到驱动效果,至于怎么驱动网上有很多
回复

使用道具 举报

ID:517466 发表于 2021-1-3 12:31 | 显示全部楼层
如果选择无源的喇叭,需要自己组织输出给喇叭的方波,用来实现发声,比如“嘟”这样的声音,注意:需要加设驱动电路,比如三极管。
如果是有源的喇叭,那么只需要控制加载/关闭喇叭的电源即可。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 绝世好帖!

查看全部评分

回复

使用道具 举报

ID:872264 发表于 2021-1-3 12:38 | 显示全部楼层
能否告知为什么这个电路没有排阻,没有驱动,他为什么还可以运行
回复

使用道具 举报

ID:844772 发表于 2021-1-3 13:50 | 显示全部楼层
kanadexiw 发表于 2021-1-3 12:38
能否告知为什么这个电路没有排阻,没有驱动,他为什么还可以运行

不就是没有上拉电阻嘛,没关系这是在模拟的,主要看人品。
回复

使用道具 举报

ID:872264 发表于 2021-1-3 15:38 | 显示全部楼层
可是没有驱动就很神奇
回复

使用道具 举报

ID:748788 发表于 2021-1-3 21:45 | 显示全部楼层
本帖最后由 wwh2382 于 2021-1-4 08:22 编辑
kanadexiw 发表于 2021-1-3 15:38
可是没有驱动就很神奇

proteus替你想到了。这是不是很适合新手?另外可以在有限的页面中塞进更多的东西,毕竟只是验证一下思路,不是玩真的。
回复

使用道具 举报

ID:213173 发表于 2021-1-4 13:41 | 显示全部楼层
楼主找的这个矩阵按键程序写的貌似高大上,其实对于初学者既不易读懂,也不易修改添加功能。给你一个示例,有按键提示音和撤销输入错误的功能。希望对你有所帮助。 无标题123.jpg


矩阵键盘数码管显示 仿真.zip (155.8 KB, 下载次数: 5)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表