[KungFu8位 MCU]

KF8F ADC例程

[复制链接]
1041|5
手机看帖
扫描二维码
随时随地手机跟帖
原味_郭|  楼主 | 2017-5-26 15:38 | 显示全部楼层 |阅读模式
/****************************************************************************************
* KF8F系列单片机开发板演示程序
* 标    题: ADC转换采样
* 项目名: 02-ADC_TEST
* 开发环境: ChipON IDE
* 作    者:上海芯旺微电子技术有限公司
* 功能简述:  ADC转换采样,数码管显示采样得到的值(16进制显示) 按键key2可切换采样通道,同时P12指示通道
* 亮灯时指示P20口的AN8,否则指示P21口的AN7,跳线处LED相关的还需要J12的P20、P21、P26口以及J21的控制D4指示灯
****************************************************************************************/
#include<KF8F4156.h>
/*********************宏定义******************************/
#define uchar unsigned char
#define uint  unsigned int

#define        COM1         P0LR0
#define        COM2         P0LR1
#define        COM3         P0LR3
#define        COM4         P0LR4

#define SMG_A         P3LR0
#define SMG_B         P3LR1
#define SMG_C         P3LR2
#define SMG_D         P3LR3
#define SMG_E         P3LR4
#define SMG_F         P3LR5
#define SMG_G         P3LR6
#define SMG_P         P3LR7

#define Key2         P26
uint    KeyCount;
uchar   KeyState;
/*********************宏定义结束****************************/
/**************定义全局变量(注:为节省内存空间,全局变量尽量不要赋初值)*********/
uchar const Arr_num[] = {
                                                        0X3F,   // 0
                                                        0X06,        // 1
                                                        0X5B,        // 2
                                                        0X4F,        // 3
                                                        0X66,        // 4
                                                        0X6D,        // 5
                                                        0X7D,        // 6
                                                        0X07,        // 7
                                                        0X7F,        // 8
                                                        0X6F,        // 9
                                                        0X77,        // a
                                                        0X7C,        // b
                                                        0X58,        // c
                                                        0X5E,        // d
                                                        0X79,        // E
                                                        0X71,        // F
                                                        0X40,        // -
                                                        0X00,        // 空

};//共阴接法
uchar Unit, Decade, Hundred, Thousand;    //定义数码管的个十百千位
uchar com_temp;                                                          //查表结果
/***********************全局变量定义结束**************************************/
/*****************函数声明(注:中断和main函数不需声明)*************************/
void Init_fun();
void Delay_200us();
uint Adc_fun(void);
uint Adc_read(void);
void input_smg();
void Display();
/********************函数声明结束************************************/

/************************
* 函数名     :main
* 函数功能:程序入口主函数
* 入口参数:无
* 返回          :无
************************/

void main()
{
        uint Dis_adc = 0 ;                            //采样接收变量
        Unit = 0;
        Decade = 0;
        Hundred = 0;
        Thousand = 0;
        Init_fun();                                          //初始化
        P1LR2=1;                                                        // 默认指示采样通道AN8 亮灯
        while(1)
        {
                Dis_adc = Adc_read();           //将ADC采样返回值赋予Dis_adc

                Unit = Dis_adc&0x0f;            //将Dis_adc的最低4位赋予数码管的个位

                Decade = Dis_adc&0xf0;
                Decade >>= 4;                   //将Dis_adc的第7-4位赋予数码管的十位

                Dis_adc >>= 8;                  //右移8位,取Dis_adc的高8位
                Hundred = Dis_adc&0x0f;         //将此时的Dis_adc的最低4位赋予数码管的百位

                Thousand = Dis_adc&0xf0;
                Thousand >>= 4;                  //将此时的Dis_adc的第7-4位赋予数码管的千位

                Display();                       //显示
                //按键判断,切换通道
                if(Key2)
                {
                        KeyCount=0;
                }
                else
                {
                        if(KeyCount<2)
                        {
                                KeyCount++;
                                if(KeyCount==2 )
                                {
                                        if(KeyState)
                                        {
                                                ADCCTL0 = 0xA1; // P20 AN8
                                                KeyState=0;
                                                P1LR2=1;
                                        }
                                        else
                                        {
                                                ADCCTL0 = 0x9D; // P21 AN7
                                                KeyState=1;
                                                P1LR2=0;
                                        }
                                }
                        }
                }
        }
}

/************************
* 函数名     :Init_fun
* 函数功能:初始化函数
* 入口参数:无
* 返回          :无
************************/

void Init_fun()
{
        OSCCTL = 0x50;                     //设置为4M
/*********端口初始化***********/
        TR0 = 0x04;                                                 //P02仅输入 LED片选
        TR1 = 0x00;                                                 //设置P1端口为输出
        TR2 = 0x43;                                                 //P20 P21 AD输入  P26 key2输入
        TR3 = 0X00;                                                                 //LED 输出
        P0 = 0;
        P1 = 0;
        P2 = 0;
        P3 = 0;
        P0LR=0;
        P1LR=0;
        P2LR=0;
        P3LR=0x00;
        /****初始化AD寄存器****/
        ANSEH = 0x01;                              //设置通道AN8 P20为模拟口
        ANSEL = 0x80;                              //设置通道AN7 P21为模拟口

        ADCCTL1 = 0x94;                              //ad校准使能,8分频,VDD作为参考电压
        ADCCTL0 = 0xA1;                              //右对齐,通道8, AD使能打开
}
/************************
* 函数名     :Adc_fun
* 函数功能:ADC函数,模数转换
* 入口参数:无
* 返回          :返回ADC采样值
************************/
uint Adc_fun(void)
{
            uint Adc_num = 0 ;                          //ADC转换缓冲变量
            START = 1;                                          //启动ADC
                while(START);                 //等待转换结束
                Adc_num = ADCDATA0H;                    //将高位加进去
                Adc_num <<=8;
                Adc_num |= ADCDATA0L;                  //将低位加进去
                return Adc_num;                              //返回转换值
}
/************************
* 函数名     :Adc_read
* 函数功能:ADC求均值函数,adc读取函数
* 入口参数:无
* 返回          :返回ADC采样8次均值
************************/
uint Adc_read(void)
{
        uint Adc_sum = 0 ;                           //adc采样累加变量
        uchar i = 0;
        for(i = 0; i < 8; i++)
        {
                Adc_sum += Adc_fun();                  //累加八次采样值
        }
        Adc_sum+=4;                                           // 四舍五入
        Adc_sum >>= 3;                              //右移动3位  除8求均值
        return Adc_sum;
}
/************************
* 函数名     :Display
* 函数功能:数码管显示
* 入口参数:显示数字
* 返回          :无
************************/
void Display()
  {
        uchar i;
        for(i = 0; i < 10; i++)        // 控制显示的时长,计数速度控制
         {
            //打开数码管的 个位
                com_temp = Arr_num[Unit];
            input_smg();
            COM1 =0;
            COM2 =1;
            COM3 =1;
            COM4 =1;
            Delay_200us();
            COM1 =1;        //消隐
            COM2 =1;
            COM3 =1;
            COM4 =1;

            //打开数码管的 十位
            com_temp = Arr_num[Decade];
            input_smg();
            COM1 =1;
            COM2 =0;
            COM3 =1;
            COM4 =1;
            Delay_200us();
            COM1 =1;        //消隐
            COM2 =1;
            COM3 =1;
            COM4 =1;

            //打开数码管的 百位
            com_temp = Arr_num[Hundred];
            input_smg();
            COM1 =1;
            COM2 =1;
            COM3 =0;
            COM4 =1;
            Delay_200us();
            COM1 =1;        //消隐
            COM2 =1;
            COM3 =1;
            COM4 =1;

            //打开数码管的 千位
            com_temp = Arr_num[Thousand];
            input_smg();
            COM1 =1;
            COM2 =1;
            COM3 =1;
            COM4 =0;
            Delay_200us();
            COM1 =1;        //消隐
            COM2 =1;
            COM3 =1;
            COM4 =1;
            //结束当前,等待下次刷新
            Delay_200us();
        }
}
/************************
* 函数名     :input_smg
* 函数功能:将结果输出到对应IO口上
* 入口参数:无
* 返回          :无
************************/
void input_smg()                                //数码管段显
{
#if 1
        P3=com_temp;
#else
        if(com_temp&0x01)
        {
                SMG_A=1;
        }
        else
        {
                SMG_A=0;
        }
        if(com_temp&0x02)
        {
                SMG_B=1;
        }
        else
        {
                SMG_B=0;
        }
        if(com_temp&0x04)
        {
                SMG_C=1;
        }
        else
        {
                SMG_C=0;
        }
        if(com_temp&0x08)
        {
                SMG_D=1;
        }
        else
        {
                SMG_D=0;
        }
        if(com_temp&0x10)
        {
                SMG_E=1;
        }
        else
        {
                SMG_E=0;
        }
        if(com_temp&0x20)
        {
                SMG_F=1;
        }
        else
        {
                SMG_F=0;
        }
        if(com_temp&0x40)
        {
                SMG_G=1;
        }
        else
        {
                SMG_G=0;
        }
        if(com_temp&0x80)
        {
                SMG_P=1;
        }
        else
        {
                SMG_P=0;
        }
#endif
}
/************************
* 函数名     :Delay_200us
* 函数功能:短时间延时
* 入口参数:无
* 返回          :无
************************/
void Delay_200us()
{
//        uchar i = 60;
//        while(--i);
        uchar i = 250;
        while(--i);
        i = 250;
        while(--i);
}



原味_郭|  楼主 | 2017-5-26 15:40 | 显示全部楼层
01-TIME0_TSET.rar (78.19 KB)

使用特权

评论回复
会飞的大白| | 2017-5-30 10:28 | 显示全部楼层
AD的转换速度和频率可以达到多快呢?

使用特权

评论回复
nobleliom| | 2017-5-30 10:37 | 显示全部楼层
KF系列的AD有单独的中断,这个好,可以用来进行电量的检测。

使用特权

评论回复
wowu| | 2018-6-21 21:53 | 显示全部楼层
使用前需要校准吗

使用特权

评论回复
bboo| | 2018-6-27 10:02 | 显示全部楼层
转换精度如何

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

22

主题

224

帖子

1

粉丝