![]() |
樓主很厲害啊!對我很有用處! |
admin 發(fā)表于 2017-5-25 15:26 #include <reg51.H> #include "intrins.h" #define uint unsigned int #define uchar unsigned char //設(shè)置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}; //共陽數(shù)碼管字段碼 unsigned char dispbuf[4]; uint temp; uchar getdata; //獲取ADC轉(zhuǎn)換回來的值 void delay_1ms(void) //晶振10MHz,延遲1ms { unsigned char x,y; x=3; while(x--) { y=40; while(y--); } } void display(void) //數(shù)碼管顯示函數(shù) { char k; for(k=0;k<4;k++) { P1 = dispbitcode[k]; P0 = dispcode[dispbuf[k]]; if(k==1) //加上數(shù)碼管的dp小數(shù)點 P0&=0x7f; delay_1ms(); } } /************ 讀ADC0832函數(shù) ************/ //采集并返回 unsigned int Adc0832(unsigned char channel) //AD轉(zhuǎn)換,返回結(jié)果 { 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;//控制命令結(jié)束 _nop_(); _nop_(); dat=0; for(i=0;i<8;i++) { dat|=ADDO;//收數(shù)據(jù) 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;//收數(shù)據(jù) 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;//拉高數(shù)據(jù)端,回到初始狀態(tài) 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(); } } } |
樓主能分享下源碼嗎? |
Powered by 單片機教程網(wǎng)