标题:
怎么在原有单片机程序基础上添加蜂鸣器功能
[打印本页]
作者:
小白白白白衣
时间:
2019-7-4 16:47
标题:
怎么在原有单片机程序基础上添加蜂鸣器功能
蜂鸣器这块不太懂,怎么添加上按键以后无源蜂鸣器长鸣的功能,求教
#include <reg52.h>
#include <intrins.h>
typedef unsigned char u8
typedef unsigned int u16;
#define KEY_PORT P1
#define DIG_PORT P0
sbit gA = P2^2;
sbit gB = P2^3;
sbit gC = P2^4;
sbit gBuz = 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(void);
void delay1ms(void);
void main(void)
{
u8 key = 0;
u8 key1 = 0;
while (1)
{
key = KeyScan();
if (key != 0)
{
key1 = key;
beep = 1;
}
KeyValueDisplay(key1);
}
}
u8 KeyScan(void)
{
u8 val = 0;
KEY_PORT = 0x0f;
if (KEY_PORT != 0x0f)
{
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(void)
{
if()
gBuz = 1;
delay1ms();
gBuz = 0;
delay1ms();
}
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; // 消隐,注意不要漏掉了
}
复制代码
作者:
小白白白白衣
时间:
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; // 消隐
}
作者:
小白白白白衣
时间:
2019-7-4 18:13
已被自己解决,如果想要添加一个归零按钮,该怎么操作呢。
作者:
hange_v
时间:
2019-7-4 20:26
小白白白白衣 发表于 2019-7-4 18:13
已被自己解决,如果想要添加一个归零按钮,该怎么操作呢。
可以用外部中断或者在whle(1)查询引脚状态
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1