PIC18F4520单片机AD转换程序与注释

来源:互联网 发布:软件开发 等级 编辑:程序博客网 时间:2024/05/01 03:19

/*包含头文件:
该头文件位于D:\Program Files\Microchip\mplabc18\v3.40\h下,这下面是不同型号的单片机
的头文件定义,使用时把相应的头文件包含进来就可以了
*/
#include<p18f4520.h>
const unsigned char seg[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//共阴型数据管0-9的字段码,共阳的我没有写,用到时可以再改

/**************************************************************
功能:延时函数
参数:unsigned 16位数,取值范围0-65535
*/
void delay(unsigned  dly)
{
    unsigned char temp=200;
    for(;temp>0;temp--)
        for(;dly>0;dly--);
}
/*************************************************************
功能:片上AD转换器初始化设置函数
参数:无
说明:设置使用通道0进行AD转换,转换后的数据采用右对齐的格式
      ADCON1与ADCON2的设置的意义可参看芯片说明书
*/
void init_ad()
{
//  TRISA=0X07;//这个可以注释掉,没有用
    ADCON1=0X0C;
    ADCON2=0X94;
    ADCON0bits.ADON=1;
//    ADCON0bits.CHS0=0;//可通过位设置来选择AD转换通道
//    ADCON0bits.CHS1=0;
//    ADCON0bits.CHS2=0;
    ADCON0bits.CHS=1;//也可以使用CHS来设置AD转换的通道,当然也可以同进进行多路AD转化
                     //只需要简单地修改get_result函数即可。
}
/*************************************************************
功能:获取AD转换结果函数
参数:返回16位转换结果数据--只有低10位是有效的转换数据
*/
unsigned int get_result()
{
    unsigned int dat=0;
    ADCON0bits.GO_DONE=1;
    while(ADCON0bits.GO_DONE);
    PIR1bits.ADIF=0;
    dat=ADRESH;
    dat=dat<<8;
    dat =dat+ADRESL;
    return dat;
}

 

/*************************************************************
功能:数码管显示函数
参数:无符号型char
说明:参数为i*5/1024 *10,显示时程序自动在第一个数码管后加了个小数点,所以传入的参数
      会乘以10,如些做是为了方便显示数据
*/
void disp_num(unsigned char tmp)
{
    unsigned char i=0;
/*如果在实物电路板中使用时,当发生数据码显示亮度不合适时,可以修改for循环中的i<**,
增大或减小**;或者修改for循环过程中调用的delay函数的参数,调整延时时间
*/
    for(i=0;i<30;i++)
    {
        PORTCbits.RC0=0;
        PORTD=seg[tmp%10];
        delay(100);
        PORTCbits.RC0=1;

        PORTCbits.RC1=0;
        PORTD=seg[tmp/10]|0x80;
        delay(100);
        PORTCbits.RC1=1;

    }
}
/*******************************************************************
功能:数码管引脚初始化函数
参数:无
说明:仿真中使用的数码管为共阴型,使用单片机的D口作为段码,使用C口的0,1位作为位选码
*/
void init_num()
{
    TRISD=0x00;
    TRISCbits.TRISC0=0;
    TRISCbits.TRISC1=0;
    PORTCbits.RC0=1;
    PORTCbits.RC1=1;
}
/*main函数*/
int main()
{
    unsigned int tmp=0;
    unsigned char i=0;
    init_num();
    init_ad();
    while(1)
    {
       
        tmp=get_result();
        disp_num(tmp*50/1024);
/*
关于上面disp_num函数的参数的说明:
可定义一个1024个元素的数组,然后把i*50/1024取整后对号放到这
个数组中,然后通过查表来得到欲显示的数据,这样可以减少单片机的运算时间,
同时显示误差更小,但是会增大存储空间的开销。
当然也可以增加数据管的位数,比如使用4个数码管来显示,但程序需要小做修改。
*/
    }
    return 0;
}

原创粉丝点击