PIC单片机-AD转换

2023-12-24 00:08
文章标签 转换 单片机 ad pic

本文主要是介绍PIC单片机-AD转换,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

编写程序,使用数码管显示ADC测量得到的电压值。电压值由1位整数和1位小数构成。例如若当前AN0通道上的电压为6V,则数码管应显示3.6。

#include <htc.h>
#include <math.h>#define uint8 unsigned char
#define uint16 unsigned int__CONFIG(FOSC_HS &WDTE_OFF &BOREN_OFF &PWRTE_OFF &LVP_OFF); //设置配置位
//WDTE_OFF:disable watchdog timer       看门狗禁止
//LVP_OFF:low voltage programming disabled  低电压编程禁止
//FOSC_HS:high speed crystal/resonator  4M以上晶振选择HS高速
//PWRTDIS:disable power up timer
//BOREN_OFF:disable brown out reset
/***************************定义全局变量***************************************/uint8 disp[] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90}; //共阳数码管段码表
uint16 AD_Result;   //ADC转换结果变量
uint16 count;
long AD_Result_temp;/***************************声明函数*******************************************/void ADC_Init(void);
void Time2_Init(void);
void DelayUS(uint8 delay);
void LED_Display(uint8 chosebit, uint8 wdata);/*******************************************************************************
* 函 数 名: DelayUS(uint8 delay)
* 函数功能: 微秒延时   for 20MHZ
* 入口参数: delay
* 返    回: 无
*******************************************************************************/void DelayUS(uint8 delay)
{
    while(--delay);
}/******************************************************************************
* 函 数 名: ADC_Init(void)
* 函数功能: ADC初始化
* 入口参数: 无
* 返    回: 无
*******************************************************************************/
void ADC_Init(void)
{
    TRISA0 = 1;     //模拟通道0设置为输入
    ADCON1 = 0x8E;  //10001110  Vref+ = VDD Vref- = VSS
    ADCON0 = 0x01;  //选择通道0,使能AD
    ADIF = 0;       //中断标志清零
    ADIE = 1;       //ADC中断使能
}/*******************************************************************************
* 函 数 名: Time2_Init(void)
* 函数功能: 定时器2初始化
* 入口参数: 无
* 返    回: 无
*******************************************************************************/void Time2_Init(void)
{
    T2CON = 0x01;   //postscale 1:1 prescale 1:4
    PR2 = 250;      //匹配寄存器   1*4*250*200ns = 200us
    TMR2IF = 0;         //定时器2中断标志位清零
    GIE = 1;            //开总中断
    PEIE = 1;           //开外设中断
    TMR2IE = 1;         //开定时器中断
}/*******************************************************************************
* 函 数 名: LED_Display(uint8 chosebit,uint8 wdata)
* 函数功能: 单个数码管显示
* 入口参数: chosebit选择字位,wdata字型
* 返    回: 无
*******************************************************************************/void LED_Display(uint8 chosebit, uint8 wdata)
{
    if((chosebit < 0) || (chosebit > 4))
        return;
    ADCON1 = 0x8E;  //10001110  RA0位模拟输入
    TRISA &= 0x01;
    TRISE &= 0xEF;      //配置PORTD为普通IO口,对PORTD的操作务必加上这句
    TRISD = 0x00;       //数据线配置为输出
    PORTA = (PORTA & 0xE3) | ((chosebit + 3) << 2); //RA2:RA3:RA4:011 选通第一位 100选通第二位 101选通第三位 110选通第四位
    PORTD = wdata;  //送显示数字的断码
    DelayUS(100);       //延时
    PORTD = 0xFF;       //关闭显示
}/******************************************************************************
* 函 数 名: mian(void)
* 函数功能: 对模拟通道0进行采样,并显示,再采样,再显示
* 入口参数: 无
* 返    回: 无
*******************************************************************************/void main(void)
{
    long temp;
    ADC_Init();     //ADC初始化
    Time2_Init();   //定时器2初始化
    GIE = 1;        //总中断使能
    PEIE = 1;       //外设中断设能
    GO = 1;         //启动ADC转换
    TMR2ON = 1;     //启动定时器2计时
    while(1)
    {
        temp = AD_Result_temp;
        temp /= 10;
        LED_Display(2, disp[temp % 10]);    //显示十分位
        temp /= 10;
        LED_Display(1, disp[temp % 10] & 0x7F); //显示个位
    }
}/******************************************************************************
* 函 数 名: interrupt PIC_Init(void)
* 函数功能: 中断函数
* 入口参数: 无
* 返    回: 无
*******************************************************************************/void interrupt PIC_Init(void)
{
    if(ADIF == 1)
    {
        ADIE = 0;   //关AD中断
        ADIF = 0;                       //AD中断标志清零
        AD_Result = ADRESL & 0x00FF;    //读取ADC采样结果
        AD_Result |= ADRESH << 8 ;
        AD_Result_temp = AD_Result * 50;    //5V为VDD电压,根据不同的电压作修改
        AD_Result_temp = AD_Result_temp * 10 / 1023;    //再放大10倍,方便计算显示
        ADIE = 1;   //开启AD中断
    }    if(TMR2IF == 1)
    {
        TMR2IE = 0;     //关定时器0中断
        TMR2IF = 0;     //清标志位
        count++;        //计数值加1
        if(count >= 500)    //200us*500 = 100ms,即0.1s启动采样一次
        {
            count = 0;
            GO = 1;     //启动ADC转换
        }
        TMR2 = 0x00;
        TMR2IE = 1;     //开中断
    }
}

这篇关于PIC单片机-AD转换的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/529933

相关文章

Window Server2016加入AD域的方法步骤

《WindowServer2016加入AD域的方法步骤》:本文主要介绍WindowServer2016加入AD域的方法步骤,包括配置DNS、检测ping通、更改计算机域、输入账号密码、重启服务... 目录一、 准备条件二、配置ServerB加入ServerA的AD域(test.ly)三、查看加入AD域后的变

Window Server2016 AD域的创建的方法步骤

《WindowServer2016AD域的创建的方法步骤》本文主要介绍了WindowServer2016AD域的创建的方法步骤,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价... 目录一、准备条件二、在ServerA服务器中常见AD域管理器:三、创建AD域,域地址为“test.ly”

Linux使用dd命令来复制和转换数据的操作方法

《Linux使用dd命令来复制和转换数据的操作方法》Linux中的dd命令是一个功能强大的数据复制和转换实用程序,它以较低级别运行,通常用于创建可启动的USB驱动器、克隆磁盘和生成随机数据等任务,本文... 目录简介功能和能力语法常用选项示例用法基础用法创建可启动www.chinasem.cn的 USB 驱动

Python 标准库time时间的访问和转换问题小结

《Python标准库time时间的访问和转换问题小结》time模块为Python提供了处理时间和日期的多种功能,适用于多种与时间相关的场景,包括获取当前时间、格式化时间、暂停程序执行、计算程序运行时... 目录模块介绍使用场景主要类主要函数 - time()- sleep()- localtime()- g

JAVA中整型数组、字符串数组、整型数和字符串 的创建与转换的方法

《JAVA中整型数组、字符串数组、整型数和字符串的创建与转换的方法》本文介绍了Java中字符串、字符数组和整型数组的创建方法,以及它们之间的转换方法,还详细讲解了字符串中的一些常用方法,如index... 目录一、字符串、字符数组和整型数组的创建1、字符串的创建方法1.1 通过引用字符数组来创建字符串1.2

Java将时间戳转换为Date对象的方法小结

《Java将时间戳转换为Date对象的方法小结》在Java编程中,处理日期和时间是一个常见需求,特别是在处理网络通信或者数据库操作时,本文主要为大家整理了Java中将时间戳转换为Date对象的方法... 目录1. 理解时间戳2. Date 类的构造函数3. 转换示例4. 处理可能的异常5. 考虑时区问题6.

基于C#实现将图片转换为PDF文档

《基于C#实现将图片转换为PDF文档》将图片(JPG、PNG)转换为PDF文件可以帮助我们更好地保存和分享图片,所以本文将介绍如何使用C#将JPG/PNG图片转换为PDF文档,需要的可以参考下... 目录介绍C# 将单张图片转换为PDF文档C# 将多张图片转换到一个PDF文档介绍将图片(JPG、PNG)转

基于51单片机的自动转向修复系统的设计与实现

文章目录 前言资料获取设计介绍功能介绍设计清单具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订阅👇🏻 单片机

Spark MLlib模型训练—聚类算法 PIC(Power Iteration Clustering)

Spark MLlib模型训练—聚类算法 PIC(Power Iteration Clustering) Power Iteration Clustering (PIC) 是一种基于图的聚类算法,用于在大规模数据集上进行高效的社区检测。PIC 算法的核心思想是通过迭代图的幂运算来发现数据中的潜在簇。该算法适用于处理大规模图数据,特别是在社交网络分析、推荐系统和生物信息学等领域具有广泛应用。Spa

PDF 软件如何帮助您编辑、转换和保护文件。

如何找到最好的 PDF 编辑器。 无论您是在为您的企业寻找更高效的 PDF 解决方案,还是尝试组织和编辑主文档,PDF 编辑器都可以在一个地方提供您需要的所有工具。市面上有很多 PDF 编辑器 — 在决定哪个最适合您时,请考虑这些因素。 1. 确定您的 PDF 文档软件需求。 不同的 PDF 文档软件程序可以具有不同的功能,因此在决定哪个是最适合您的 PDF 软件之前,请花点时间评估您的