历史上的今天
返回首页

历史上的今天

今天是:2025年08月12日(星期二)

正在发生

2018年08月12日 | PIC单片机-AD转换

2018-08-12 来源:eefocus

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

#include

#include

 

#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;     //开中断

    }

}



推荐阅读

史海拾趣

Anadigm公司的发展小趣事

Anadigm是一家曾经存在的半导体公司,专注于可编程模拟信号处理器(PASP)技术。以下是Anadigm公司发展的相关故事:

  1. 公司成立与初期发展:Anadigm公司成立于1997年,总部位于美国加利福尼亚州圣塔莫尼卡市。公司的创始人致力于开发一种新型的可编程模拟信号处理器(PASP),以应对传统模拟电路设计的局限性。通过引入数字技术,Anadigm旨在提供更灵活、高性能的模拟信号处理解决方案。

  2. PASP技术的推出与市场应用:Anadigm公司于2000年推出了其首款可编程模拟信号处理器产品系列。这些器件具有灵活的可编程性和高度集成的特点,能够适应多种应用场景,包括电力管理、医疗设备、汽车电子和工业控制等领域。Anadigm的PASP技术受到了行业的关注,并在市场上取得了一定的成功。

  3. 技术创新与产品优化:Anadigm公司不断投入研发,致力于改进其PASP技术并推出更先进的产品。公司持续与客户合作,了解市场需求并进行技术创新,以满足不断变化的行业需求。Anadigm的产品不断优化,性能不断提升,赢得了客户的信赖和市场份额的扩大。

  4. 合并与收购:尽管Anadigm公司在PASP技术方面取得了一定的成就,但面临着激烈的市场竞争和资金压力。在公司运营一段时间后,Anadigm于2008年被美国半导体公司Exar Corporation收购。此次收购使得Anadigm成为Exar的全资子公司,继续在模拟信号处理领域发展。

  5. 最终终止业务:然而,随着时间的推移,Anadigm在市场上的地位逐渐下滑,未能在激烈的竞争中保持竞争优势。最终,Exar Corporation于2014年宣布终止Anadigm的业务,并关闭其产品线。这标志着Anadigm作为一个独立的实体在半导体行业的终结。

以上是Anadigm公司发展的一些主要故事,展示了该公司从创立到终止业务的发展历程。

喜美克斯(Cvilux)公司的发展小趣事

在追求经济效益的同时,喜美克斯公司也高度重视环境保护。他们积极采用环保材料和生产工艺,减少生产过程中的污染排放。此外,公司还积极参与各种环保公益活动,倡导绿色消费理念,为电子行业的可持续发展做出了积极贡献。

BB公司的发展小趣事

2000年,BB公司迎来了发展史上的一个重要时刻——被美国德州仪器公司收购。这一收购对于BB公司来说,既是挑战也是机遇。德州仪器作为全球领先的半导体公司,为BB公司提供了更广阔的平台和更丰富的资源。在德州仪器的支持下,BB公司得以继续深化技术创新和市场拓展,进一步提升了其在电子行业的地位。

Hengstler GmbH公司的发展小趣事

如今,BB公司已经走过了数十年的发展历程,成为电子行业中一颗璀璨的明星。然而,公司并没有因此停下脚步。相反,BB公司始终保持着强烈的创新意识和进取精神,不断寻求新的发展机遇和挑战。未来,BB公司将继续致力于技术创新和市场拓展,为电子行业的繁荣发展贡献更多力量。

以上是关于BB公司发展起来的五个相关故事。这些故事不仅展现了BB公司的成长历程和发展成就,也凸显了其在电子行业中的重要地位和影响。相信在未来的日子里,BB公司将继续书写更加辉煌的篇章。

Epistar Corp公司的发展小趣事

近年来,随着OLED(有机发光二极管)技术的兴起,LED行业面临着巨大的挑战。Epistar敏锐地意识到了这一点,开始积极调整战略方向,加大在OLED技术领域的研发力度。同时,公司还通过优化产品结构、提高生产效率等措施降低成本、提升竞争力。这些努力使Epistar在OLED技术浪潮中保持了稳健的发展态势。

百佳(BAIJIA)公司的发展小趣事

百佳公司深知技术创新是企业发展的核心动力。因此,他们不断加大研发投入,引进先进技术和设备,推动产品的升级换代。通过不断创新,百佳公司成功开发出了一系列具有自主知识产权的电子产品,不仅提升了企业的核心竞争力,也为行业的发展做出了重要贡献。

问答坊 | AI 解惑

全国大学生电子设计大赛历年题目

全国大学生电子设计大赛历年题目,里面包含技术达标,元器件,评分规则…

查看全部问答>

求C++简易教程

入门级的C++教程。多一点实例讲解的 大家给推荐一下啊。…

查看全部问答>

基于FPGA 的DDS 调频信号的研究与实现.pdf

基于FPGA 的DDS 调频信号的研究与实现.pdf…

查看全部问答>

下班回家后,不弄技术,你能做什么?

嗨, 本来想看点电视节目的,关注关注国家大事什么的............... 但是还是习惯看看单片机论坛,查查资料什么的 ............ 我这陋习真难改...........…

查看全部问答>

嵌入式系统如何与计算机通过以太网连接

本人在利用DM642EVM上设计了一个算法,想通过网口将计算结果传给计算机,EVM上发送的是标准的IP包,请问计算机端如何接收,请各位高手指点…

查看全部问答>

keil3上memory window 无法显示的问题

前两天你在网上下了个700多M的keil3来用!好不容易装好了发现memory window 里没法显示内存数据! 看了半天发现是字体的问题,memory window 的字体默认的是1295711,一般编译框里字体是10或0,但是没办法修改!今天弄了一天都没办法,字体太小, ...…

查看全部问答>

STM32的UART竟然不支持7Bit传输...

STM32 只能设置8,9位的方式。LPC ARM可以支持5,6,7,8位。工控中常用的 9600,E,7,1 就用不了吗?…

查看全部问答>

ModelSim中自带一个例子的疑问

在ModelSim安装成功后应该是在.....\\ModelSim\\examples\\tutorials\\verilog\\basicSimulation的目录下,有一个counter.v和tcounter.v的两个文件, 主要的疑问就是在count.v中为什么要加入function那一块?老是无法明了。 疑问的部分就是大号粗 ...…

查看全部问答>

设置提醒的建议

我跟帖,要是有人回复了我,或者我自己发的帖子有新的回复,我希望能得到有一个提醒,这样子会好一些…

查看全部问答>