|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
! Y# s' ^, i# N* T
干簧管交叉排列,单片机读取电压值,自己实际标定之后转换为流量值# @' @0 [( `# D) U* s
单片机源程序:/ l+ }, s- I* m5 D) K& s2 B
#include "stc12c5a60s2.h") @3 v, ]$ j ~% Q/ M
#include "string.h" //字符串长度
* f0 H0 P9 n; g- y8 q6 s7 i#include "intrins.h" //_nop_或者移位操作0 F# i7 p1 O7 |+ V
#include "stdio.h"3 L" X, m' _8 v( P' a
#define ADC_PWR 0x80; ^8 G. ?$ o* C0 E
#define ADC_FLAG 0x10 # k/ @. m! ]/ {/ u
#define ADC_START 0x08+ w8 W$ {" d/ J9 e& Y
#define ADC_SPEEDA 0x60 //不同的值可以改变转换速度
" r- ?# Q2 ~3 \sbit LSA=P2^2;
- `& ]9 k( c* ^! Y! V! Osbit LSB=P2^3;
$ {; a7 w9 @, j& [) }/ j; Ysbit LSC=P2^4;, f" D1 D1 e; ]2 n5 A* o
sbit PWM=P2^0;
3 v+ W( N: J6 r% ^/ [3 _4 Rfloat AD_Result;//储存AD转换结果7 o4 G& B/ ^, q- v
#define uchar unsigned char- y1 {: K) I3 E( |0 t
#define uint unsigned int
7 q1 s7 }8 @( S6 }; h- B0 Guchar DisplayData[8];
0 Q" H! U! N% e; Yuchar code table[]={ //table[]里面无数字 ! h% l4 B# ]: Y" h; Y: ]; j! D
//共阳极代码0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,0x80, 0x90,4 d0 h+ K2 {* X1 ~
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07," d/ x2 S# m- Q4 }
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //后边带分号
/ L1 P" g& I" M+ q# n% Nvoid delayms(uint xms)+ s0 L8 ~8 T5 d3 R2 A$ m
{' z: O2 L. @" B* N" n
uint i,j;- J6 ?# Q! |) q; a3 G; F; A
for(i=xms;i>0;i--) //后无分号,i=xms 即延时约xms毫秒
) q0 y! Y9 O5 q3 K+ z ] for(j=110;j>0;j--);//有分号4 N3 V7 w1 ?7 u7 _1 M! p
}
- n0 Z2 v8 n. F. Q1 jvoid display(void)# [$ e7 @. \" h0 G. X
{4 W" a* s% g7 Z# ^- V4 T& I
unsigned char i;
: ?# [1 @; Y6 @% J! ]+ s! a. Q) F for(i=0; i<8; i++)- e# _6 R5 K1 m B
{
3 m% R# h$ o8 K$ O switch(i) //位选,选择点亮的数码管,
1 J* s9 k8 d2 g1 @* Z( y! z {: r( y" Z/ x7 N
case(0):5 f. \) d: A' E. _2 t4 M; F* C
LSA=0;LSB=0;LSC=0; break;//显示第0位4 h. O# a { s' ^$ h# a
case(1):
+ v% t$ b( ^4 b7 U! M( r, d LSA=1;LSB=0;LSC=0; break;//显示第1位
: s1 v% |4 F$ y0 ]" e. v case(2):) |4 Y; `, [9 l+ j
LSA=0;LSB=1;LSC=0; break;//显示第2位2 ]5 N. y; b1 A
case(3):
/ W: P' V1 }& r7 T1 a0 T) L1 j2 r6 l LSA=1;LSB=1;LSC=0; break;//显示第3位7 F, B, D$ s# q7 D; d( D; [
case(4):
) R# N$ n4 x; e V4 C: G8 ~# G$ w LSA=0;LSB=0;LSC=1; break;//显示第4位0 p" B/ y8 C9 d1 m }
case(5):
/ K0 F) n2 W& C+ u) U# P LSA=1;LSB=0;LSC=1; break;//显示第5位
; n+ s8 R/ s8 v# t! ] case(6):
1 c; O2 `5 r% X; y9 {# |- f& ?9 ] LSA=0;LSB=1;LSC=1; break;//显示第6位; b0 H* \1 R) e5 m0 E- W$ B
case(7):) i# J9 y6 m/ R* k' r* E
LSA=1;LSB=1;LSC=1; break;//显示第7位
' r9 s& U2 c/ J( i4 d9 c }' y* W& y$ j* A+ c6 V) Q
P0 = DisplayData;//发送段码, E! U. k2 a. n, Q# u1 {7 H1 Q, s
delayms(10); //扫描间隔时间设定4 q; o r6 L$ ]/ r" x, ^, d
LSA=1;LSB=0;LSC=1; //显示小数点$ \2 L8 z) C% Y* T+ s
P0 = 0x80;
- y4 J/ {1 v7 R% G delayms(10); //扫描间隔时间设定$ X4 M7 h9 N, E# Q
P0 = 0x00;//消隐 S9 z5 F& _3 P( A0 t' M# q
}
* Q/ l7 e9 k2 n //P0=table[keya];% k: n6 P) h$ V1 t9 k( Y5 D v
}5 U7 [ z2 k- ^! q' N
/*4 _ \; K; G' q; c' p
void send(uchar key_num)
8 c3 g+ ~9 v, L _: s7 B- D{
' r# q0 i. m: D7 y3 z2 t SBUF=key_num;% L2 h. a# |4 x% _- {
while(!TI);$ j: h% b' B( |7 t; }. [
TI=0;
8 @1 {, m' V& u; r t: c}
1 ~' E$ C0 c* q& q$ I*/
3 a2 k% B8 I! f1 M) ^6 d& xvoid Init_adc()3 j. k: @6 Z( D" ~ q% ?3 Z
{* ]+ Y! G `+ H3 J2 m
P1ASF=0xff; //P1口为使用AD转换做准备,A/D通道选择,所有的P1口作为转换接口 ,AD使用总开关
, ?2 }1 n) s9 o: B8 N7 j; N W ADC_RES=0; //清零AD转换结果寄存器高位4 h8 _& e2 L& i
ADC_RESL=0; //清零AD转换结果寄存器低位
& ]; u6 s: y& r- F- G) z1 U4 x3 R ADC_CONTR=ADC_PWR|ADC_START|ADC_SPEEDA;
8 l ^5 \8 ^# V7 s: Z; u8 Y$ _7 ] delayms(1);* C' ?9 P' V5 ?6 B8 @3 {; H# [
}3 ^* H! x4 t" R( u" }- W6 M
unsigned int AD_get(uchar channel)1 Y1 `* d3 ] Z D$ b7 o7 T
{
7 U, n- N* T a0 Y, E/ ^! s ADC_CONTR=ADC_PWR|ADC_START|ADC_SPEEDA|channel; //初始化ADC控制寄存器,(转换速度为90个时钟周期转换一次,模拟输入通道为通道1)
3 _1 q: n8 g. m: f6 _8 c _nop_(); //稳定ADC控制寄存器的值 变channel 值变模拟信号输入口
y" r+ f1 M# }/ i _nop_();8 F( k- v) ?$ Q8 j
_nop_();
- I% n- I5 C1 D' k3 \$ Y _nop_();; O( x% B( p Q% c0 ?- Y6 }& ]) \
while((ADC_FLAG&0x10)==0); //查询转换是否结束9 S( \! L: j3 A; A
ADC_CONTR &= 0xef; //清零ADC_FLAG位) f& y, R8 n; ^
//ADC_CONTR = ADC_CONTR & 0xef;
) I p) W0 d: ]/ S8 ~ return (ADC_RES*4+ADC_RESL); //返回转换结果 十位八位寄存器转换 ,去掉 ADC_RES*4则为八位
9 W' K& m& I' W}5 P6 b8 Z* \. J4 v* \
float AD_work(uchar channel) //计算结果
0 R; x t: o! S" J{
; n3 t3 U4 o3 H. q- K; O: O# Z0 R float AD_val;( ^* X% d. m7 j3 M
AD_val=(float)AD_get(channel);
) J3 M7 G. U7 Z C* j2 e AD_val=(AD_val*5)/1023; //1023对应5) E6 N; S' D1 R$ r2 M
return AD_val;" o0 i/ W2 M- _, e: [
}
# t$ G/ d8 b% D* k/ lmain()
2 U2 u. H5 ^ m/ i$ Q{
$ n6 S+ K- H+ `8 i3 `, d6 F9 M1 H TMOD=0x01;//定时器0工作方式1?* M, g0 W: b9 Y9 N( j+ ~2 D$ V
TH0=(65536-1000)/256;//赋初值定时
. @) V6 ?( F" K8 O/ z' S1 Y2 G TL0=(65536-1000)%256;//1ms
, N& }$ c2 R# b5 c& V* T// EA=1;//开总中断
) D% D& u Q% d, W- |. z# b8 @ ET0=1;//开定时器0中断8 M2 |% K) b i( I2 g6 z
TR0=1;//启动定时器09 d. }7 r% B( v1 m7 J; \
TMOD=0X20; //定时器1工作方式2
- j* n1 t( t- ^6 Y" q. X TH1 = 0Xfd; //设定初值; `( {. |8 M8 K) F
TL1=0xfd;
6 p9 ^# B8 h; _2 s. l TR1=1; //启动T1
. l) O5 i' F. X4 }( T7 \ SM0=0;- C7 I8 L$ S) A" i# t$ f& l( R9 P
SM1=1;; m$ B8 }- v) C; r2 J( S# I
EA=1;
3 p1 [3 |8 i( i ES=1;) Y( Q& M' B& {5 d o
P0=0xff;
+ G9 q) c. ~7 ^! k% C Init_adc();
0 ~- N0 G" f$ e0 r0 ^ //display();
6 [2 [3 `% K$ ?- j3 Y: `6 l
2 G4 a. Y$ a2 B# ^. t+ ~ while(1)! ?- ]$ O3 c+ \
{ ' T) J! ~ N( P/ P2 @/ S
AD_Result=AD_work(0);
0 v" |( D" L4 h; i) Z( p+ l AD_Result = AD_Result*100;
9 d0 J: s: u7 Y5 p6 \( r# x, \ //DisplayData[4]=DIG_CODE[AD_Result%10000/1000];
4 J$ H+ V+ N! w: C# a4 w DisplayData[5]=table[(int)AD_Result%1000/100];
8 R u. E3 G* i2 d u+ z) b2 n' W DisplayData[6]=table[(int)AD_Result%100/10];* M7 r7 a# k" }3 N8 _$ {
DisplayData[7]=table[(int)AD_Result%10/1];
3 Y$ \# {( C: k, I& g0 h display();- L1 [" N8 [0 e
// send(k); 6 i9 ?, [! T% S9 a$ Y
}
6 g) o* o2 R& d6 F1 t0 Z
, y5 |/ ^- ^5 O1 b+ o}9 H" O% W+ T$ e" R" u" i4 v: [
void tim0() interrupt 1
6 B4 W8 {1 b; l% x# s0 C8 x" s{
( i" v P! N2 r) A' s uchar time;& G7 r2 v- ?4 u/ O' H) u
TR0=0;//赋初值时,关闭定时器3 n# |- D2 e1 p7 `" x; l0 O7 |
TH0=(65536-922)/256;//赋初值定时- S+ x# U1 S$ f' f7 w6 q( O, E
TL0=(65536-922)%256;//定时1ms
/ n+ E; B: s. U" A- r$ b TR0=1;//打开定时器
2 [, ^" h- w O$ ]6 j. I5 J* Z" ~ time++;9 X" K4 ]( C" ], q6 O7 r
8 ], V% X( a7 k3 G$ C* p
if(time<=10)
+ Z: y1 V# Z" {( u% A3 @+ l3 C PWM=0;//占空比0.16 t; M4 `" W: [3 ~2 X& w u
else6 g; y$ n; l [! L* h$ i
PWM=1;8 o j! l! K, v- `! T" f6 K s$ B
if(time>=100)
4 l$ [" d# K0 v7 @/ d {
' |- h9 M& S5 A5 Q$ j PWM = 0;
+ K; [9 y0 E+ o6 P5 o& \5 M…………限于本文篇幅 余下代码请从论坛下载附件…………6 Y7 }9 C0 {0 Z8 |; n8 Z: q( W
7 x/ M6 C% S4 J' L: W4 o& R- e& f( c0 \+ r* m
) V6 y0 m& ~' `( {$ Z: J% l c' f
|
|