28
92
134
注册会员
#include "STC8Hxxx.h" // 引脚定义 sbit Pulse = P3^4; // PWM脉冲输出引脚 // 宏定义 #define MAIN_Fosc 35000000L // 主频35MHz // 声明 // 数组 // 函数 void Timer2_Init(void); void ADC_INIT(void); u16 ADC_ReadChannel(u8 channel); // 变量 u16 mv; bit ADC_mode = 0; // 0不使用ADC 1使用 bit error = 0; // 0正常工作 1报警 u16 timer_cnt = 0; // 函数模块 // 初始化ADC模块(改为10位模式) void ADC_INIT(void) { ADC_CONTR |= 0x80; // 打开ADC电源 ADCCFG &= ~0x0f; // 清除速度选择 ADCCFG |= 0x02; // 设置采样速率 ADCTIM = 0x35; // 设置采样保持时间 ADC_CONTR &= 0xDF; // 清除完成标志 EADC = 0; // 禁止ADC中断 ADCCFG &= ~0x20; // 改为10位模式(清除第5位) } // 读取指定通道ADC值(10位) u16 ADC_ReadChannel(u8 channel) { u16 result; ADC_CONTR &= 0xF0; ADC_CONTR |= (channel & 0x0F); ADC_CONTR &= ~0x20; ADC_CONTR |= 0x40; // 启动ADC while (!(ADC_CONTR & 0x20)); // 等待转换完成 ADC_CONTR &= ~0x20; // 清除标志 result = ADC_RES; // 高8位 result <<= 2; // 左移2位 result |= (ADC_RESL >> 6); // 取低2位放入结果 return result; // 返回10位值(0~1023) } // 20毫秒@35.000MHz void Timer2_Init(void) { AUXR &= 0xFB; //定时器时钟12T模式 T2L = 0x23; //设置定时初始值 T2H = 0x1C; //设置定时初始值 AUXR |= 0x10; //定时器2开始计时 IE2 |= 0x04; //使能定时器2中断 } // 返回值单位:mV(0~5000) u16 ADC_To_mV(u8 channel) { u16 ad = ADC_ReadChannel(channel); return (u32)ad * 5000 / 1023; // 关键:用 32 位运算避免溢出和精度丢失 } // 主函数 void main(void) { P3M0 = (P3M0 & ~0x20) | 0x10; P3M1 = (P3M1 & ~0x10) | 0x20; P_SW2 |= 0x80; EA = 1; ADC_INIT(); Timer2_Init(); Pulse = 1; while(1) { /* // 30s后检测adc if(ADC_mode == 1) { mv = ADC_To_mV(13); if(mv < 160) { error = 1; } } // 停止所有工作 卡死在此处 if(error == 1) { Pulse = 0; while(1); } */ mv = ADC_To_mV(13); if(mv < 160) { Pulse = 0; } else { Pulse = 1; } } } void Timer2_Isr(void) interrupt 12 { timer_cnt++; if(timer_cnt >= 250) // 20ms × 1500 = 30s { ADC_mode = 1; } }复制代码
使用道具 举报 送花
44
2576
2703
荣誉版主
814
1万
2万
管理员
神*** 发表于 2025-11-20 13:08 用最新 ISP软件中的 AiCube 来自动生成 ADC / 串行口 程序
本版积分规则 发表回复 回帖后跳转到最后一页
|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )
GMT+8, 2025-12-18 18:59 , Processed in 0.101990 second(s), 55 queries .
Powered by Discuz! X3.5
© 2001-2025 Discuz! Team.