楼主很厉害啊!对我很有用处! |
admin 发表于 2017-5-25 15:26 #include <reg51.H> #include "intrins.h" #define uint unsigned int #define uchar unsigned char //设置ADC0832的引脚 sbit ADCS =P2^0; //ADC0832 chip seclect sbit ADDI =P3^7; //K值输入端 sbit ADDO =P3^7; //K值输出端 sbit ADCLK =P3^6; //ADC0832 clock signal080307208 unsigned char dispbitcode[8]={0xf7,0xfb,0xfd,0xfe,0xef,0xdf,0xbf,0x7f}; //位扫描 unsigned char dispcode[11]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff}; //共阳数码管字段码 unsigned char dispbuf[4]; uint temp; uchar getdata; //获取ADC转换回来的值 void delay_1ms(void) //晶振10MHz,延迟1ms { unsigned char x,y; x=3; while(x--) { y=40; while(y--); } } void display(void) //数码管显示函数 { char k; for(k=0;k<4;k++) { P1 = dispbitcode[k]; P0 = dispcode[dispbuf[k]]; if(k==1) //加上数码管的dp小数点 P0&=0x7f; delay_1ms(); } } /************ 读ADC0832函数 ************/ //采集并返回 unsigned int Adc0832(unsigned char channel) //AD转换,返回结果 { uchar i=0; uchar j; uint dat=0; uchar ndat=0; if(channel==0)channel=2; if(channel==1)channel=3; ADDI=1; _nop_(); _nop_(); ADCS=0;//拉低CS端 _nop_(); _nop_(); ADCLK=1;//拉高CLK端 _nop_(); _nop_(); ADCLK=0;//拉低CLK端,形成下降沿1 _nop_(); _nop_(); ADCLK=1;//拉高CLK端 ADDI=channel&0x1; _nop_(); _nop_(); ADCLK=0;//拉低CLK端,形成下降沿2 _nop_(); _nop_(); ADCLK=1;//拉高CLK端 ADDI=(channel>>1)&0x1; _nop_(); _nop_(); ADCLK=0;//拉低CLK端,形成下降沿3 ADDI=1;//控制命令结束 _nop_(); _nop_(); dat=0; for(i=0;i<8;i++) { dat|=ADDO;//收数据 ADCLK=1; _nop_(); _nop_(); ADCLK=0;//形成一次时钟脉冲 _nop_(); _nop_(); dat<<=1; if(i==7)dat|=ADDO; } for(i=0;i<8;i++) { j=0; j=j|ADDO;//收数据 ADCLK=1; _nop_(); _nop_(); ADCLK=0;//形成一次时钟脉冲 _nop_(); _nop_(); j=j<<7; ndat=ndat|j; if(i<7)ndat>>=1; } ADCS=1;//拉低CS端 ADCLK=0;//拉低CLK端 ADDO=1;//拉高数据端,回到初始状态 dat<<=8; dat|=ndat; return(dat); //return ad } void main(void) { while(1) { unsigned int temp; float press; getdata=Adc0832(0); if(14<getdata<243) //当压力值介于15kpa到115kpa之间时,遵循线性变换 { int vary=getdata; //y=(115-15)/(243-13)*X+15kpa press=((10.0/23.0)*vary)+9.3; //测试时补偿值为9.3 temp=(int)(press*10); //放大10倍 dispbuf[3]=temp/1000; //取压力值百位 dispbuf[2]=(temp%1000)/100; //取压力值十位 dispbuf[1]=((temp%1000)%100)/10; //取压力值个位 dispbuf[0]=((temp%1000)%100)%10; //取压力值十分位 display(); } } } |
楼主能分享下源码吗? |