打印

ADC采样

[复制链接]
857|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ynwfzl|  楼主 | 2015-2-3 20:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include <pic.h>
#define uchar unsigned char
#define uint unsigned int
uchar LED_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf};//不带小数点的字型码
uchar LED_CODE1[]={0x40,0x79,0x24,0x30,0x19,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf};//带小数点的字型码
void delay(uchar x);
void init();
void display(uchar num1,uchar num2,uchar num3,uchar num4);
void beep();

uint get_ad()//整型带返回值子函数
{
        uint adval,ad;//定义两个无符号整型变量
        ADGO=1;//启动AD转换
        //while(ADGO);//查询AD转换是否完成,此行可以不用,程序一样运行正常
        //if(ADGO==1);//可以采用while查询也可以用if查询AD转换是否完成,此行一样可以不要
        //adval=ADRESH;//注释此行可以不要
        adval=ADRESH<<8|ADRESL;//ADRESH高8位数据左移8位,然后再与ADRESL低8位数据相加
        ad=adval*41;//这里的41是VDD电压,adval的值在0-1023之间,假设adval当前数字量是800,那么800*41=32800
        adval=ad/10;//因为我的是4位数码显示,将得到的32800除以10以后给数码管显示当前电压值即:3280(3.28V)
        return(adval);        //返回adval值给主程序调用的地方
       
}


void main()
{
        init();//程序初始化
        uint tempad;//定义临时整型变量
        uchar s1,s2,s3,s4;//定义4个无符号字符型变量
        while(1)
        {
        tempad=get_ad();//调用ad子程序
       
        s1=tempad/1000;//将得到的值3280除以1000取商丢去余数,所以s1的值是3(即千位)
        s2=tempad%1000/100;//3280除1000求余280再除以100取商,所以s2的值是2(取百位)
        s3=tempad%100/10;//3280除100求余80再除以10取商,所以s3的值是8(取十位)
        s4=tempad%10;//3280除10求余,余数是0(取个位)
        display(s1,s2,s3,s4);        //给数码管分别显示四位值
/////以下是判断ad采样的电压是否大于4v,大于或等于4v时led等亮/////
        if(s1>=4)//判断千位值
                {
                RA5=0;
                }
/////////////~~~~~~~~~~~~~~~~~~~~~~~~~~///////////////////////////////////
        }
}


void init()
{
        TRISA=0x01;//RA0设置为输入AN0(AD采集端口)
        TRISD=0;//D端口全部设置成输出
        PORTA=0x01;
        PORTD=0xFF;
        TRISE=0;
        PORTE=0;
        ADCON0=0x41;
        ADCON1=0x8e;
        delay(1);//延时5ms稳定AD采用
       
}       




void display(uchar num1,uchar num2,uchar num3,uchar num4)
{
        PORTD=LED_CODE[num4];//数码管个位显示值
        PORTA=0xfd;//1111 1101 开数码管个位位选
        delay(1);
        PORTD=LED_CODE[num3];//数码管十位显示值
        PORTA=0xfb;//1111 1011
        delay(1);
        PORTD=LED_CODE[num2];//数码管百位显示值
        PORTA=0xf7;//1111 0111
        delay(1);
        PORTD=LED_CODE1[num1];//数码管千位显示值(这个值是带小数点的)
        PORTA=0xef;
        delay(1);
}

void delay(uchar x)//5ms延时子函数
{
        uint y,k;
        for(y=0;y<x;y++)
                for(k=0;k<200;k++);
}

void beep()
{
        RE1=0;
        delay(20);
        RE1=1;
        delay(20);
}

相关帖子

沙发
xygyszb| | 2015-2-6 09:12 | 只看该作者
楼主此贴何意??

使用特权

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

本版积分规则

主题

帖子

粉丝