找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 844|回复: 1
打印 上一主题 下一主题
收起左侧

如何修改单片机程序 按键增加蜂鸣器声音等

[复制链接]
跳转到指定楼层
楼主
300黑币
下了个程序和仿真,想改一下里面内容
想修改成:
1因为原的按键按它是没有声音的   想改成所有的按键都有蜂鸣器声音     按一次响一次  

2按开始定时就开始蜂鸣器就跟着秒滴滴响,数码管到10秒蜂鸣器节奏就越来越快,到2秒 蜂鸣器就一直响

加个led和蜂鸣器一样工作


麻烦大哥大姐了  我就想玩一下
代码:  也有附件
  1. #include<reg51.h>
  2. #include<intrins.h>
  3. #include<absacc.h>           //头文件
  4. #define ui unsigned int
  5. #define uc unsigned char   //宏定义

  6. uc code tab1[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};           //码表0~9
  7. uc code tab2[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};           //码表带点0~9
  8. sbit jiabaiwei=P1^0;        //加百位按键(分加)
  9. sbit daojishi=P1^1;                //倒计时
  10. sbit zhanting=P1^2;                //暂停
  11. sbit jiashiwei=P1^3;        //加十位(秒十位)
  12. sbit jiagewei=P1^4;                //加个位(秒个位)
  13. sbit baojing=P3^7;                //蜂鸣器
  14. bit flag1;        //标志位

  15. uc n;
  16. char qian,bai,shi,ge,miao,fen;//变量

  17. void delay(ui k)   //延时函数
  18. {
  19.         ui i,j;
  20.         for(i=0;i<k;i++)
  21.                 for(j=0;j<10;j++);
  22. }

  23. void init()           //初始化函数
  24. {
  25.         TMOD=0x01;          //定时器0工作方式1
  26.         EA=1;                  //开总中断
  27.         ET0=1;                  //定时器0中断开
  28.         TH0=0x3c;
  29.         TL0=0xb0;          //附初值
  30.         flag1=1;          //变量附1
  31. }

  32. void xianshi()          //显示子函数
  33. {
  34.         qian=fen/10;  //分十位
  35.         bai=fen%10;          //分个位
  36.         shi=miao/10;  //秒十位
  37.         ge=miao%10;          //秒个位
  38.         P0=0x00;
  39.         P2=0xf7;           //让数码管第一个位亮(送位选信号)
  40.         P0=tab1[ge];   //送段
  41.         delay(10);           //延时
  42.         P0=0x00;
  43.         P2=0xfb;           //让数码管第二个位亮(送位)
  44.         P0=tab1[shi];  //送位选信号
  45.         delay(10);           //延时
  46.         P0=0x00;
  47.         P2=0xfd;           //让数码管第三个位亮(送位选信号)
  48.         P0=tab2[bai];  //送位选信号
  49.         delay(10);           //延时
  50.         P0=0x00;
  51.         P2=0xfe;           //让数码管第四个位亮(送位选信号)
  52.         P0=tab1[qian]; //送位选信号
  53.         delay(10);           //延时
  54.         P0=0x00;
  55. }

  56. void anjian()          //按键子函数
  57. {
  58.         if(jiabaiwei==0)   //加百位按键(分加)
  59.         {
  60.                 delay(30);           //延时去抖
  61.                 if(jiabaiwei==0)   //确定按键按下
  62.                 {
  63.                         fen=fen+1;          //分自加
  64.                         if(fen>59)          //如果分大于59
  65.                         fen=0;                  //分归零
  66.                 }
  67.                 while(!jiabaiwei); //等待按键释放
  68.         }
  69.         else if(daojishi==0)
  70.         {
  71.                 delay(30);           //延时去抖
  72.                 if(daojishi==0)            //确定按键按下
  73.                 {
  74.                         if((miao!=0)||(fen!=0))        //如果分和秒不同时等于0
  75.                         TR0=1;                         //定时器0开                 
  76.                         flag1=1;                 //开始倒计时标志位
  77.                 }
  78.                 while(!daojishi); //等待按键释放
  79.         }
  80.         else if(zhanting==0)        //如果暂停按键按下
  81.         {
  82.                 delay(30);                 //延时去抖
  83.                 if(zhanting==0)          //确定按键按下
  84.                 {
  85.                         TR0=0;                  //关定时器
  86.                 }
  87.                 while(!zhanting); //等待按键释放
  88.         }
  89.         else if(jiashiwei==0)         //如果秒十位加按键按下
  90.         {
  91.                 delay(30);          //延时去抖
  92.                 if(jiashiwei==0) //确定按键按下
  93.                 {
  94.                         miao=miao+10;  //秒自加10
  95.                         if(miao>59)                //如果秒大于59
  96.                         miao=miao%10;   //秒取余
  97.                 }
  98.                 while(!jiashiwei); //等待按键释放
  99.         }
  100.         else if(jiagewei==0)   //如果加秒个位的按键按下
  101.         {
  102.                 delay(30);           //延时去抖
  103.                 if(jiagewei==0)          //确定按键按下
  104.                 {
  105.                         miao=miao+1;   //秒+1
  106.                         if(miao>59)                //如果秒大于59
  107.                         {
  108.                         miao=0;                        //秒归零
  109.                         fen++;                        //分+1
  110.                         }
  111.                 }
  112.                 while(!jiagewei); //等待按键释放
  113.         }
  114.                
  115. }

  116. void main()                         //主函数
  117. {
  118.         init();                        //初始化函数
  119.         while(1)
  120.         {
  121.                 anjian();          //按键函数
  122.                 xianshi();          //显示函数
  123.         }
  124. }

  125. void zhongduan() interrupt 1 //定时器0
  126. {
  127.         TH0=0x3c;
  128.         TL0=0xb0;          //重附初值50ms
  129.         n++;
  130.         if(n>=20)          //如果到1s(n=20就是1s的时间)
  131.         {
  132.                 n=0;                                                 //n 清零
  133.                 if(flag1==1)                                //如果 flag1等于1的时候
  134.                 {
  135.                         miao--;
  136.                         if(miao<0)
  137.                         {
  138.                                 if(fen>0)
  139.                                 {
  140.                                         fen--;
  141.                                         miao=59;
  142.                                 }
  143.                                 else
  144.                                 {
  145.                                         fen=miao=0;
  146.                                 }
  147.                         }
  148.                         
  149.                         if((miao<=10)&&(fen==0)) //如果秒小于10并且分等于0
  150.                         {
  151.                                 baojing=~baojing;        //报警取反
  152.                                 if(miao==0)                        //如果秒等于1
  153.                                 {        
  154.                                         flag1=0;                 
  155.                                     miao=0;                        //秒清零
  156.                                         fen=0;                         //分清零
  157.                                         TR0=0;                        //关定时器
  158.                                         baojing=1;                //报警关
  159.                                 }
  160.                         }
  161.                 }
  162.         }
  163. }
复制代码



51hei截图_20230318001335.png (30.31 KB, 下载次数: 48)

51hei截图_20230318001335.png

屏幕截图 2023-03-18 002342.jpg (233.69 KB, 下载次数: 46)

屏幕截图 2023-03-18 002342.jpg

程序 仿真.zip

77.85 KB, 下载次数: 9

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:332444 发表于 2023-3-18 10:21 | 只看该作者
这不是花20买到正确答案了?又到这里问。类似这种也就是完成学习任务,理解原理,不用精准定时的示例也是可以的,之下不用定时器荔枝可以参考,当然写按键控制分钟秒钟不是难事,不过这里没写,主要是实现蜂鸣器间隔逐渐变快的原理。http://www.51hei.com/bbs/dpj-227503-1.html
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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