|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
b# x; X# N7 J t
干簧管交叉排列,单片机读取电压值,自己实际标定之后转换为流量值5 I# n$ m5 s, R- x) c; J" u6 Q8 `
单片机源程序:) M# n: \7 Z. B& e. A
#include "stc12c5a60s2.h"4 p7 |! q+ w/ O" [9 t& f/ Y
#include "string.h" //字符串长度( e3 b# N: B7 b6 S
#include "intrins.h" //_nop_或者移位操作. P& l5 _+ r/ I! B, \# v* }' u
#include "stdio.h") p* L, d! F0 R
#define ADC_PWR 0x80" ]4 v; C$ g% f2 {0 Z1 r* v
#define ADC_FLAG 0x10
* W" o G* C q1 a#define ADC_START 0x08
, W0 x; [3 k1 A% V- T2 c2 E2 _#define ADC_SPEEDA 0x60 //不同的值可以改变转换速度
2 }* D2 d8 U% Q0 |9 Msbit LSA=P2^2;
8 x, e, o$ P) P+ A' ^! Isbit LSB=P2^3;0 x! n3 S) f/ w! j! ~, i
sbit LSC=P2^4;: v$ v* V' ^+ `" b) ~* `$ x; D
sbit PWM=P2^0;4 R! H3 }( b. h7 |7 L
float AD_Result;//储存AD转换结果/ V' y* H. I& n! \
#define uchar unsigned char0 Q- m' g. M% ?; n' {& f
#define uint unsigned int6 e6 Z9 d, T: b3 z0 s, q
uchar DisplayData[8];
7 Z+ G% A* i0 z0 euchar code table[]={ //table[]里面无数字
T% [) _# S9 |/ R1 d6 v//共阳极代码0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,0x80, 0x90,- z+ B9 Y" I: a2 H. k
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, w% V) u) v; O$ E z9 M( v! c
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //后边带分号1 ]2 V/ V! L1 L/ ^7 a
void delayms(uint xms)
/ p9 c$ r. t" O/ S% T{
# F2 S9 ?4 \% k9 n" J( }, N uint i,j;
0 g" z0 O4 X' F for(i=xms;i>0;i--) //后无分号,i=xms 即延时约xms毫秒' B7 \ q) a4 k- I. j
for(j=110;j>0;j--);//有分号; V U4 @2 u0 \5 L. U
}9 f4 o7 s% U( C* w1 y
void display(void)
$ G% ]9 ?1 \. V* o! q4 X0 j4 _{
0 J, G/ }5 N; {6 P2 q3 T! }. e unsigned char i;
$ {; o1 U6 I6 L for(i=0; i<8; i++)
) j7 F5 ?7 w; s) O1 b/ K {
8 l) r$ S i! Z3 D# f* S' B4 Q switch(i) //位选,选择点亮的数码管,
8 g" h; i5 N; B: V" z5 E {
+ |3 k2 ?/ D' z: P case(0):
* w. S; m, U; I! T LSA=0;LSB=0;LSC=0; break;//显示第0位
- v8 p: ^0 C k& w g& x case(1):3 Z+ w& x, g0 w9 o3 F
LSA=1;LSB=0;LSC=0; break;//显示第1位
4 g) U! F' E7 i case(2):/ a) i" ~2 F$ V( D# i( b
LSA=0;LSB=1;LSC=0; break;//显示第2位. C# {. s3 _$ E [: }
case(3):! y8 o0 C* P+ k" p2 _- J9 p, j
LSA=1;LSB=1;LSC=0; break;//显示第3位4 K* x% P! A( d. `8 S: M0 a. m% \) U
case(4):
. G& B5 Y$ q7 x LSA=0;LSB=0;LSC=1; break;//显示第4位
: K& H! }* S0 m9 U. p3 L! O case(5): `1 s3 m4 L: O- }1 s% y, s: [! q# Y7 [
LSA=1;LSB=0;LSC=1; break;//显示第5位
( [2 {7 j8 J: X, ?4 N) K case(6):
. `. R" v* s) I$ W9 X LSA=0;LSB=1;LSC=1; break;//显示第6位
4 J4 C8 n" `; v: d7 g6 a# { case(7):
8 h8 i* v4 u! \. j" Q' ~- U$ ^ LSA=1;LSB=1;LSC=1; break;//显示第7位
* X" @/ n+ r6 f. W2 D }
0 y4 c) Q7 y6 [$ N P0 = DisplayData;//发送段码
7 g! q7 ^" \5 T5 r9 o delayms(10); //扫描间隔时间设定4 I8 {' r' M6 W* J
LSA=1;LSB=0;LSC=1; //显示小数点) M% e* {( u' {# ^
P0 = 0x80;
! B& G7 p. E' _; e$ W4 m delayms(10); //扫描间隔时间设定* T: a6 _5 C% |9 V
P0 = 0x00;//消隐; f. b2 ]1 @- j7 T
}
; a* F2 I6 B& q z0 s! ~ //P0=table[keya];; n \% x' c0 r
}& X' G- q7 J1 Z6 h* u/ Q$ d" B: i
/*
! C0 n% F& T% A0 _: k: g/ Lvoid send(uchar key_num)
' }4 h' m- O; c5 d{% B5 l0 ]7 Y6 S4 d, x9 `( F, `
SBUF=key_num;& W: ?* l/ {0 i/ f! ^: E! y2 j* D
while(!TI);
- W! e5 [ p+ P$ r TI=0;
3 B, S5 ~# s, Q7 e$ N: n}4 `3 f1 I6 {" {/ M/ |+ \* C
*/
3 F) ~; Q( U n9 K) a+ _( f( Wvoid Init_adc()7 ]# ]4 x$ ~3 _2 S9 c+ t- [6 i" r
{2 _& {1 H6 r- H& K8 `
P1ASF=0xff; //P1口为使用AD转换做准备,A/D通道选择,所有的P1口作为转换接口 ,AD使用总开关. e; t' M# `7 j; n ^8 }
ADC_RES=0; //清零AD转换结果寄存器高位
& e; d9 v! G; I( K ADC_RESL=0; //清零AD转换结果寄存器低位
( ?4 i& s* y, @( p) q ADC_CONTR=ADC_PWR|ADC_START|ADC_SPEEDA;
# j1 u; ~! N& u- o' o1 D, |' d delayms(1);" B! s [) y4 f
}
5 E5 a- r4 @5 {9 y9 tunsigned int AD_get(uchar channel)
) z* g; I; W9 g: S+ }2 a: E' S{* I* f! A3 r# J) c, R
ADC_CONTR=ADC_PWR|ADC_START|ADC_SPEEDA|channel; //初始化ADC控制寄存器,(转换速度为90个时钟周期转换一次,模拟输入通道为通道1)
7 f& G/ [/ V9 Y% e; b1 j8 [. } _nop_(); //稳定ADC控制寄存器的值 变channel 值变模拟信号输入口7 m; d9 H9 `' {( f
_nop_();; W8 Q9 H' i" z# X* b! f& R# U
_nop_();, t3 g! j# `7 d% p8 y# G$ e# e
_nop_();( R% B% Y# w- g- g: L; n# E* t
while((ADC_FLAG&0x10)==0); //查询转换是否结束& c. f8 b. c1 v5 m/ U
ADC_CONTR &= 0xef; //清零ADC_FLAG位
6 f- f/ s8 ^8 \* Y //ADC_CONTR = ADC_CONTR & 0xef;5 Q1 ]* @# G, k/ z
return (ADC_RES*4+ADC_RESL); //返回转换结果 十位八位寄存器转换 ,去掉 ADC_RES*4则为八位- Y1 [4 E2 r4 v( G
}2 M+ u2 d/ D; h9 x1 `4 |# r% Q
float AD_work(uchar channel) //计算结果
) d1 @! y( p* f{
' T9 z \$ c7 u float AD_val;
* x/ G% M( L% m$ j( N: c% C AD_val=(float)AD_get(channel);
) G' x0 `/ _, H1 }" o% E AD_val=(AD_val*5)/1023; //1023对应51 [7 q: v! |- t( \1 `8 Q& J4 V0 n. t j
return AD_val;
- k5 u4 j. X2 p}6 A# Q" a3 a- w1 j5 K+ e0 T; x1 z& m
main()
7 \% V, J$ i4 \* p, y" U9 F* n{
* Y/ |; s7 n$ F9 e" O. u TMOD=0x01;//定时器0工作方式1?8 t# E( z* I, T Z! k
TH0=(65536-1000)/256;//赋初值定时
1 w H! ?! g: v! R7 E+ C6 x TL0=(65536-1000)%256;//1ms; Y8 a4 M+ \9 }7 \
// EA=1;//开总中断" B5 e2 [: e: o3 h) z$ [! K
ET0=1;//开定时器0中断* [4 N4 g! H \9 `; [
TR0=1;//启动定时器0
. G8 B; O7 x( `, W, d! Z TMOD=0X20; //定时器1工作方式2 [ m: }( R4 n
TH1 = 0Xfd; //设定初值; ]' S0 X' k7 Z8 m( |0 @" e
TL1=0xfd;( n# ?0 X3 M ]* E; B" J' V! Q8 Q
TR1=1; //启动T1" w5 W2 S9 T9 ]+ k4 N# T
SM0=0;
: S+ Z* f. B8 _( K l( A3 P8 k SM1=1;$ T4 e/ I" z9 l. O; ^$ s
EA=1;
/ S" F2 s D9 T9 }# b6 _ ES=1;, S% C+ k) h5 S! L
P0=0xff;) j* H7 a& N* S* m' r9 b* n; M( e
Init_adc();5 g- ?6 ?- ~7 M+ N8 K) r. |+ R
//display(); y8 H$ c! n; K t
2 {& m+ c1 O) R5 A, S; s while(1), B& K' Y: I$ Y+ D0 Y
{
( @3 p; D3 N. d9 Z( V q3 _$ | AD_Result=AD_work(0);
9 l; s$ g5 N( S5 f AD_Result = AD_Result*100;! h! X( B- |, `3 i! o
//DisplayData[4]=DIG_CODE[AD_Result%10000/1000];' h* [! [# s) l* n: [8 h
DisplayData[5]=table[(int)AD_Result%1000/100];
9 ? M7 S( c* y% S DisplayData[6]=table[(int)AD_Result%100/10];; {9 u- I' O& E7 z6 Y
DisplayData[7]=table[(int)AD_Result%10/1];* O' L* }% `8 o1 T$ F2 s
display();
, c% e- S; e* Q// send(k);
% z4 X) p3 C! M" i. v }
2 S' f0 C/ f6 p! S$ _0 {
2 k3 Y4 A9 V4 \$ l}3 @! k1 t8 J! } C# k3 S
void tim0() interrupt 1/ i3 x8 X, n& \. {& V4 q: q0 _
{: v: A7 q r6 o& Y
uchar time;
) a( }) X, m% b3 ^: g6 y* S" h( V1 H TR0=0;//赋初值时,关闭定时器3 X2 [6 d; u3 Z& {: D% E; j3 F* L
TH0=(65536-922)/256;//赋初值定时
$ [% W0 q; o4 o& V9 ] TL0=(65536-922)%256;//定时1ms : R6 @3 T' q9 Y0 _6 Q) A
TR0=1;//打开定时器
* R& y5 p4 L0 J$ ^& {% [0 F6 ] time++;
* d; r5 w' g- ]! q ) j4 J! T4 b! O- U- B! \
if(time<=10)1 V7 A% _& g3 [+ G
PWM=0;//占空比0.1$ t8 s" D; v6 `/ d9 {
else: e$ Z5 Q5 q% g+ b
PWM=1;% F8 b0 p( s$ J+ A5 Z$ m6 d
if(time>=100)1 Z1 Q7 R& @& g% R% j( Z
{% P" A7 ~" v( _* T! o
PWM = 0;: z, ^ E( ^9 l* j" O$ d* ^1 B7 X
…………限于本文篇幅 余下代码请从论坛下载附件…………
9 M* b) O! g; X+ e* w& F
* `2 S3 m$ B% |; }( x; ~; j8 A' I* G- j) H' m v4 O
|
|