删掉这一行,否则关闭XFR标志位后,就无法访问地址在xdata区域的特殊功能寄存器了
这会导致后面的操作 ...
谢谢回复!
这一句有和没有都一样。我在程序里面加了一句ADCRread函数调用,也没用。
用镊子短接NTC时指示灯都不会切换
//测试ADC
#include "STC8H.h"
#include <intrins.h>
#define MAIN_Fosc11059200L// 11059200L // 定义主时钟频率(11.0592MHz)24000000UL//主时钟频率
#define PWM_Freq1000 //PWM基础频率(Hz)
#define T1MS (65536 - MAIN_Fosc/1000)// 1ms定时计算
#define BRT (65536 - (MAIN_Fosc/115200+2)/4)// 加2操作是为了让Keil编译器自动实现四舍五入运算
int *BGV; //内部参考信号源值存放在idata中,idata的EFH地址存放高字节
//F0H地址存放低字节,电压单位为豪富mV
int ADCRead()
{
int res;
ADC_CONTR|=~0x40;
//nop();
//nop();
while(!(ADC_CONTR&0x20));
ADC_CONTR&=~0x20;
res=(ADC_RES<<8)|ADC_RESL;
return res;
}
void ADC_Isr() interrupt 5
{
ADC_CONTR&=~0x20;
P4=ADC_RES ;
ADC_CONTR|=~0x40;
}
void main()
{
P0M0 = 0x00;
P0M1 = 0x00;
P1M0 = 0x00;
P1M1 = 0x00;
P2M0 = 0x00;
P2M1 = 0x00;
P3M0 = 0x00;
P3M1 = 0x00;
P4M0 = 0x00;
P4M1 = 0x00;
P5M0 = 0x00;
P5M1 = 0x00;
P1M0 = 0x00; //设置P1.4为ADC口
P1M1 = 0x10;
P_SW2 |= 0x80;
ADCTIM = 0x3f; //设置ADC内部时序
P_SW2 &= 0x7f; //有没有都没变化 1
ADCCFG = 0x0f; //设置ADC时钟为系统时钟/2/16
ADC_CONTR = 0x80; //使能ADC模块
EADC=1;
EA=1;
ADC_CONTR |= 0x40; //启动AD转换
while (1)
{
ADC_CONTR |= 0x40; //启动AD转换
_nop_();
_nop_();
ADCRead(); //有没有都没变化 2
while (!(ADC_CONTR & 0x20)); //查询ADC完成标志
ADC_CONTR &= ~0x20; //清完成标志
P4 = ADC_RES; //读取ADC结果
}
}
程序中这2句有没有都对结果没影响。
//P_SW2 &= 0x7f; //有没有都没变化 1
ADCRead(); //有没有都没变化 2 普信杨133 发表于 2025-8-31 21:52
谢谢回复!
这一句有和没有都一样。我在程序里面加了一句ADCRread函数调用,也没用。
用镊子短接NTC时指 ...
那可以试一下STC-ISP中自带的AiCube功能,选择8H8K64U型号即可,外设的驱动代码都是通用的
然后配置一下ADC和IO口部分,AiCube内的功能都是经过验证的
我用64U系列编译,保留了那2句有没有都没有变化的语句,下载后还是一样的,测试方式是用镊子短电阻和NTC来看指示灯短变化 P4=ADC_RES ;
不建议直接把外设寄存器赋值给另一个外设寄存器,可能会出现未知结果.
最好使用一个中间变量中转下.
页:
1
[2]