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

相关文章

基于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 软件之前,请花点时间评估您的

单片机毕业设计基于单片机的智能门禁系统的设计与实现

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

C# double[] 和Matlab数组MWArray[]转换

C# double[] 转换成MWArray[], 直接赋值就行             MWNumericArray[] ma = new MWNumericArray[4];             double[] dT = new double[] { 0 };             double[] dT1 = new double[] { 0,2 };

数据流与Bitmap之间相互转换

把获得的数据流转换成一副图片(Bitmap) 其原理就是把获得倒的数据流序列化到内存中,然后经过加工,在把数据从内存中反序列化出来就行了。 难点就是在如何实现加工。因为Bitmap有一个专有的格式,我们常称这个格式为数据头。加工的过程就是要把这个数据头与我们之前获得的数据流合并起来。(也就是要把这个头加入到我们之前获得的数据流的前面)      那么这个头是

基于stm32的河流检测系统-单片机毕业设计

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

高斯平面直角坐标讲解,以及地理坐标转换高斯平面直角坐标

高斯平面直角坐标系(Gauss-Krüger 坐标系)是基于 高斯-克吕格投影 的一种常见的平面坐标系统,主要用于地理信息系统 (GIS)、测绘和工程等领域。该坐标系将地球表面的经纬度(地理坐标)通过一种投影方式转换为平面直角坐标,以便在二维平面中进行距离、面积和角度的计算。 一 投影原理 高斯平面直角坐标系使用的是 高斯-克吕格投影(Gauss-Krüger Projection),这是 横

VB和51单片机串口通信讲解(只针对VB部分)

标记:该篇文章全部搬自如下网址:http://www.crystalradio.cn/thread-321839-1-1.html,谢谢啦            里面关于中文接收的部分,大家可以好好学习下,题主也在研究中................... Commport;设置或返回串口号。 SettingS:以字符串的形式设置或返回串口通信参数。 Portopen:设置或返回串口

VC环境下整型转换为字符串型(2)

在串口下位机的发送中,可能会用到需要发送数字,显示为字符串型的 和上一篇文字《串口中字符串转换为整型》一正一反,知识点学习会了: #include<iostream.h> #include <stdio.h> #include <string.h>   void inttostr(int m,unsigned char * str) { int length=0;   int tmp,te