|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
8 T/ t: s3 l V! w7 R
干簧管交叉排列,单片机读取电压值,自己实际标定之后转换为流量值
: o6 p4 M3 a) W4 ` X3 i单片机源程序:/ p! S; I0 @) l( t; {
#include "stc12c5a60s2.h" K. v/ E6 U/ p c/ T7 d1 P
#include "string.h" //字符串长度% q D+ i) J$ r1 v& E2 k
#include "intrins.h" //_nop_或者移位操作
; ?. _- u0 y& T5 V( |0 {% @#include "stdio.h"
, c1 e1 w& ^# U0 v+ b#define ADC_PWR 0x80! B9 i9 k* a9 \' C, t/ C
#define ADC_FLAG 0x10
0 S" [0 X q( u3 T {4 a#define ADC_START 0x08
0 |9 e& ~2 e* Q! F0 t4 ^$ b6 D#define ADC_SPEEDA 0x60 //不同的值可以改变转换速度1 B) L5 A% g) J0 R6 V) [
sbit LSA=P2^2;0 d8 G/ i+ u. Z
sbit LSB=P2^3;9 q' ~$ g" }* y1 z, E
sbit LSC=P2^4;8 g \5 g, y) z x1 v' a0 G4 e
sbit PWM=P2^0;
* a s z, B" a0 b. _2 zfloat AD_Result;//储存AD转换结果' r! d" u6 C- w- s. \! W o( f* n: S
#define uchar unsigned char7 w( o. h7 H4 D. f4 e: \
#define uint unsigned int4 q8 ^/ i9 d! o: g4 x" T
uchar DisplayData[8];8 f# F6 z9 `* ]; V( _+ W& q4 l
uchar code table[]={ //table[]里面无数字
2 K, P) E T% p0 g" Q. H. j//共阳极代码0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,0x80, 0x90,
e4 U6 P& u1 ^. b- r1 t- Q/ a 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07," v N" F; {- s$ s7 n* Q$ }* N) l
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //后边带分号
2 R5 u" O3 J; l, Uvoid delayms(uint xms)3 b: c9 O0 J) A6 g3 l
{
0 m; }3 ~' @/ S' T% b) _ uint i,j;
" o- x8 v; X- X for(i=xms;i>0;i--) //后无分号,i=xms 即延时约xms毫秒
0 W' {, E5 ~! V3 `* P: Z- c for(j=110;j>0;j--);//有分号: {8 ?4 G9 j3 R0 U
}2 t/ q. i9 C& s5 T& ]4 e k Z
void display(void)7 Q9 ^ M7 o6 N$ a# A
{
8 k9 {- T3 J) \# f# R& ^ unsigned char i;2 S) b! M) r# ]
for(i=0; i<8; i++)
; `# _+ V. s! x4 \0 e8 ~6 m {
7 c9 C! K6 s, ?1 g5 _, l+ a( P- n switch(i) //位选,选择点亮的数码管,7 b( h& R# L( Z: o! _3 G9 n
{
' N7 a3 P5 k8 k) n1 K case(0):
- D8 o; P! u% \4 y% E LSA=0;LSB=0;LSC=0; break;//显示第0位3 [( T4 V1 ~. B$ O8 E5 p4 f9 B
case(1):, R2 n Y, `+ I* q* a- X
LSA=1;LSB=0;LSC=0; break;//显示第1位
/ U) [" @) T" J L# M) U; M$ u8 W% @6 f case(2):$ B7 T6 z2 [; g3 v
LSA=0;LSB=1;LSC=0; break;//显示第2位, |3 L5 D" o* C7 B( L0 @' S
case(3):
8 H0 B6 C* _: v& ^8 J, ]! a4 m LSA=1;LSB=1;LSC=0; break;//显示第3位, u& o2 E4 W) D
case(4):
) J0 }- i* `# [' _/ i* ~ LSA=0;LSB=0;LSC=1; break;//显示第4位
6 s v8 v9 N- J* O case(5):
) {8 K0 k( |- r! G LSA=1;LSB=0;LSC=1; break;//显示第5位
$ c- O# ]; G9 B! S- C. L case(6):
. }8 z! }0 z! y% z" V- `) ? LSA=0;LSB=1;LSC=1; break;//显示第6位- V. |6 h/ H, R" H1 G- Q
case(7):" ?% ]: e0 [- l9 @
LSA=1;LSB=1;LSC=1; break;//显示第7位 1 U- t" O9 S' s/ T+ ?
}) P8 w' I: L/ l# ^
P0 = DisplayData;//发送段码
+ l4 p/ A7 m- z4 M delayms(10); //扫描间隔时间设定
3 X; z2 t4 r' s! s K) s+ x LSA=1;LSB=0;LSC=1; //显示小数点7 h* {& A" p- P
P0 = 0x80;
6 t, s$ U6 J& v( |& s delayms(10); //扫描间隔时间设定* {9 h0 T$ v, @) z# ]# l
P0 = 0x00;//消隐
0 ^, D+ c/ ?! c }( a2 t& Y) |5 ?) A
//P0=table[keya];
" ?6 |5 K5 \$ Z7 I( E}
5 M; K/ G, l" i7 _' g# _/*" B: H% f* Y* E# m8 p6 \6 Z
void send(uchar key_num)
( i0 \, H4 I0 |( H* b! s{
/ u0 O+ d7 ?! g' q2 Z" M1 `) o: ^8 b SBUF=key_num;# _: B- [% X! M
while(!TI);$ z' T( P' E& g$ }: j7 ?8 v
TI=0; I N+ M% \4 p4 ^
}& }, Q: B, d2 y2 k( }; {. _
*/
7 Y2 a3 N! _; |1 Z$ ~ \+ ~" R0 Hvoid Init_adc()
1 f" R" w! ]& i. m' C{1 K$ |" ~8 d1 o2 w0 J/ q I& u
P1ASF=0xff; //P1口为使用AD转换做准备,A/D通道选择,所有的P1口作为转换接口 ,AD使用总开关
# `1 V/ _4 N) W2 U; a ADC_RES=0; //清零AD转换结果寄存器高位" U, A& j& j% j5 L
ADC_RESL=0; //清零AD转换结果寄存器低位7 |7 O* o3 j& ^% x: v3 ?; z1 ?
ADC_CONTR=ADC_PWR|ADC_START|ADC_SPEEDA;, M( ^5 s) _3 _: T2 u/ u
delayms(1);
; o# h/ j; {* d. u, R" w! R+ a}/ F# u" N" D0 ]. w5 v5 b
unsigned int AD_get(uchar channel)
- G" o! s8 _' `" M9 ]% `. d{
% z% k. _) v$ m- G9 G, U g, U ADC_CONTR=ADC_PWR|ADC_START|ADC_SPEEDA|channel; //初始化ADC控制寄存器,(转换速度为90个时钟周期转换一次,模拟输入通道为通道1)( o2 j& k% b$ X! e" }
_nop_(); //稳定ADC控制寄存器的值 变channel 值变模拟信号输入口
" K9 `. `! G6 q4 }" v _nop_();
! }! y+ A8 m$ w, z7 M+ N. b0 U9 z( L _nop_();
# u' w& W6 `1 j( O5 L _nop_();$ q9 X, i8 b4 W& N% R
while((ADC_FLAG&0x10)==0); //查询转换是否结束
) Y6 m7 {4 O0 d" V" n- \ ADC_CONTR &= 0xef; //清零ADC_FLAG位) a; Y O. W6 f
//ADC_CONTR = ADC_CONTR & 0xef;
7 @, f _ S4 ~( _# L# d+ W' W! X return (ADC_RES*4+ADC_RESL); //返回转换结果 十位八位寄存器转换 ,去掉 ADC_RES*4则为八位
0 C- V5 d* z) z6 T$ D; l3 A}
& J1 [2 E; ?( j6 m! I- g% V) f8 [float AD_work(uchar channel) //计算结果
9 _# E9 W2 Y/ ^# r{. t! f1 C, C0 d6 t+ S
float AD_val;
6 D% d0 Z4 \( `; ]( m AD_val=(float)AD_get(channel);. ~ Z9 ~+ ?- e8 T/ J5 |* Y$ n
AD_val=(AD_val*5)/1023; //1023对应5- e' O- w/ c2 v9 Q
return AD_val;
$ i) v- l8 |! j* H3 q}- N# s2 q. f5 n# e8 c- k
main()8 F( X) l6 k/ m
{
3 _/ {" B( K3 p K% A TMOD=0x01;//定时器0工作方式1?
8 ^3 d3 C9 p! a/ d TH0=(65536-1000)/256;//赋初值定时
: n% ^8 T- c, z9 T3 u TL0=(65536-1000)%256;//1ms, @6 Y; z3 Z7 w$ b% N
// EA=1;//开总中断6 n1 G! U" {# o/ t, e. \
ET0=1;//开定时器0中断# W& m" Y6 T! H( r8 u
TR0=1;//启动定时器0, ]6 y) N, i' n
TMOD=0X20; //定时器1工作方式2
! ?1 E3 j) V7 ] TH1 = 0Xfd; //设定初值
4 v+ D& t3 \' v* E TL1=0xfd;
+ N2 M) b+ W/ x5 D. J9 t TR1=1; //启动T1' A: g' V; {) \1 ^' U: b' Q
SM0=0;
# t/ \1 [) C; I6 p7 A9 N6 b SM1=1;
* q% {1 F; c2 m! J EA=1;
6 l" c% c# B8 Y6 a: d. {1 l ES=1;0 X# R4 m6 Q$ V9 ]4 r; ]) X0 W
P0=0xff;
% |! v; m0 W0 t$ `0 ^. n+ ` Init_adc();: v) e( e" H% y6 y
//display();
* U: z" W4 S0 U: [! L7 k" U$ E 5 G1 y6 z$ y+ w7 h( {( l
while(1)
9 n3 h3 K0 g* g9 e3 n |& Q { 2 R* |# p, ^, I8 J- h5 c, V
AD_Result=AD_work(0); 7 |5 _7 n$ p1 L5 f# c- q4 q
AD_Result = AD_Result*100;* c: O/ G$ D1 s8 |
//DisplayData[4]=DIG_CODE[AD_Result%10000/1000];( B9 U6 D8 {# L& |
DisplayData[5]=table[(int)AD_Result%1000/100];# l7 Q& p. J) R: ?& M! w
DisplayData[6]=table[(int)AD_Result%100/10];
7 ^; r/ e# h: |9 Z8 X4 ]# ` DisplayData[7]=table[(int)AD_Result%10/1];
. c2 t/ }! Q i8 H display();
& m5 G1 l3 N) }, {$ V// send(k);
: h( g- F) y% X5 ]1 o }6 P7 _( h. D8 G. Q8 _) [ |" d- {
+ T+ c3 B- t4 D5 W. `$ {}* C# {( r3 S2 R3 r) e
void tim0() interrupt 1
Z$ M6 A& K2 Z) A{
$ I% P3 |; I+ e0 F9 ~ uchar time;
# b8 S) `: t7 u5 D! B5 W* h" x TR0=0;//赋初值时,关闭定时器" U5 I6 k. Z) ]+ H4 a
TH0=(65536-922)/256;//赋初值定时
* v# W" }: W+ x+ Q. s TL0=(65536-922)%256;//定时1ms
& f; }6 x i1 t B" m& {- c# }( b TR0=1;//打开定时器
) ~* y4 h0 H* f- A$ F time++;
) ^, B' {9 f: r( Q H6 a
8 a$ |; j6 I! A if(time<=10)
& @9 {; ?0 o8 Y/ J/ z% v& m PWM=0;//占空比0.1
, g, c) N" L0 f5 C {- g- X' \. a3 c5 o else7 O/ Y. S U2 k" O3 ?" O. u* g" a
PWM=1;
9 u2 K7 M3 y3 a. U1 d' D if(time>=100)" t8 h" {1 X" |/ Q4 \$ X
{; L' C5 A0 L+ a8 v
PWM = 0;" X7 Y: n( h9 O6 W r
…………限于本文篇幅 余下代码请从论坛下载附件…………8 C7 v& {: l3 R; t+ Q9 r9 Y$ s' q. T- Q
# V$ J! ?' }; ?; N
4 @( g' y# ?5 S2 P; a
0 O+ g1 o2 n; M" D, I3 u, u& f1 H |
|