问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

STC8G1K08A单片机读取ADC引脚值输出到串口

创作时间:
作者:
@小白创作中心

STC8G1K08A单片机读取ADC引脚值输出到串口

引用
CSDN
1.
https://blog.csdn.net/m0_47459564/article/details/136308197

STC8G1K08A单片机引脚图

如上图,STC8G1K08A的6个IO口均支持ADC转换。本次例程使用3号引脚(ADC5)。

所需硬件:

  • 电位器模块一个,需要接三根线,电源两根线,输出接到单片机P5^5,如下:

  • STC8G1K08A单片机,为了方便调试,画了个板子,引脚接了排针,状态指示灯:(板子上的开关,按下断开单片机电源,省去串口下载程序时插拔电源冷启动的步骤)

硬件连接:

对下载程序,串口通信有疑问可观看我上篇发文【STC8G1K08A串口使用】

本次例程完整代码:

#include<stc8g.h>
#include<stdio.h>
#include<intrins.h>
#define ADC_Power 0x80	//使能ADC模块		打开ADC		将ADC引脚设置到
#define ADC_Start 0x40	//开始ADC转换
#define ADC_Flag 0x20	//转换完成标志位
#define ADC_SYS 0x2f	//将ADC系统时钟设定为SYSclk/2/16
//******************************************
//延时ms函数,参数:ms
//使用条件:晶振/系统频率30.000MHz
//******************************************
void delay(int ms){    
    unsigned char data i, j;
    while(ms){
        i = 30;
        j = 43;
        do
        {
            while (--j);
        } while (--i);
    ms--;
    }
}
//******************************************
//函数说明:串口初始化
//******************************************
void Serial_begin()	//9600bps@30.000MHz
{
    SCON = 0x50;		//8位数据,可变波特率
    AUXR |= 0x40;		//定时器时钟1T模式
    AUXR &= 0xFE;		//串口1选择定时器1为波特率发生器
    TMOD &= 0x0F;		//设置定时器模式
    TL1 = 0xF3;			//设置定时初始值
    TH1 = 0xFC;			//设置定时初始值
    ET1 = 0;			//禁止定时器中断
    TR1 = 1;			//定时器1开始计时
}
void Sendbyte(unsigned char dat){//发送8位数据到串口
  SBUF = dat;
  while(!TI);
  TI=0;
}
char putchar(char c){//重定义printf()函数,用于串口打印信息
  Sendbyte(c);
  return c;
}
//******************************************
//函数说明:读取指定ADC引脚值。参数:ADC引脚编号(编号见上单片机引脚图)
//******************************************
unsigned int analogRead(unsigned char ADC_Pin){
 
  ADC_CONTR = ADC_Power + ADC_Pin;  //使能ADC,向寄存器写入将要读的ADC引脚
  ADCCFG = ADC_SYS;					//将ADC系统时钟设定为SYSclk/2/16
  ADC_CONTR |= ADC_Start;			//开始ADC转换
  _nop_();
  _nop_();
  while(!(ADC_CONTR & ADC_Flag));	//等待完成
  ADC_CONTR &=~ ADC_Flag;			//清除完成标志位
  return (ADC_RES<<8) | ADC_RESL; 	//合并高8位低8位,返回合并后结果
}
//******************************************
//主程序
//******************************************
void main(){
    Serial_begin();//初始化串口
    while(1){
        printf("读取ADC5的值 = %d\n",analogRead(5));//读取ADC5的值并打印到串口输出
        delay(1000);//延时1秒
    }
}

下载上述程序需注意设置运行频率为30MHz

程序下载后打开串口助手输出效果:

打开串口调试软件,波特率设置9600,每秒会收到一次ADC5的值,调整电位器旋柄,输出值跟随变化。

本文部分程序源自博主“CM_1095111730”的【STC8G1K08A单片机数模转换】一文,原文讲解ADC模数转换更为详细,点击跳转

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号