- 打卡等级:初来乍到
- 打卡总天数:1
- 最近打卡:2026-03-16 12:07:51
已绑定手机
新手上路
- 积分
- 13
|
仔细看了8G芯片手册,把启动位改为0X40,才行#include <STC8G.H>
#include <intrins.h>
// ==================== 全局变量(C51必须放最开头) ====================
unsigned int timer_value; // 蜂鸣器定时器重载值
// ==================== 宏定义+引脚定义 ====================
#define ADC_POWER 0x80
#define ADC_START 0x40
#define ADC_FLAG 0x20
#define P1ASF_REG (*(unsigned char volatile *)0x9D)
sbit LED1 = P2^0;
sbit LED2 = P2^4;
#define A_MIN 250
#define A_MAX 320
#define B_MIN 580
#define B_MAX 630
// ==================== 【1】基础延时函数(最先定义,无依赖) ====================
void Delay1ms(void)
{
unsigned char i, j;
i = 32;
j = 40;
do { while(--j); } while(--i);
}
void DelayMs(unsigned int ms)
{
while(ms--) Delay1ms();
}
// ==================== 【2】蜂鸣器核心函数(直接定义,无原型声明) ====================
void Buzzer_System_Init(void)
{
// 时钟配置
P_SW2 |= 0x80;
CLKDIV = 0x00;
P_SW2 &= ~0x80;
// P5.4推挽输出+高驱动(最大化音量)
P5M1 &= ~0x10;
P5M0 |= 0x10;
P_SW2 |= 0x80;
P5DR = 0x10; // 高驱动模式,音量翻倍
P_SW2 &= ~0x80;
// 定时器0初始化
TMOD &= 0xF0;
TMOD |= 0x01;
AUXR &= ~0x80;
ET0 = 1;
EA = 1;
}
unsigned int Buzzer_Get_Timer_Value(unsigned int freq)
{
if(freq == 0) return 0;
// 2KHz时:timer_value = 65536 - (24000000/(12*2000*2)) = 65036
return (65536UL - (24000000UL / (12UL * freq * 2)));
}
void Buzzer_Play_Tone(unsigned int freq, unsigned int duration_ms)
{
unsigned char j;
if(freq == 0)
{
TR0 = 0;
DelayMs(duration_ms);
return;
}
timer_value = Buzzer_Get_Timer_Value(freq);
TR0 = 0;
TH0 = timer_value >> 8;
TL0 = timer_value & 0xFF;
TR0 = 1; // 启动定时器,生成2KHz方波
DelayMs(duration_ms);
// 渐弱停止(避免杂音,保留)
TR0 = 0;
for(j=0; j<3; j++)
{
P54 = !P54;
DelayMs(20);
}
}
// 定时器0中断服务函数(必须放在调用前)
void Timer0_ISR(void) interrupt 1
{
TF0 = 0;
P54 = !P54;
TH0 = timer_value >> 8;
TL0 = timer_value & 0xFF;
}
// ==================== 【3】ADC函数(直接定义) ====================
void ADC_Init(void)
{
P1M0 = 0x00; P1M1 = 0xFF;
P1ASF_REG = 0xFF;
ADCCFG = 0x00;
ADC_CONTR = ADC_POWER;
DelayMs(5);
}
unsigned int Read_ADC(void)
{
unsigned int adc_val = 0;
unsigned char retry;
for(retry=0; retry<5; retry++)
{
ADC_CONTR = ADC_POWER | 3;
_nop_();_nop_();
ADC_CONTR |= ADC_START;
while(!(ADC_CONTR & ADC_FLAG));
ADC_CONTR &= ~ADC_FLAG;
adc_val += (ADC_RES<<2)|(ADC_RESL&0x03);
DelayMs(1);
}
return adc_val / 5;
}
// ==================== 【4】主函数(最后定义) ====================
void main(void)
{
unsigned int adc_val;
unsigned char last_state = 0;
// 初始化
Buzzer_System_Init();
ADC_Init();
P2M0 |= 0x11; P2M1 &= ~0x11;
LED1 = 1; LED2 = 1;
// ==================== 新增:上电2秒提示音 ====================
Buzzer_Play_Tone(2000, 800); // 2KHz洪亮提示音,持续2秒
DelayMs(500); // 提示音结束后停顿0.5秒,再进入主循环
while(1)
{
adc_val = Read_ADC();
// A信号:2KHz洪亮提示音(150ms)
if(adc_val >= A_MIN && adc_val <= A_MAX)
{
LED1 = 0; LED2 = 1;
if(last_state != 1)
{
Buzzer_Play_Tone(2000, 150); // 2KHz洪亮提示音
last_state = 1;
}
}
// B信号:2KHz洪亮提示音(两声)
else if(adc_val >= B_MIN && adc_val <= B_MAX)
{
LED1 = 1; LED2 = 0;
if(last_state != 2)
{
Buzzer_Play_Tone(2000, 150);
DelayMs(80);
Buzzer_Play_Tone(2000, 150);
last_state = 2;
}
}
// 无信号
else
{
LED1 = 1; LED2 = 1;
last_state = 0;
}
DelayMs(10);
}
} |
|