打印
[KungFu8位 MCU]

KF8V的ADC模数转换操作

[复制链接]
675|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
小明的同学|  楼主 | 2023-3-23 20:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/*************************************************************************************
* KF8V系列单片机开发板演示程序
* 标         题: ADC转换采样
* 项  目  名: 08-ADC_TEST
* 开发环境:ChipON IDE
* 版          本: V2.0 (2015/10/09)
* 使用芯片:KF8V216
* 作          者:上海芯旺微电子技术有限公司
* 功能简述: ADC转换采样,数码管显示采样得到的值
* 跳线接法:单片机的P00、P01 P04 P05(位选) P1口(段选)跳上跳线帽,单片机的P02端(模拟输入口)、 J14跳上跳线帽
* 如需下载程序,则需要把单片机的P03、VDD、VSS跳上跳线帽,并把P00、P01的跳线帽移除
*************************************************************************************/
#include<KF8V216.h>
/***************宏定义**********************/
#define uchar unsigned char
#define uint  unsigned int

#define         NUM1_IO        P0LR4
#define         NUM2_IO        P0LR5
#define         NUM3_IO        P0LR1
#define         NUM4_IO        P0LR0

/******************宏定义结束*****************/
/**************定义全局变量(注:为节省内存空间,全局变量尽量不要赋初值)*********/
uchar const Arr_num[] = {
                                        0xE7,                //                ;0
                                        0x06,                //                ;1
                                        0xB3,                //                ;2
                                        0x37,                //                ;3
                                        0x56,                //                ;4
                                        0x75,                //                ;5
                                        0xF5,                //                ;6
                                        0x07,                //                ;7
                                        0xF7,                //                ;8
                                        0x77,                //                ;9
                                        0xD7,                //                ;A
                                        0xF4,                //                ;B
                                        0xE1,                //                ;C
                                        0xB6,                //                ;D
                                        0xF1,                //                ;E
                                        0xD1,                //                ;F
                                        0X00                //                ;空
};                                        //定义数码管可以显示的0——f,共阴接法
uchar Unit, Decade, Hundred, Thousand;    //定义数码管的个十百千位

/***********************全局变量定义结束**************************************/
/*****************函数声明(注:中断和main函数不需声明)*************************/
void Init_fun();
void Delay_200us();
uint Adc_fun(void);
uint Adc_read(void);
void Display();
/********************函数声明结束************************************/

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

void main()
{
        uint Dis_adc = 0 ;                            //采样接收变量
        Init_fun();                                        //初始化
        Delay_200us();
        Dis_adc = 0x1111;
        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();                      //显示
        }
}

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

void Init_fun()
{
        OSCCTL = 0x60;                     //设置为8M
        /*****端口初始化*****/
        TR0 = 0x0C;                                           //设置P03端口为输入  P02为AN2模拟通道 配置为输入口
        TR1 = 0x00;                                           //设置P1端口为输出

        P0 = 0;
        P1 = 0;

        P0LR = 0;
        P1LR = 0;

        /****初始化AD寄存器****/
        ANSEL = 0x04;                              //设置通道2为模拟口
        ADCCTL0 = 0x89;                              //右对齐,通道2, AD使能打开
        ADCCTL1 = 0x17;                              //8分频,VDD作为参考电压
        PCTL = 0X00;                      //禁止中断优先级 IPEN = 0
}
/************************
* 函数名     :Adc_fun
* 函数功能:ADC函数,模数转换
* 入口参数:无
* 返回          :返回ADC采样值
************************/
uint Adc_fun(void)
{
            uint Adc_num = 0 ;                          //ADC转换缓冲变量
                START = 1;                                          //启动ADC
                while(START);                 //等待转换结束

/*************************************结果右对齐********************************************/
                Adc_num = ADCDATAH&0x0F;          //将高位加进去
                Adc_num <<= 8;                          //左移动8位高位归位
                Adc_num |= ADCDATAL;                  //将低位加进去
/*************************************结果右对齐********************************************/

                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 >>= 3;                              //右移动3位  除8求均值
        return Adc_sum;
}

/************************
* 函数名     :Display
* 函数功能:数码管显示
* 入口参数:显示数字
* 返回          :无
************************/
void Display()
{
        uchar i;
        for(i = 0; i < 50 ; i++)
         {
            NUM1_IO=0;
                P1LR=Arr_num[Unit];
                Delay_200us();
                P1LR=0;
                NUM1_IO=1;

                NUM2_IO=0;
                P1LR=Arr_num[Decade];
                Delay_200us();
                P1LR=0;
                NUM2_IO=1;

                NUM3_IO=0;
                P1LR=Arr_num[Hundred];
                Delay_200us();
                P1LR=0;
                NUM3_IO=1;

                NUM4_IO=0;
                P1LR=Arr_num[Thousand];
                Delay_200us();
                P1LR=0;
                NUM4_IO=1;
        }
}


/************************
* 函数名     :Delay_200us
* 函数功能:短时间延时
* 入口参数:无
* 返回          :无
************************/
void Delay_200us()
{
        uchar i = 60;
        while(--i);
}
//中断函数0:0X04入口地址
void int_fun0() __interrupt (0)
{

}


//中断函数1:0x14入口地址
void int_fun1() __interrupt (1)
{

}



使用特权

评论回复
沙发
幸福小强| | 2023-3-23 21:16 | 只看该作者
有点类似C51

使用特权

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

本版积分规则

139

主题

1443

帖子

2

粉丝