|
干簧管交叉排列,單片機讀取電壓值,自己實際標定之后轉(zhuǎn)換為流量值
0.png (50.31 KB, 下載次數(shù): 34)
下載附件
2017-5-8 22:36 上傳
單片機源程序:
- #include "stc12c5a60s2.h"
- #include "string.h" //字符串長度
- #include "intrins.h" //_nop_或者移位操作
- #include "stdio.h"
- #define ADC_PWR 0x80
- #define ADC_FLAG 0x10
- #define ADC_START 0x08
- #define ADC_SPEEDA 0x60 //不同的值可以改變轉(zhuǎn)換速度
- sbit LSA=P2^2;
- sbit LSB=P2^3;
- sbit LSC=P2^4;
- sbit PWM=P2^0;
- float AD_Result;//儲存AD轉(zhuǎn)換結(jié)果
- #define uchar unsigned char
- #define uint unsigned int
- uchar DisplayData[8];
- uchar code table[]={ //table[]里面無數(shù)字
- //共陽極代碼0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,0x80, 0x90,
- 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
- 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //后邊帶分號
- void delayms(uint xms)
- {
- uint i,j;
- for(i=xms;i>0;i--) //后無分號,i=xms 即延時約xms毫秒
- for(j=110;j>0;j--);//有分號
- }
- void display(void)
- {
- unsigned char i;
- for(i=0; i<8; i++)
- {
- switch(i) //位選,選擇點亮的數(shù)碼管,
- {
- case(0):
- LSA=0;LSB=0;LSC=0; break;//顯示第0位
- case(1):
- LSA=1;LSB=0;LSC=0; break;//顯示第1位
- case(2):
- LSA=0;LSB=1;LSC=0; break;//顯示第2位
- case(3):
- LSA=1;LSB=1;LSC=0; break;//顯示第3位
- case(4):
- LSA=0;LSB=0;LSC=1; break;//顯示第4位
- case(5):
- LSA=1;LSB=0;LSC=1; break;//顯示第5位
- case(6):
- LSA=0;LSB=1;LSC=1; break;//顯示第6位
- case(7):
- LSA=1;LSB=1;LSC=1; break;//顯示第7位
- }
- P0 = DisplayData[i];//發(fā)送段碼
- delayms(10); //掃描間隔時間設定
- LSA=1;LSB=0;LSC=1; //顯示小數(shù)點
- P0 = 0x80;
- delayms(10); //掃描間隔時間設定
- P0 = 0x00;//消隱
- }
- //P0=table[keya];
- }
- /*
- void send(uchar key_num)
- {
- SBUF=key_num;
- while(!TI);
- TI=0;
- }
- */
- void Init_adc()
- {
- P1ASF=0xff; //P1口為使用AD轉(zhuǎn)換做準備,A/D通道選擇,所有的P1口作為轉(zhuǎn)換接口 ,AD使用總開關(guān)
- ADC_RES=0; //清零AD轉(zhuǎn)換結(jié)果寄存器高位
- ADC_RESL=0; //清零AD轉(zhuǎn)換結(jié)果寄存器低位
- ADC_CONTR=ADC_PWR|ADC_START|ADC_SPEEDA;
- delayms(1);
- }
- unsigned int AD_get(uchar channel)
- {
- ADC_CONTR=ADC_PWR|ADC_START|ADC_SPEEDA|channel; //初始化ADC控制寄存器,(轉(zhuǎn)換速度為90個時鐘周期轉(zhuǎn)換一次,模擬輸入通道為通道1)
- _nop_(); //穩(wěn)定ADC控制寄存器的值 變channel 值變模擬信號輸入口
- _nop_();
- _nop_();
- _nop_();
- while((ADC_FLAG&0x10)==0); //查詢轉(zhuǎn)換是否結(jié)束
- ADC_CONTR &= 0xef; //清零ADC_FLAG位
- //ADC_CONTR = ADC_CONTR & 0xef;
- return (ADC_RES*4+ADC_RESL); //返回轉(zhuǎn)換結(jié)果 十位八位寄存器轉(zhuǎn)換 ,去掉 ADC_RES*4則為八位
- }
- float AD_work(uchar channel) //計算結(jié)果
- {
- float AD_val;
- AD_val=(float)AD_get(channel);
- AD_val=(AD_val*5)/1023; //1023對應5
- return AD_val;
- }
- main()
- {
- TMOD=0x01;//定時器0工作方式1?
- TH0=(65536-1000)/256;//賦初值定時
- TL0=(65536-1000)%256;//1ms
- // EA=1;//開總中斷
- ET0=1;//開定時器0中斷
- TR0=1;//啟動定時器0
- TMOD=0X20; //定時器1工作方式2
- TH1 = 0Xfd; //設定初值
- TL1=0xfd;
- TR1=1; //啟動T1
- SM0=0;
- SM1=1;
- EA=1;
- ES=1;
- P0=0xff;
- Init_adc();
- //display();
-
- while(1)
- {
- AD_Result=AD_work(0);
- AD_Result = AD_Result*100;
- //DisplayData[4]=DIG_CODE[AD_Result%10000/1000];
- DisplayData[5]=table[(int)AD_Result%1000/100];
- DisplayData[6]=table[(int)AD_Result%100/10];
- DisplayData[7]=table[(int)AD_Result%10/1];
- display();
- // send(k);
- }
- }
- void tim0() interrupt 1
- {
- uchar time;
- TR0=0;//賦初值時,關(guān)閉定時器
- TH0=(65536-922)/256;//賦初值定時
- TL0=(65536-922)%256;//定時1ms
- TR0=1;//打開定時器
- time++;
-
- if(time<=10)
- PWM=0;//占空比0.1
- else
- PWM=1;
- if(time>=100)
- {
- PWM = 0;
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
完整資料下載:
數(shù)據(jù)讀取顯示.zip
(33.29 KB, 下載次數(shù): 28)
2017-5-8 22:19 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|
|