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

相关文章

Java实现时间与字符串互相转换详解

《Java实现时间与字符串互相转换详解》这篇文章主要为大家详细介绍了Java中实现时间与字符串互相转换的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、日期格式化为字符串(一)使用预定义格式(二)自定义格式二、字符串解析为日期(一)解析ISO格式字符串(二)解析自定义

在java中如何将inputStream对象转换为File对象(不生成本地文件)

《在java中如何将inputStream对象转换为File对象(不生成本地文件)》:本文主要介绍在java中如何将inputStream对象转换为File对象(不生成本地文件),具有很好的参考价... 目录需求说明问题解决总结需求说明在后端中通过POI生成Excel文件流,将输出流(outputStre

python+opencv处理颜色之将目标颜色转换实例代码

《python+opencv处理颜色之将目标颜色转换实例代码》OpenCV是一个的跨平台计算机视觉库,可以运行在Linux、Windows和MacOS操作系统上,:本文主要介绍python+ope... 目录下面是代码+ 效果 + 解释转HSV: 关于颜色总是要转HSV的掩膜再标注总结 目标:将红色的部分滤

利用Python开发Markdown表格结构转换为Excel工具

《利用Python开发Markdown表格结构转换为Excel工具》在数据管理和文档编写过程中,我们经常使用Markdown来记录表格数据,但它没有Excel使用方便,所以本文将使用Python编写一... 目录1.完整代码2. 项目概述3. 代码解析3.1 依赖库3.2 GUI 设计3.3 解析 Mark

C语言中的数据类型强制转换

《C语言中的数据类型强制转换》:本文主要介绍C语言中的数据类型强制转换方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C语言数据类型强制转换自动转换强制转换类型总结C语言数据类型强制转换强制类型转换:是通过类型转换运算来实现的,主要的数据类型转换分为自动转换

Java实现XML与JSON的互相转换详解

《Java实现XML与JSON的互相转换详解》这篇文章主要为大家详细介绍了如何使用Java实现XML与JSON的互相转换,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. XML转jsON1.1 代码目的1.2 代码实现2. JSON转XML3. JSON转XML并输出成指定的

Java实现将Markdown转换为纯文本

《Java实现将Markdown转换为纯文本》这篇文章主要为大家详细介绍了两种在Java中实现Markdown转纯文本的主流方法,文中的示例代码讲解详细,大家可以根据需求选择适合的方案... 目录方法一:使用正则表达式(轻量级方案)方法二:使用 Flexmark-Java 库(专业方案)1. 添加依赖(Ma

Java实现将byte[]转换为File对象

《Java实现将byte[]转换为File对象》这篇文章将通过一个简单的例子为大家演示Java如何实现byte[]转换为File对象,并将其上传到外部服务器,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言1. 问题背景2. 环境准备3. 实现步骤3.1 从 URL 获取图片字节数据3.2 将字节数组

Java中数组转换为列表的两种实现方式(超简单)

《Java中数组转换为列表的两种实现方式(超简单)》本文介绍了在Java中将数组转换为列表的两种常见方法使用Arrays.asList和Java8的StreamAPI,Arrays.asList方法简... 目录1. 使用Java Collections框架(Arrays.asList)1.1 示例代码1.

Python使用PIL库将PNG图片转换为ICO图标的示例代码

《Python使用PIL库将PNG图片转换为ICO图标的示例代码》在软件开发和网站设计中,ICO图标是一种常用的图像格式,特别适用于应用程序图标、网页收藏夹图标等场景,本文将介绍如何使用Python的... 目录引言准备工作代码解析实践操作结果展示结语引言在软件开发和网站设计中,ICO图标是一种常用的图像