- 打卡等级:初来乍到
- 打卡总天数:6
- 最近打卡:2025-02-19 23:58:42
注册会员
- 积分
- 63
|
#include <STC8H.H>
#include "USRE.H"
#include <math.h>
//------------------------------------------
#define TIMER_PERIOD_US 156.25 // 定时器周期 (us)
#define TIMER_OVERFLOW_COUNT 65536 - (TIMER_PERIOD_US * 24 / 12) // 计算定时器溢出计数值
#define ADC_POWER 0x80 // ADC电源控制位
#define ADC_START 0x40 // ADC启动位
#define ADC_FLAG 0x20 // ADC完成标志位
#define ADC_SPEED_90 0x00 // ADC转换速度设置
//-----------------------------------------
void init_mcu(void) //初始化各IO口以及中断
{
// PxM1,PxM0 = 00 标准输出口
// = 01 推挽输出
// = 10 仅为输入
// = 11 开漏
P_SW2 |=0X80;
//--------------------------------------------------------------------
//_P0C();
//_P0();
_P1C();
_P1();
//_P2C();
//_P2();
_P3C();
_P3();
//-----------------------------------------------------------------------------------------
// 初始化定时器1
TMOD |= 0x10; // 设置定时器1为模式1(16位定时器
reload_value = TIMER_OVERFLOW_COUNT;
TH1 = (unsigned char)(reload_value >> 8); // 加载定时器高字节
TL1 = (unsigned char)(reload_value); // 加载定时器低字节
ET1 = 1; // 使能定时器1中断
//EA = 1; // 使能全局中断
//PT1 = 1; //高优先级中断
TR1 = 1; // 启动定时器1
// 使能ADC中断
// 初始化ADC
//ADC_CONTR = ADC_POWER | ADC_SPEED_90; // 启动ADC并设置转换速度
ADCTIM = 0x3F; // 设置ADC 内部时序
//P_SW2 &= 0x7f; //脚位映射
ADCCFG = 0x2f; // 设置ADC 时钟为系统时钟/2/16,ADC_RES左移6
ADC_CONTR = ADC_POWER | ADC_START | 0x08; // 选择通道
EADC = 1;
EA = 1;
//------------------------------------------------------------------------------------------
}
//------------------------------------------------------------------------------------------------------
void main(void)
{
init_mcu(); //初始化各IO口以及中断
while(1)
{
}
}
//----------------------------------------------------------------------------------------
//========================================================================
void timer1_ISR (void) interrupt TIMER1_VECTOR
{
reload_value = TIMER_OVERFLOW_COUNT;
TH1 = (unsigned char)(reload_value >> 8); // 重新加载定时器高字节
TL1 = (unsigned char)(reload_value); // 重新加载定时器低字节
// 启动ADC转换
ADC_CONTR = ADC_POWER | ADC_START | 0x08; // 选择通道
}
//=========================================================================
//AD中断入口5
void ADC_ISR(void) interrupt ADC_VECTOR
{
unsigned int adc_value;
if(ADC_CONTR & ADC_FLAG)
{
adc_value = (ADC_RES << 8) | ADC_RESL ; // 获取10位ADC结果
// 累加和
adc_sum += adc_value;
// 平方累加和
adc_square_sum += adc_value * adc_value;
sample_count++;
if (sample_count >= SAMPLES_PER_CYCLE)
{
sampling_complete = 1; // 标记一个周期采样完成
}
}
// 清除ADC中断标志
ADC_CONTR &= ~ADC_FLAG;
}
//=========================================================================
|
|