首页资源分类嵌入式处理器PIC > PIC单片机AD采样数码管显示源程序

PIC单片机AD采样数码管显示源程序

已有 445005个资源

下载专区

文档信息举报收藏

标    签:AD源程序

分    享:

文档简介

PIC单片机AD采样数码管显示源程序

文档预览

#include #include int x,m,n,i,j,k,l,a,q,v,u0,u1; union adres { int y; unsigned char adre[2]; }adresult;//定义一个共同体 用来存放AD转换结果 int re[40]; double squ,squad; const char table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};//共阴数码管带小数点显示 static char table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0X07,0x7f,0x6f};//共阴数码管不带小数点显示 void set(void) { TRISC=0x00; //RC口归零 TRISB=0x00; //RD口归零 INTCON=0x00; //关闭所有中断 SSPCON=0x30; // 0011 0000, 1 = 使能串口并将SCK、SDO、SDI 和SS 配置为串口引脚,1 = 空闲状态时,时钟为高电平 // 0000 = SPI 主控模式,时钟 = FOSC/4 SSPSTAT=0xc0; //1100 0000 1 = 在数据输出时间的末端采样输入数据,1 = 当时钟从有效状态转换到空闲状态时开始发送 //00 000为I2C状态下使用,00 = 接收未完成, SSPBUF 空 } void adset(void) //AD转换初始化 { ADCON0=0x41; //ad通道为RA0,转换时钟FOSC/8 ADCON1=0x8e; //右对齐,采用单片机内部电源电压为参考电压 TRISA=0x01; //打开RA0为输入状态 } void delay1(void) { for(q=0;q<=160;q++) { Nop(); } } void delay(int n) { int m; for(;n>=0;n--) { for(m=0;m<=50;m++) continue; } } void display1(void) { i=u1/1000%10; j=u1/100%10; v=u1/10%10; l=u1%10; PIR1=0x00; //清除SPI中断标志 PORTC=0x01; SSPBUF=table[i]; do{ ; }while(PIR1bits.SSPIF==1); //没有产生MSSP 中断条件 PIR1bits.SSPIF=1; delay(1); PORTC=0x08; SSPBUF=table[l]; do{ ; }while(PIR1bits.SSPIF==0); //0 = 等待发送/ 接收 PIR1bits.SSPIF=0; delay(1); PORTC=0x04; SSPBUF=table1[v]; do{ ; }while(PIR1bits.SSPIF==0); PIR1bits.SSPIF=0; delay(1); PORTC=0x02; SSPBUF=table[j]; do{ ; }while(PIR1bits.SSPIF==0); PIR1bits.SSPIF=0; delay(1); } void main(void) { adset(); set(); while(1){ k=0; //AD转换的结果从re[0]开始存入数组,一共存40个 squad=0; do { PIR1bits.ADIF=0; GODONE=1; do{ ; }while(GODONE==1); adresult.adre[0]=ADRESL; adresult.adre[1]=ADRESH; re[k]=adresult.y; k++; Nop(); Nop(); Nop(); Nop(); Nop(); Nop(); Nop(); Nop(); Nop(); Nop(); Nop(); delay1(); }while(k<40); display1(); for(k=0;k<40;k++) {re[k]=re[k]-0x200;}//减去基准值 for(k=0;k<40;k++) { u0=re[k]; squ=(double)u0; //强制把数据换成双精度 squ=squ*5/1024; //参考电压5v 10位转换精度 squ=squ*squ; squad=squad+squ; //将40个转换结果算成平方和 } squ=squad/40; squ=sqrt(squ);//求出40个点的均方根值 squ=squ*400;//根据限流电路,放大电路确定系数,求得实际电压值 squ=squ*10; //保证显示精度 //if(squ<=100)squ=0; u1=(int)squ; //强制把数据转换成整型 display1(); } }

Top_arrow
回到顶部
EEWORLD下载中心所有资源均来自网友分享,如有侵权,请发送举报邮件到客服邮箱bbs_service@eeworld.com.cn 或通过站内短信息或QQ:273568022联系管理员 高员外,我们会尽快处理。