PIC单片机自学手记之ADC采样 采集 模数转换

//ADC采样实验//

#include

#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

for(k=0;k<200;k++);

}

void beep()

{

RE1=0;

delay(20);

RE1=1;

delay(20);

}

相关推荐
相关主题
热门推荐