XHB7906021 发表于 2024-2-27 16:23:18

A/D多通道转换请教

#include <STC8G.H>//#include "STC8G.H"//#include "reg51.h"
#include "intrins.h"
#include<math.h> //包函abs绝对值函数
unsigned char i=0; m1=0; X1=0; L1=0;m4=0; max=0; min=0xff; channel=0;//XIN_SU=0; LAO_SU=0; mX=0;
unsigned intup_sum=0;/*上升数和*/   down_sum=0; /*下降数和*/
// 函数: u8   Get_ADC8bitResult(u8 channel) // 描述: 查询法读一次ADC结果. // 参数: channel: 选择要转换的ADC. // 返回: 8位ADC结果.
unsigned char Get_ADC8bitResult(unsigned char channel)//channel = 0~7ADC初始化
{         ADC_CONTR=0xe0;         //7=1电源开,6=1启动AD转换,5=1转换完成标志软件清0,
                //ADC_RES = 0; ADC_RESL = 0;
                ADC_CONTR=(ADC_CONTR & 0xe0)|channel;//1110 0010 7=1电源开,6=1启动AD转换,5=1转换完成标志软件清0,4与PWM相关,3:0(8G1K08A)ADC通道选择:0000=P3.0/ADC0;0001=P3.1/ADC1;0010=P3.2/ADC2;0011=P3.3/ADC3;0100=P5.4/ADC4;0101=P5.5/ADC5
    _nop_(); _nop_();_nop_(); _nop_();
                while((ADC_CONTR & 0x20) == 0)   //等AD转换完成
    ADC_CONTR &= ~0x20;         //清完成标志
    returnADC_RES ;
}
void main()
{         WDT_CONTR = 0x23; //7溢出标志,软件清零 5=1软/硬,启动看门狗定时器。4=1清零看门狗定时器,3=1IDLE 模式时看门狗继续计数,2-0分频系数    使能看门狗,溢出时间约为0.5s
                P3M1 = 0x0C;//0000 1100改P32/33高阻输入 P30/31推挽输出
                P3M0 = 0x03;//0000 001101推挽输出;10高阻输入;00准双向口
                P5M1 = 0x00;//0000 0000                                                                                                      0000 0000
                P5M0 = 0x30;//1100 0000      P55 P54推挽输出                                  0000 0000准双向口
                P5=0;       //P5输出=0;   
                while (1)
                {                /******* m1=Get_ADC8bitResult(2); //P32脚
                              if( m1>30){      P54=1 ;} else{P54=0;}               
               *********/                              
                              X1=Get_ADC8bitResult(3); //P33脚                              
                              if(X1>120){      P55=1 ;} else{P55=0;}               
                              WDT_CONTR |= 0x10;// WDT_CONTR = 0x34; //5=1软/硬,启动看门狗定时器。 4=1清零看门狗定时器清看门狗,否则系统复位IDLE   WDT_CONTR |= 0x10
}                }
//为何不想取不同通道 P32 P33值,变成了都是P32脚的值了???如下单通道都正常
/*********单独用P33输入 P55输出正常
                {                        // m1=Get_ADC8bitResult(2); //P32脚
                                        //if( m1>30){      P54=1 ;} else{P54=0;}               
                              
                                        X1=Get_ADC8bitResult(3); //P33脚                              
                                        if(X1>120){      P55=1 ;} else{P55=0;}               
                              WDT_CONTR |= 0x10;// WDT_CONTR = 0x34; //5=1软/硬,启动看门狗定时器。 4=1清零看门狗定时器清看门狗,否则系统复位IDLE   WDT_CONTR |= 0x10
                }               
******/
/*********单独用P32输入 P54输出正常
                {                        // m1=Get_ADC8bitResult(2); //P32脚
                                        //if( m1>30){      P54=1 ;} else{P54=0;}               
                              
                                        X1=Get_ADC8bitResult(3); //P33脚                              
                                        if(X1>120){      P55=1 ;} else{P55=0;}               
                              WDT_CONTR |= 0x10;// WDT_CONTR = 0x34; //5=1软/硬,启动看门狗定时器。 4=1清零看门狗定时器清看门狗,否则系统复位IDLE   WDT_CONTR |= 0x10
                }               
******/

电子DIY小家 发表于 2024-2-27 16:41:19

不应该啊, 建议先看看范例程序,看下来你的adc都没有初始化诶。先好好看看这个


乘风飞扬 发表于 2024-2-27 18:02:57

参考开天斧例程包例子:08-16路ADC轮询-每路16次ADC转换取中间8次求平均值-串口1返回结果
论坛下载地址:
https://www.stcaimcu.com/plugin.php?id=mdown:index#/~cateid=8&key=
页: [1]
查看完整版本: A/D多通道转换请教