找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3534|回复: 3
收起左侧

怎么在原有单片机程序基础上添加蜂鸣器功能

[复制链接]
ID:577984 发表于 2019-7-4 16:47 | 显示全部楼层 |阅读模式
蜂鸣器这块不太懂,怎么添加上按键以后无源蜂鸣器长鸣的功能,求教
  1. #include <reg52.h>
  2. #include <intrins.h>
  3. typedef unsigned char u8
  4. typedef unsigned int u16;
  5. #define KEY_PORT                P1
  6. #define DIG_PORT                P0
  7. sbit gA = P2^2;                                       
  8. sbit gB = P2^3;                                       
  9. sbit gC = P2^4;                                       
  10. sbit gBuz = P1^5;               
  11. unsigned char code gDuanMa[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  12.                                         0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
  13. void delay10ms(void);
  14. u8 KeyScan(void);
  15. void KeyValueDisplay(u8 val);
  16. void BuzzerOnOff(void);
  17. void delay1ms(void);
  18. void main(void)
  19. {
  20.         u8 key = 0;                        
  21.         u8 key1 = 0;               
  22.         while (1)
  23.         {
  24.                 key = KeyScan();
  25.                 if (key != 0)        
  26.                 {                                       
  27.                         key1 = key;               
  28.                         beep = 1;
  29.                 }
  30.                 KeyValueDisplay(key1);
  31.                
  32.         }
  33. }

  34. u8 KeyScan(void)
  35. {
  36.         u8 val = 0;
  37.         
  38.         KEY_PORT = 0x0f;        
  39.         if (KEY_PORT != 0x0f)
  40.         {
  41.                 delay10ms();        
  42.                 if (KEY_PORT != 0x0f)        
  43.                 {
  44.                         switch (KEY_PORT)
  45.                         {
  46.                                 case 0x07 :        val = 1;         break;
  47.                                 case 0x0b :        val = 2;        break;
  48.                                 case 0x0d : val = 3;        break;
  49.                                 case 0x0e :        val = 4;        break;
  50.                                 default          :                         break;
  51.                         }
  52.                         KEY_PORT = 0xf0;
  53.                         switch (KEY_PORT)
  54.                         {
  55.                                 case 0x70:        val = val + 0;        break;
  56.                                 case 0xb0:        val = val + 4;        break;
  57.                                 case 0xd0:         val = val + 8;        break;
  58.                                 case 0xe0:        val = val + 12;        break;
  59.                         }
  60.                         return val;        
  61.                 }               
  62.         }
  63.         return 0;        
  64. }
  65. void BuzzerOnOff(void)
  66. {        
  67.         if()
  68.         gBuz = 1;
  69.         delay1ms();
  70.         gBuz = 0;
  71.         delay1ms();
  72. }
  73. void delay10ms(void)   //误差 0us
  74. {
  75.     unsigned char a,b,c;
  76.     for(c=1;c>0;c--)
  77.         for(b=38;b>0;b--)
  78.             for(a=130;a>0;a--);
  79. }
  80. void delay1ms(void)   //误差 0us
  81. {
  82.     unsigned char a,b,c;
  83.     for(c=1;c>0;c--)
  84.         for(b=142;b>0;b--)
  85.             for(a=2;a>0;a--);
  86. }
  87. void KeyValueDisplay(u8 val)
  88. {
  89.         gA = 1; gB = 1; gC = 1;                                  // 位选数码管0
  90.         DIG_PORT = gDuanMa[val / 10];
  91.         delay10ms();                                                 // 间隔一段显示时间        
  92.         DIG_PORT = 0x00;                                        // 消隐,注意不要漏掉了

  93.         gA = 0; gB = 1; gC = 1;
  94.         DIG_PORT = gDuanMa[val % 10];
  95.         delay10ms();                                                 // 间隔一段显示时间        
  96.         DIG_PORT = 0x00;                                        // 消隐,注意不要漏掉了
  97. }
复制代码


回复

使用道具 举报

ID:577984 发表于 2019-7-4 18:13 | 显示全部楼层

#include <reg52.h>
#include <intrins.h>
typedef unsigned char u8;                 // 重命名类型u8简化代码编写
typedef unsigned int u16;
#define KEY_PORT                P1                // 矩阵按键接在P1端口
#define DIG_PORT                P0                // 共阴极数码管接P0端口
sbit gA = P2^2;                                       
sbit gB = P2^3;                                       
sbit gC = P2^4;
sbit S15 = P3^2;                                       
sbit gBuz = P1^5;                                // 蜂鸣器接P1^5接口
unsigned char code gDuanMa[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
                                        0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
void delay10ms(void);
u8 KeyScan(void);
void KeyValueDisplay(u8 val);
void BuzzerOnOff(u8 beep);
void delay1ms(void);
void main(void)
{
        u8 key = 0;                                // 实时获取的扫描键值
        u8 key1 = 0;                    // 有按键情况下更新后的键值
        u8 beep = 0;
        while (1)
        {
                key = KeyScan();
                if (key != 0)                // 有按键按下
                {                                       
                        key1 = key;                // 有按键则更新键值数值
                        beep = 1;
                }
                KeyValueDisplay(key1);
                BuzzerOnOff(beep);
        }
}

u8 KeyScan(void)
{
        u8 val = 0;
       
        KEY_PORT = 0x0f;                // P1.0-1.3输出高电平,P1.4-P1.7输出低电平
        if (KEY_PORT != 0x0f)        // 读取KEY_PORT看是否有按键按下
        {
                delay10ms();                // 延时消抖
                if (KEY_PORT != 0x0f)                // 确认确实有按键按下
                {
                        // 先确定按键发生在第几列
                        switch (KEY_PORT)
                        {
                                case 0x07 :        val = 1;         break;
                                case 0x0b :        val = 2;        break;
                                case 0x0d : val = 3;        break;
                                case 0x0e :        val = 4;        break;
                                default          :                         break;
                        }

                        // 再确定按键发生在第几行
                        KEY_PORT = 0xf0;
                        switch (KEY_PORT)
                        {
                                case 0x70:        val = val + 0;        break;
                                case 0xb0:        val = val + 4;        break;
                                case 0xd0:         val = val + 8;        break;
                                case 0xe0:        val = val + 12;        break;
                        }
                        return val;       
                }               
        }
        return 0;       
}
void BuzzerOnOff(beep)
{       
        if(beep == 1)
        {
                gBuz = 1;
                delay1ms();
                gBuz = 0;
                delay1ms();
        }
        else gBuz=0;
}
void delay10ms(void)   //误差 0us
{
    unsigned char a,b,c;
    for(c=1;c>0;c--)
        for(b=38;b>0;b--)
            for(a=130;a>0;a--);
}
void delay1ms(void)   //误差 0us
{
    unsigned char a,b,c;
    for(c=1;c>0;c--)
        for(b=142;b>0;b--)
            for(a=2;a>0;a--);
}
void KeyValueDisplay(u8 val)
{
        gA = 1; gB = 1; gC = 1;                                  // 位选数码管0
        DIG_PORT = gDuanMa[val / 10];
        delay10ms();                                                 // 间隔一段显示时间       
        DIG_PORT = 0x00;                                        // 消隐

        gA = 0; gB = 1; gC = 1;
        DIG_PORT = gDuanMa[val % 10];
        delay10ms();                                                 // 间隔一段显示时间       
        DIG_PORT = 0x00;                                        // 消隐
}
回复

使用道具 举报

ID:577984 发表于 2019-7-4 18:13 | 显示全部楼层
已被自己解决,如果想要添加一个归零按钮,该怎么操作呢。
回复

使用道具 举报

ID:190832 发表于 2019-7-4 20:26 | 显示全部楼层
小白白白白衣 发表于 2019-7-4 18:13
已被自己解决,如果想要添加一个归零按钮,该怎么操作呢。

可以用外部中断或者在whle(1)查询引脚状态
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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