STC8学习 ——ADC 1

这篇具有很好参考价值的文章主要介绍了STC8学习 ——ADC 1。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

注意: uint8_t正常左移8位是0,但如果赋值给uint16_t就占uint16_t中高8位,要保留数据就要把八位数据左移8位后赋给16数据,继续赋给8位数据,结果就是0

注意:通过ADC采集数据并输出电压的原理是  电压和对应ADC端口采集结果的比值是恒定的

ADC第15通道采集的内部参考电压值非常稳定,约为1.19V,不会随芯片的工作改变,可以拿来反推其他通道的电压。

   内部电压 / ADC15采集值 = 需要测量的电压 / 对应ADC通道采集值

内部电压 / ADC15采集值 = 实际电源电压 / 1023    推算出来实际电压值

1.普通的IO口只能识别0和1,以STC8的IO口为例,输入0.7V识别为0,输入3.3V识别为1,输入一个0.7 ~3.3 V的电压,IO口的输入结果就是随机的了。

2.STC8有10位的ADC模数转换口,10位指的是将0到最大电压进行分割的份数,即1024份,位数越多,测量结果越精确,因为分割的份数多。

 3.  因为要通过串口观察查询到的结果,所以串口初始化函数要保留。在主函数中执行,就可以和电脑建立串口。

4.串口自带的输出功能太麻烦,这里要用的printf函数。调用printf需要

  #include "stdio.h"头文件

在串口初始化函数中修改输出标志位 TI = 1;

5.ADC的函数初始化比较简单

 ADCCFG = 0X2F;   //设置采集到的数据右对齐,采集速度为16分频

6.采集电压的函数

unsigned int Fetch_Power(void)
{
    unsigned int res;
    ADC_CONTR = 0X87;      //打开ADC开关,选择P1.7  ADC7 端口
    ADC_CONTR |=0X40;    // 启动ADC
    _nop_();           
    _nop_();                                 //等待一会
    while(!(ADC_CONTR & 0X20));   //通过标志位,确保在ADC采集完成前不会执行其他语句

                                                          //前面也右好几个地方,是一样通过标志位确保执行完成
    ADC_CONTR &= ~ 0X20;            //标志位需要手动清0
    res = (ADC_RES << 8 )| ADC_RESL ;

//因为采集结果是右对齐,将ADC_RES采集到的2位左移8位,给ADC_RESL腾空间,按照下面的说明就会ADC_RES 和ADC_RESL 里面的10位数全部都放到16位变量res里面

   uint8_t正常左移8位是0,但如果赋值给uint16_t就占uint16_t中高8位 (原因:未知,实际转换成 32位?)          |的意义:就是把data[1]赋值给低8位,原因:0|1 = 1 0|0 = 1  。

          知识盲区。。。。。
    return res;                                      //返回采集到的结果,注意函数了类型要联动修改
}

#include "stc8g.h"
#include "intrins.h"
#include "stdio.h"

......

......

.......

/* 串口初始化函数 */
void UartInit(void)        //115200bps@35MHz
{
    SCON = 0x50;        //8位数据,可变波特率
    AUXR |= 0x01;        //串口1选择定时器2为波特率发生器
    AUXR |= 0x04;        //定时器2时钟为Fosc,即1T
    T2L = 0xB4;        //设定定时初值
    T2H = 0xFF;        //设定定时初值
    AUXR |= 0x10;        //启动定时器2
    
  TI = 1;
}

/* adc初始化函数 */
void ADC_Init(void)
{
 ADCCFG = 0X2F;
}

unsigned int Fetch_Power(void)
{
    unsigned int res;
    ADC_CONTR = 0X87;
    ADC_CONTR |=0X40;
    _nop_();
    _nop_();
    while(!(ADC_CONTR & 0X20));
    ADC_CONTR &= ~ 0X20;
    res = (ADC_RES << 8 )| ADC_RESL ;
    return res;
}

/* 主函数 */
void main()
{
    unsigned int Power;
    P0M0 = 0x00;   //设置P0.0~P0.7为双向口模式
    P0M1 = 0x00;
    
    UartInit(); // 串口初始化
    ADC_Init();   //最开始忘记调用ADC初始化函数,采集到的数据非常离谱,是个负数........
    while(1)
    {
        delay_ms(1000);
        Power = Fetch_Power();
        printf("Power =  %d \r\n",    Power);    //采集的数据赋值后输出

    }
}


 

          文章来源地址https://www.toymoban.com/news/detail-423916.html

到了这里,关于STC8学习 ——ADC 1的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C语言】函数入参写 uint8_t *data 和 uint8_t data[]有什么区别

    在 C 语言中,函数参数 uint8_t *data 和 uint8_t data[] 实际上是等价的。它们都表示一个指向 uint8_t 类型的指针,指向数组的第一个元素。C 语言中 数组在传递给函数时会退化为指针 ,因此这两种表示方法在实际使用中没有区别。 以下是两种参数表示法的示例: 在这个例子中,

    2024年02月13日
    浏览(37)
  • STC8学习5 - 定时器

    定时器也可以做为计数器,其实他们本质上的原理是一样的,定时器是计数单片机内部的系统时钟,每1个或者12个时钟脉冲,就加一。计数器则是记录外部输入脉冲。 1. 定时器0有四种工作模式,这里使用的是定时器0的16位可重新装载模式,16位(0x0000~0xFFFF)即可以从0数到

    2024年02月06日
    浏览(39)
  • javascript(js)语法 将blob转arrayBuffer、arrayBuffer转Uint8Array、Uint8Array转String的方法

    1. blob转arrayBuffer的函数 2. arrayBuffer转Uint8Array的函数 3. Uint8Array转String的函数 测试上面三种方法

    2024年02月06日
    浏览(34)
  • 【C语言】uint8_t、uint16_t、uint32_t、uint64_t是什么?

    uint8_t 是一个 数据类型 ,也是别名,它是 无符号8位整数 类型的缩写。 uint 表示 无符号整数 ,即数值 不能为负数 ; 8 表示该类型的大小为 8位 ,即该类型可表示的 最大值255 , 最小值0 ; _t 表示别名,用typedef定义的数据类型。 在C++和C语言中,uint8_t 通常是通过标准头文件

    2024年02月16日
    浏览(42)
  • typedef uint8_t u8;(stm32数据类型)

    在stm32单片机的库文件里有这么一段u8和u16的定义 typedef uint8_t  u8; typedef uint16_t u16; 而uint8_t和uint16_t的定义是这样的 typedef unsigned          char uint8_t; typedef unsigned short     int uint16_t; 意味着u8就是就是指代的unsigned char 意味着u16就是就是指代的unsigned short int C语言之数据类型

    2024年02月04日
    浏览(50)
  • 关于C或C++,数组的强制类型转换,uint8_t与char的区别,uint8_t*与char*的兼容性问题以及一些指针的常见问题

    1.类型定义: uint8_t:这是一个无符号 8 位整数类型,定义在 stdint.h 或 inttypes.h 头文件中。它是标准的固定宽度整数类型之一,确保在所有平台上占用 8 位(1 字节)。 char:这是 C 语言的基本字符存储类型,用于存储单个字符。在不同的系统和编译器中,char 可以是有符号的

    2024年01月24日
    浏览(36)
  • Flutter Dart FFI Pointer<Uint8>类型如何转成数组或String

    继上一次发布的 Flutter 直接调用so动态库,或调用C/C++源文件内函数 内容,最终我选择了第二种方式, 直接把整个 Native C++ 的项目源代码放进了 Flutter 工程里编译 (放在iOS的目录是因为它不支持自定义源码路径,Android是可以的)。这样的好处是 Android 和 iOS 两个平台都不需要

    2024年02月04日
    浏览(47)
  • 详解C语言中的int8_t、uint8_t、int16_t、uint16_t、int32_t、uint32_t、int64_t、uint64_t

    2023年8月8日,周二上午 目录 为什么会产生int8_t、uint8_t等这类数据类型 int8_t、uint8_t等这类数据类型有什么用 头文件 int8_t、uint8_t等这类数据类型是怎么实现的 根本原因在于,C 语言标准只是规定了各个基本类型的最小字节长度,但并没有指定它们的确切字节长度: char 类型

    2024年02月13日
    浏览(42)
  • JS各种数据流之间的格式(ArrayBuffer、Uint8Array、Blob、 File、DataURL)相互转换及应用

    前端网页 File 上传、下载,Canvas 保存图片,Ajax 和 Fetch 二进制流传输,PDF 预览,浏览器上 WebAssembly 的应用 等等都需要到 ArrayBuffer 和 Blob 。 FileReader 对象允许Web应用程序异步读取存储在用户计算机上的文件(或原始数据缓冲区)的内容,使用 File 或 Blob 对象指定要

    2024年02月08日
    浏览(41)
  • 【STC8】热启动&&串口指令下载

      在目标开发板没有装载自动下载电路的时候,往往需要冷启动,也就是需要手动开关电源,来达到单片机复位下载。当然还有一种方法是热启动,通过串口接收到自定义的指令后,软件执行复位下载。这就是本文介绍的内容。 开发板:STC8A8K64S4A12开发板(用的是STC8A8K64

    2024年02月06日
    浏览(79)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包