原创 数字电压表

2009-12-12 21:07 1526 3 3 分类: MCU/ 嵌入式

 


/********************
* 头 文 件 配 置 区 *
********************/
# include "PF_Config.h"
# include "HD_Support.h"
# include "EX_Support.h"



/********************
*   系 统 宏 定 义  *
********************/


/*------------------*
*   常 数 宏 定 义  *
*------------------*/


/*------------------*
*   动 作 宏 定 义  *
*------------------*/


#define START_ADC      ADCSRA |= (1<<ADSC);    //启动一次AD转换


/********************
*  模块结构体定义区 *
********************/


/********************
*   函 数 声 明 区  *
********************/


void System_INIT(void);
void Insert_Timer0_OVF_ISR_Code(void);


/********************
*   模块函数声明区  *
********************/


static void Driver_INIT(void);


/********************
*   模块变量声明区  *
********************/


/********************
*   全局变量声明区  *
********************/


BOOL IfGotADCValue = True;              //用于指示是否有ADC转换正在进行中的标志


/***********************************************************
*   函数说明:软件驱动初始化函数                           *
*   输入:    无                                           *
*   输出:    无                                           *
*   调用函数:无                                           *
***********************************************************/
static void Driver_INIT(void)
{
    //*在这里插入你的各类软件驱动初始化代码*//
}


/***********************************************************
*   函数说明:系统初始化函数                               *
*   输入:    无                                           *
*   输出:    无                                           *
*   调用函数:Device_INIT() Driver_INIT()                  *
***********************************************************/
void System_INIT(void)
{
    CLI();
   
    Device_INIT();
    Driver_INIT();
   
    //*在这里插入你的系统环境变量初始化代码*//
   
    SEI();
}


/***********************************************************
*   函数说明:定时器0中断处理程序代码插入函数              *
*   输入:    无                                           *
*   输出:    无                                           *
*   调用函数:无                                           *
***********************************************************/
void Insert_Timer0_OVF_ISR_Code (void)
{
    TCNT0 = 0xB2;                       //重新加载定时器0


    if (IfGotADCValue)                  //检查是否采样完成
    {
        IfGotADCValue = False;          //设置标志信号

  • 这里需要讲解一下信号同步的概念
                                            //同时需要说明,设置标志信号和启动ADC的顺序不能改变
            START_ADC;                      //1MS启动一次AD转换
        }
    }


    /***********************************************************
    *  函数说明:ADC采样完成中断处理程序                       *
    *  输入:    无                                            *
    *  输出:    无                                            *
    ***********************************************************/
    void Insert_Adc_ISR_Code(void)
    {
        unsigned int ADCValue = ADC;                        //获取ADC10位精度的采样结果
        unsigned char LoopCounter = 0,PORTValue = 0;
        unsigned int Aver_Volt;


        LoopCounter = ADCValue / 170;                       //转换为端口光柱显示


        Aver_Volt = Aver_Voltage(ADCValue);
        while(!(UCSR0A&(1<<UDRE0)));
        UDR0 = 50*Aver_Volt/1024;


        while(LoopCounter)
        {
            PORTValue |= 1<<(LoopCounter-1);
            LoopCounter--;
        }


        PORTB = PORTValue ^ 0xFF;                           //由于端口上的LED在低电平时点亮,为了适应习惯
                                                            //在这里对端口数据做了反相的处理
        IfGotADCValue = True;                               //设置采样完成标志
    }


     

  • PARTNER CONTENT

    文章评论0条评论)

    登录后参与讨论
    我要评论
    0
    3
    关闭 站长推荐上一条 /3 下一条