ADC扫描模式理解
qq_55319421:
P54 p55为什么会随延时约1秒1 0变化?
#include "stc8g.h" //包含此头文件后,不需要再包含"reg51.h"头文件
#include "intrins.h"
#define MAIN_Fosc 24000000L //定义主时钟
typedef unsigned char u8;
typedef unsigned int u16;
typedef unsigned long u32;
#define ADCTIM (*(unsigned char volatile xdata *)0xfea8)
u16 Get_ADC12bitResult(u8 channel); //channel = 0~15
void delay1us(unsigned int us)
{
unsigned int i, j;
for(i = us; i > 0; i--)
for(j =1000; j > 0; j--);
}
void mainm2(void)
{
u8 i;
Get_ADC12bitResult(2);
i = Get_ADC12bitResult(2); //读外部电压ADC
if(i>200)
{ P55=0;}
delay1us(1000) ;
P55=1;
}
void mainm3(void)
{
u8 j;
Get_ADC12bitResult(3);
j = Get_ADC12bitResult(3); //读外部电压ADC
if(j>200)
{ P54=0;}
delay1us(1000) ;
P54=1;
}
void main(void)
{
P_SW2 |= 0x80; //扩展寄存器(XFR)访问使能
P3M0 &= ~0x0f; P3M1 |= 0x0f; //高阻
P5M0 &= ~0x30; P5M1 &= ~0x30;
ADCTIM = 0x3f; //设置 ADC 内部时序,ADC采样时间建议设最大值
ADCCFG = 0x2f; //设置 ADC 时钟为系统时钟/2/16
ADC_CONTR = 0x80; //使能 ADC 模块
while(1)
{ mainm2();
mainm3();
} }
//========================================================================
// 函数: u16 Get_ADC12bitResult(u8 channel)
// 描述: 查询法读一次ADC结果.
// 参数: channel: 选择要转换的ADC.
// 返回: 12位ADC结果.
// 版本: V1.0, 2012-10-22
//========================================================================
u16 Get_ADC12bitResult(u8 channel) //channel = 0~15
{
ADC_RES = 0;
ADC_RESL = 0;
ADC_CONTR = (ADC_CONTR & 0xF0) | 0x40 | channel; //启动 AD 转换
_nop_();
_nop_();
_nop_();
_nop_();
while((ADC_CONTR & 0x20) == 0) ; //wait for ADC finish
ADC_CONTR &= ~0x20; //清除ADC结束标志
return (((u16)ADC_RES |