|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
, @& J4 T7 e% n% ^ b& q$ I
干簧管交叉排列,单片机读取电压值,自己实际标定之后转换为流量值$ e* I+ k0 P- A' u: M* {
单片机源程序:
2 c+ j- T Q; V* V; d% K#include "stc12c5a60s2.h"
5 I( ~) M# u& Y$ v9 b# J% l; ]5 H#include "string.h" //字符串长度
: z5 \' h$ y' ~4 D$ x( j( ?#include "intrins.h" //_nop_或者移位操作+ N0 C. i( N @- }
#include "stdio.h"+ a8 V1 o6 G( N V; V
#define ADC_PWR 0x80% e2 |2 r% b/ T1 |
#define ADC_FLAG 0x10
# w, A& l! S* M8 @#define ADC_START 0x08
0 D5 c( Y9 b0 J' J9 P#define ADC_SPEEDA 0x60 //不同的值可以改变转换速度
2 x& ]: ]7 M/ T* F) J3 D& z3 x6 zsbit LSA=P2^2;
* c, f: M/ S1 I% P. bsbit LSB=P2^3;: O* j) l" [! G0 d+ H, G9 ^
sbit LSC=P2^4;
) X6 O+ f l/ C5 X' ]sbit PWM=P2^0;
& \+ V7 S8 G" r! O# Sfloat AD_Result;//储存AD转换结果
0 Y3 ~8 m8 i! ^5 v/ Y#define uchar unsigned char8 s* R! Y- ^" J% | d# G' v/ Z# z
#define uint unsigned int
; X' E( I3 y. ?) T, |uchar DisplayData[8];
4 h9 F( m3 i* Uuchar code table[]={ //table[]里面无数字 1 Z5 n9 m$ s# i
//共阳极代码0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,0x80, 0x90,4 U* b% P$ W! d# _- v1 O
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
# O9 {/ d$ \ e7 M! g 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //后边带分号
" b1 h2 K) t4 ^; A" r$ e6 t, G# Zvoid delayms(uint xms)! R/ M# M1 q- _
{6 Y: w) o3 n* E2 q
uint i,j;( r& L1 l- d- X) F% T! X2 K
for(i=xms;i>0;i--) //后无分号,i=xms 即延时约xms毫秒
8 B% _$ [+ s/ ^/ ~% a | for(j=110;j>0;j--);//有分号6 B# e/ Q0 P) h% y" R) ~
}5 Z G1 b) q! l! J7 O
void display(void) j$ v! E: Q4 X- V n. S' A
{
5 M* r+ X! _6 s* P unsigned char i;! n$ L5 X' u9 W6 K1 t1 }$ Z5 k
for(i=0; i<8; i++): W6 q6 h- z* R9 f, n/ R
{( e0 F3 G" L$ ?7 c! S
switch(i) //位选,选择点亮的数码管,- `4 s6 r% x4 i k( H
{
/ g* h1 I" ]- [1 n case(0):
' t. I3 }$ X3 M* Q LSA=0;LSB=0;LSC=0; break;//显示第0位" t5 g4 U! ~ A
case(1):" x* d }2 s; d$ d' r
LSA=1;LSB=0;LSC=0; break;//显示第1位2 j0 k2 ?/ _: C2 ~1 }' M
case(2):
$ P2 N. Y$ F5 j5 j* {4 q LSA=0;LSB=1;LSC=0; break;//显示第2位
5 Y5 ?% |/ }+ U. g3 h case(3):" \: h% H3 K/ I1 N/ Y
LSA=1;LSB=1;LSC=0; break;//显示第3位 U9 q( G, L4 h/ D* f1 \
case(4):; g1 u; o5 T/ l9 |0 C$ b+ I
LSA=0;LSB=0;LSC=1; break;//显示第4位" k- K/ h- n' G, v' i& K
case(5):0 ]+ {0 }3 b& W& D/ [8 E5 ~( p& s9 c7 m
LSA=1;LSB=0;LSC=1; break;//显示第5位) R3 F$ W7 P5 R2 S! v3 v
case(6):! T5 Y. w4 F Z; p
LSA=0;LSB=1;LSC=1; break;//显示第6位
2 q2 x& e* ~ G) ]% O% x' L8 w case(7):
% l1 w* ]6 V2 V* @8 K LSA=1;LSB=1;LSC=1; break;//显示第7位 & f6 x# h+ s$ L# D
}
/ V5 L1 J1 R; p) H3 b" s P0 = DisplayData;//发送段码
. N4 V" h X- b, }0 t* D+ ] delayms(10); //扫描间隔时间设定* q0 @& J1 \% ?5 P, r
LSA=1;LSB=0;LSC=1; //显示小数点& d' d! B, A1 ]* |; C. x
P0 = 0x80;
# J/ ~# i+ }! f+ K# \3 y delayms(10); //扫描间隔时间设定; _) i5 Y0 M0 P; Y; J' B3 Y0 ?
P0 = 0x00;//消隐
5 H( f0 ]6 Z0 y- b }. X1 Z7 v& c! ^0 u5 f
//P0=table[keya];# \0 H8 K/ z) a* a8 K2 k
}
$ v; j: |- R! n3 c9 z/*
% G1 \ E/ k2 U1 H- T' t6 \/ [void send(uchar key_num)" D9 E: W! \2 @
{
( a6 A. M) _! t( g/ A0 n SBUF=key_num;
5 M% H4 {9 z, P/ T: T7 M, r while(!TI);
& @# p$ g8 {: c% W4 A, w) ` TI=0;
3 B5 M1 ~3 M6 G0 n8 H7 `7 N}
1 i, |# i9 h0 q# z*/
8 L4 o9 U* N6 J( ^void Init_adc()' o3 y9 s" V/ c2 z
{* w, }: V$ r# ^' u& q- \, ^
P1ASF=0xff; //P1口为使用AD转换做准备,A/D通道选择,所有的P1口作为转换接口 ,AD使用总开关' q, ~( y2 h7 O0 ], |0 m4 d# n) D
ADC_RES=0; //清零AD转换结果寄存器高位) i: V6 b& B- @/ U$ s
ADC_RESL=0; //清零AD转换结果寄存器低位
' e \6 I- k& ^ ADC_CONTR=ADC_PWR|ADC_START|ADC_SPEEDA;9 b7 g4 x2 U1 N: A2 D
delayms(1);
. K, i o6 ]4 g/ F}, J0 d N& y; @5 O j) p) y* k
unsigned int AD_get(uchar channel)
# w! D" c, d) l( n4 _{! L0 c0 Q. C. m9 ~/ s4 @% C
ADC_CONTR=ADC_PWR|ADC_START|ADC_SPEEDA|channel; //初始化ADC控制寄存器,(转换速度为90个时钟周期转换一次,模拟输入通道为通道1)% _" M6 r T8 U
_nop_(); //稳定ADC控制寄存器的值 变channel 值变模拟信号输入口
& i, _4 ]! ~+ ] _nop_(); o9 i8 ?: w2 ?8 q3 p7 C2 j3 H
_nop_(); ?- b. ]7 X! ~
_nop_();
3 W/ L. B% ]+ |3 o" e while((ADC_FLAG&0x10)==0); //查询转换是否结束
( _2 ?7 R1 G6 M# j8 X ADC_CONTR &= 0xef; //清零ADC_FLAG位
, X* n2 E. I; x //ADC_CONTR = ADC_CONTR & 0xef;
7 B7 o. |' D3 f$ Q! q5 n$ R% ?0 c% f5 | return (ADC_RES*4+ADC_RESL); //返回转换结果 十位八位寄存器转换 ,去掉 ADC_RES*4则为八位
7 l3 ]" i) P( }}
1 g) n [# j( }* C( e: ffloat AD_work(uchar channel) //计算结果' q; D6 t4 F# U0 W8 P
{+ x; }; ]6 x* i2 N4 z8 W
float AD_val;& G: t$ z+ ?- t. S" M" Y% u
AD_val=(float)AD_get(channel);% D$ x1 i$ f! k- N& j
AD_val=(AD_val*5)/1023; //1023对应5
, _: y$ U" D* M' |" L0 T. A% o return AD_val;2 D& @! U# [3 `7 G% @
}
! m1 c, t* L( l- ^7 zmain()
! p; J& n: R! g. v2 E{( L( h& a9 O, W& |3 F
TMOD=0x01;//定时器0工作方式1?9 E8 C/ p. w2 v, m0 n. y
TH0=(65536-1000)/256;//赋初值定时
- U9 b0 h' s1 e7 E1 N8 d TL0=(65536-1000)%256;//1ms
0 y2 R" _" l, P8 {. I// EA=1;//开总中断
! A4 K( z7 ]! H' v% U5 w ET0=1;//开定时器0中断
; ~8 B+ G. A" F: |4 T TR0=1;//启动定时器0
2 P& G0 m3 [0 h) m4 R TMOD=0X20; //定时器1工作方式24 H( u8 F, n- T/ u( \
TH1 = 0Xfd; //设定初值
, ^- V/ [- ?, i" P) u K% ~0 v TL1=0xfd;* ?: I! g$ e' c1 c" i8 y# `
TR1=1; //启动T1
3 d; q8 q; t f, b SM0=0;7 q! x! F5 x p" J/ \
SM1=1;7 Y5 {8 x& @: R. N+ T3 P
EA=1;& K# V! u7 w# u: P& Z3 X* \
ES=1;4 j+ T; s( A7 _! A5 F& b
P0=0xff;0 ]* ?$ o- F' U1 v: N2 M! G
Init_adc();
9 P& S( v& N: U8 c0 x. E; P2 e //display(); g$ m2 h+ U' S
7 g/ S" h# { E% C/ E+ |' `
while(1); z# }2 A. p8 b( J
{
! |" V8 u0 p8 ^ i8 P AD_Result=AD_work(0); & N& r0 X4 q+ ]
AD_Result = AD_Result*100;
, t' p5 a! U# ]& w) S //DisplayData[4]=DIG_CODE[AD_Result%10000/1000];4 S; v* }: W# O( y4 E% d" x1 J
DisplayData[5]=table[(int)AD_Result%1000/100];
1 ^3 J) V9 g3 V3 N DisplayData[6]=table[(int)AD_Result%100/10];
I, w2 u q5 x* k& R+ _ DisplayData[7]=table[(int)AD_Result%10/1];
7 R; t4 y5 A) h" D5 Y2 @6 L display();
' L/ A* k) g, k' {// send(k);
5 o# V0 g Y# Q$ D5 ^& B5 i }
# W1 z/ m/ d& }4 w3 Y3 x+ X$ l4 D, b7 }
}2 V0 D7 X7 d+ _+ |' [ Q' Z
void tim0() interrupt 1
. @/ k# n0 ~4 Q{
3 E* o+ g1 a8 L, W uchar time;
3 ~0 q# z6 G( h8 `3 f1 X& P TR0=0;//赋初值时,关闭定时器: o$ ^2 I1 s0 m |7 M
TH0=(65536-922)/256;//赋初值定时
' g0 @3 K* E) F. \0 Q2 ?8 L0 Q TL0=(65536-922)%256;//定时1ms
]( @+ Z; T: Q0 U/ \+ ~: d4 H TR0=1;//打开定时器. v- x7 ^3 F9 T5 l# T+ h
time++;+ i( P. O* P" F" L" q8 s \+ ?6 h* ]) v
$ b5 M) q8 F) A
if(time<=10), p5 i/ u# e% G& m4 T1 N
PWM=0;//占空比0.15 E. Q% C, N e3 K
else
1 ~+ A- E' P; _8 P PWM=1;+ Q' }% ^9 Y0 b) {: r2 ~" ^
if(time>=100)# c8 h" ]9 j0 S# a( @/ \! X4 i2 Q
{
* Z4 E8 C2 z; g, e) H7 D, k- ? PWM = 0;
) r- H. M2 c ?4 t- n…………限于本文篇幅 余下代码请从论坛下载附件…………
+ }: K/ q* E. [+ e/ c0 ^9 @8 U! [2 s5 C
g( P& P1 z& j |
|