本帖最后由 乘风飞扬 于 2023-6-14 18:18 编辑
代码我稍微整理测试了一下,采集结果基本正常,主要修改以下部分,其它内容不变:
- unsigned int xinpianneibiaoya,ADC_Result;
- float ADC_celiangdianya;
- void main()
- {
- P_SW2 = 0x80;//当需要访问XFR寄存器时,必须先将寄存器的B7位置EAXFR 置1,才能对XFR 进行正常的读写操作。
- P0M0 = 0x00; P0M1 = 0x10; //设置P0.4(47引脚)ADC测量的引脚为高阻输入模式
-
- ADCTIM = 0x3f; //设置ADC 内部时序
- ADCCFG = 0x2f; //设置ADC 时钟为系统时钟/2/16
- ADC_CONTR = 0x8c; //开启ADC测量功能,设置第12通道为ADC测量作用
- UartInit();
- EA = 1;
- while(1)
- {
- Delay1000ms();
- /************************内部电压采集*************************/
- xinpianneibiaoya = ((int)CHIPID7<<8) + CHIPID8;
- printf("芯片内部标压 %02umV\r\n", xinpianneibiaoya); //测量结果显示至串口助手显示出来,显示输出的单位为(mV)毫伏。
- /***********************外部电压采集基数**************************/
- ADC_CONTR = 0xcf; //启动AD 转换
- _nop_();//延时1微秒
- _nop_();//延时1微秒
- while (!(ADC_CONTR & 0x20)); //查询ADC 完成标志
- ADC_CONTR &= ~0x20; //清完成标志
- ADC_Result = ((unsigned int)ADC_RES << 8) + ADC_RESL;
- printf("采集内部通道的ADC值为%02u\r\n",ADC_Result); //读取ADC 测量结果显示至串口助手显示出来。
- // printf("采集外部的ADC信息为%02bu\r\n",ADC_RES); //读取ADC 测量结果显示至串口助手显示出来,打印输出的单位为(mV)毫伏。
- /******************电压测量计算**********************/
- ADC_celiangdianya = (float)xinpianneibiaoya / ADC_Result * 4096;//根据MCU手册查询公式得知,外部的ADC电压=4096*内部标压/外部电压采集基数
- printf("测得外部的ADC电压为%fmV\r\n",ADC_celiangdianya);
- }
- }
复制代码
实测结果如下:
另外,keil C51使用printf打印不同类型的数据需要指定数据宽度
(1)b 八位 (2)h 十六位(默认) (3)l 三十二位
例如:
%bd 输出8位 十进制有符号整数
%hx 或者 %x 输出16位 十六进制整数
%lx 输出32位 十六进制整数
|