STC8系列单片机内部集成了一个12位的15通道A/D转换器,使用STC8内部ADC时,要使AVref连接参考电压,ADC_AVcc和ADC_AGnd接好电源和地线!
内部ADC引脚可参考芯片手册ADC_CHS寄存器配置可得知
参考例程
#include <STC8.h>
#include <intrins.h>
#include <stdio.h>
#define uchar unsigned char
#define uint unsigned int
/*常量宏定义*/
#define FOSC 11059200 //MCU晶振
#define BAUD_RATE 115200 //波特率设置
#define BRT (65536 - FOSC / BAUD_RATE / 4)//计算公式
//========================================================================
// 端口模式设置
//========================================================================
//准双向口
#define P0_MODE_IO_PU(Pin) P0M1 &= ~(Pin), P0M0 &= ~(Pin);
#define P1_MODE_IO_PU(Pin) P1M1 &= ~(Pin), P1M0 &= ~(Pin);
#define P2_MODE_IO_PU(Pin) P2M1 &= ~(Pin), P2M0 &= ~(Pin);
#define P3_MODE_IO_PU(Pin) P3M1 &= ~(Pin), P3M0 &= ~(Pin);
#define P4_MODE_IO_PU(Pin) P4M1 &= ~(Pin), P4M0 &= ~(Pin);
#define P5_MODE_IO_PU(Pin) P5M1 &= ~(Pin), P5M0 &= ~(Pin);
#define P6_MODE_IO_PU(Pin) P6M1 &= ~(Pin), P6M0 &= ~(Pin);
#define P7_MODE_IO_PU(Pin) P7M1 &= ~(Pin), P7M0 &= ~(Pin);
//高阻输入
#define P0_MODE_IN_HIZ(Pin) P0M1 |= (Pin), P0M0 &= ~(Pin);
#define P1_MODE_IN_HIZ(Pin) P1M1 |= (Pin), P1M0 &= ~(Pin);
#define P2_MODE_IN_HIZ(Pin) P2M1 |= (Pin), P2M0 &= ~(Pin);
#define P3_MODE_IN_HIZ(Pin) P3M1 |= (Pin), P3M0 &= ~(Pin);
#define P4_MODE_IN_HIZ(Pin) P4M1 |= (Pin), P4M0 &= ~(Pin);
#define P5_MODE_IN_HIZ(Pin) P5M1 |= (Pin), P5M0 &= ~(Pin);
#define P6_MODE_IN_HIZ(Pin) P6M1 |= (Pin), P6M0 &= ~(Pin);
#define P7_MODE_IN_HIZ(Pin) P7M1 |= (Pin), P7M0 &= ~(Pin);
//漏极开路
#define P0_MODE_OUT_OD(Pin) P0M1 |= (Pin), P0M0 |= (Pin);
#define P1_MODE_OUT_OD(Pin) P1M1 |= (Pin), P1M0 |= (Pin);
#define P2_MODE_OUT_OD(Pin) P2M1 |= (Pin), P2M0 |= (Pin);
#define P3_MODE_OUT_OD(Pin) P3M1 |= (Pin), P3M0 |= (Pin);
#define P4_MODE_OUT_OD(Pin) P4M1 |= (Pin), P4M0 |= (Pin);
#define P5_MODE_OUT_OD(Pin) P5M1 |= (Pin), P5M0 |= (Pin);
#define P6_MODE_OUT_OD(Pin) P6M1 |= (Pin), P6M0 |= (Pin);
#define P7_MODE_OUT_OD(Pin) P7M1 |= (Pin), P7M0 |= (Pin);
//推挽输出
#define P0_MODE_OUT_PP(Pin) P0M1 &= ~(Pin), P0M0 |= (Pin);
#define P1_MODE_OUT_PP(Pin) P1M1 &= ~(Pin), P1M0 |= (Pin);
#define P2_MODE_OUT_PP(Pin) P2M1 &= ~(Pin), P2M0 |= (Pin);
#define P3_MODE_OUT_PP(Pin) P3M1 &= ~(Pin), P3M0 |= (Pin);
#define P4_MODE_OUT_PP(Pin) P4M1 &= ~(Pin), P4M0 |= (Pin);
#define P5_MODE_OUT_PP(Pin) P5M1 &= ~(Pin), P5M0 |= (Pin);
#define P6_MODE_OUT_PP(Pin) P6M1 &= ~(Pin), P6M0 |= (Pin);
#define P7_MODE_OUT_PP(Pin) P7M1 &= ~(Pin), P7M0 |= (Pin);
//========================================================================
// 定义声明
//========================================================================
#define GPIO_PullUp 0 //上拉准双向口
#define GPIO_HighZ 1 //浮空输入
#define GPIO_OUT_OD 2 //开漏输出
#define GPIO_OUT_PP 3 //推挽输出
#define GPIO_Pin_0 0x01 //IO引脚 Px.0
#define GPIO_Pin_1 0x02 //IO引脚 Px.1
#define GPIO_Pin_2 0x04 //IO引脚 Px.2
#define GPIO_Pin_3 0x08 //IO引脚 Px.3
#define GPIO_Pin_4 0x10 //IO引脚 Px.4
#define GPIO_Pin_5 0x20 //IO引脚 Px.5
#define GPIO_Pin_6 0x40 //IO引脚 Px.6
#define GPIO_Pin_7 0x80 //IO引脚 Px.7
#define GPIO_Pin_LOW 0x0F //IO低4位引脚
#define GPIO_Pin_HIGH 0xF0 //IO高4位引脚
#define GPIO_Pin_All 0xFF //IO所有引脚
#define GPIO_P0 0 //
#define GPIO_P1 1
#define GPIO_P2 2
#define GPIO_P3 3
#define GPIO_P4 4
#define GPIO_P5 5
#define GPIO_P6 6
#define GPIO_P7 7
void Delay1ms(void) //@11.0592MHz
{
unsigned char i, j;
i = 15;
j = 90;
do
{
while (--j);
} while (--i);
}
void Delay_ms(unsigned int time)
{
unsigned int i;
for(i=0; i<time; i++)
{
Delay1ms();
}
}
//串口初始化
//定时器1做串口波特率
void uart1_Init(void)
{
//串口工作模式2,允许串口接收
SCON = 0x50;
T2L = BRT;
T2H = BRT>>8;
AUXR = 0x15;//启动定时器
ES = 1;//使能串口中断
EA = 1;//使能总中断
}
//重写putchar函数
char putchar(char ch)
{
SBUF = ch;
while(!TI);TI = 0;
return ch;
}
//ADC初始化
void ADC_Init(void)
{
ADCCFG = 0x0f; //设置ADC时钟为 计算公式为:系统时钟/2/16/SPEED[3:0] 具体查看芯片手册 P286
ADC_CONTR = 0x80; //使能ADC模块
}
//读取ADC结果
uint ADC_Result(void)
{
unsigned int adc_num;
ADC_CONTR |= 0x40; //启动AD转换
_nop_();
_nop_();
while (!(ADC_CONTR & 0x20)); //查询ADC完成标志
ADC_CONTR &= ~0x20; //清完成标志
adc_num = ADC_RES;
return adc_num; //返回ADC结果
}
void main()
{
unsigned int temp_adc;
uart1_Init(); //串口1初始化
P1_MODE_IN_HIZ(GPIO_Pin_0); //设置P1.0为高阻输入,设置为ADC口
ADC_Init(); //ADC初始化
while(1)
{
temp_adc = 0;
temp_adc = ADC_Result();
printf("P1.0端口ADC结果为:%d\n", temp_adc);
Delay_ms(500);
}
}