|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
4 L* U/ T4 V/ h+ V, [
干簧管交叉排列,单片机读取电压值,自己实际标定之后转换为流量值 y* v6 U$ X X" N. R
单片机源程序:) h( f! D* I+ e6 ]
#include "stc12c5a60s2.h"5 ]& G. O3 x' \: h
#include "string.h" //字符串长度, z% l- r4 T r# P4 a9 Y# A
#include "intrins.h" //_nop_或者移位操作. C5 @! {! ]$ V1 l
#include "stdio.h", k8 [, y T1 p' J. g
#define ADC_PWR 0x80
( t z& N* L- p. A( F" D#define ADC_FLAG 0x10 * N6 L$ J4 M. E0 z1 v5 C. {) I
#define ADC_START 0x086 g% ^1 q* |" l$ f1 w$ @
#define ADC_SPEEDA 0x60 //不同的值可以改变转换速度& f1 _& ]1 p. c: D) u: R
sbit LSA=P2^2;
% z( ~. F0 I/ y1 z$ T6 N( _sbit LSB=P2^3;/ ?* U6 d( O7 F4 X% v* i" p
sbit LSC=P2^4;
1 _9 f. Q+ n" ] g. L& M u5 G( W9 msbit PWM=P2^0;
# f# [& e4 H) v; e2 lfloat AD_Result;//储存AD转换结果; `# H9 _2 r& S0 c+ T
#define uchar unsigned char
9 F+ S1 v3 ~# c1 r* A% ^9 o#define uint unsigned int' U$ t3 \$ o2 P) T' v
uchar DisplayData[8];* z- m ]/ @) k6 T, `
uchar code table[]={ //table[]里面无数字 / M0 Y9 k" V. G5 f5 a! a( S
//共阳极代码0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,0x80, 0x90,/ {) u/ m) x, @- |6 W* T% ^* l% ^* c
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
1 x7 s/ \. F6 c6 S 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //后边带分号0 s9 y: h. A3 e+ |
void delayms(uint xms)
5 U3 t( W f! c0 J T5 S8 v{
7 p: F( a- X& y* G G uint i,j;& ^+ Q: K% ^& n0 y% b
for(i=xms;i>0;i--) //后无分号,i=xms 即延时约xms毫秒9 L0 r3 W1 D% `4 I* \/ | V( r2 {; g
for(j=110;j>0;j--);//有分号+ r, J( y& ]8 w! h. a7 W4 r
}
E) p( `) _+ ^( M7 v" M7 v& r, ~5 A# Avoid display(void)
- N! @" s* _- l# d( y" q5 B2 E{
" R4 e% g$ d/ c unsigned char i;
?9 V7 Y+ m+ c0 a+ s% D for(i=0; i<8; i++), J1 V2 B) J) L5 w
{
" J) f+ U1 `( K& Q, u switch(i) //位选,选择点亮的数码管,
1 @7 i" s* S5 _* W: x {2 @" r9 z9 S/ [7 X, L
case(0):
7 d' `' I2 |9 _: d: o LSA=0;LSB=0;LSC=0; break;//显示第0位; i0 [5 I' E/ z3 r2 }, e* V
case(1):
5 Y4 V/ _" X3 Y+ S% ? r; p LSA=1;LSB=0;LSC=0; break;//显示第1位
0 p, w& E( Q" o2 Z case(2):; o; S; f# j5 ~, d! Z( C
LSA=0;LSB=1;LSC=0; break;//显示第2位5 c% g- ]* u) ~5 a# k- C& P
case(3):$ M1 O( [; e! O: _
LSA=1;LSB=1;LSC=0; break;//显示第3位" A, Y! D) n' x, j
case(4):
/ @: ~6 J! z$ Y2 d LSA=0;LSB=0;LSC=1; break;//显示第4位
- H; Z8 u4 u% o! y case(5):
& ~; Z$ r0 T/ L LSA=1;LSB=0;LSC=1; break;//显示第5位8 d1 `( z- L" K1 X3 D& h
case(6):" l+ K6 T8 G) F6 X5 |1 F7 w& `' D
LSA=0;LSB=1;LSC=1; break;//显示第6位
3 _+ o. B# t# ?8 d" T case(7):
' W; c7 f' {5 Y LSA=1;LSB=1;LSC=1; break;//显示第7位 * M: l; `- c4 A7 E
}* ?: Z1 t, m% _* n
P0 = DisplayData;//发送段码1 C. m/ a8 Y' ?( @7 \
delayms(10); //扫描间隔时间设定 n% R% u/ S9 |% b2 c
LSA=1;LSB=0;LSC=1; //显示小数点
$ Z7 b$ @/ z) ?- c' c# Z+ t P0 = 0x80;7 r; x7 \" P$ q, D/ H0 I7 w- [
delayms(10); //扫描间隔时间设定0 k$ A6 O% L/ q- c9 m# {
P0 = 0x00;//消隐
; l3 Z0 M8 Y h* y }5 {$ Q7 q2 b6 c! o3 m; J" x* Z
//P0=table[keya];' E- w1 D0 h) l
}
- r4 T/ L Z+ I3 B( c/*/ V& e$ p9 s7 K& r: f7 u/ W
void send(uchar key_num)
% @, K7 d' m0 ?( z/ P) a% m{ \: p' m2 P2 @- B# x9 X
SBUF=key_num;
, y5 Y$ ^! V+ ], ?$ r+ P while(!TI);
' J, N2 r5 M' b7 O v, _ TI=0;
* M1 u9 ^6 A$ _- S1 s7 P}! P6 O; c0 a. E. Y6 h1 m* o
*/* p3 T" H* L( w* n1 m
void Init_adc()
* N9 m& I2 B! ~# a# l3 E8 f{2 T$ L2 i( r* T- c" p; v
P1ASF=0xff; //P1口为使用AD转换做准备,A/D通道选择,所有的P1口作为转换接口 ,AD使用总开关
' i% z: t( ]. E0 A1 K9 z( g ADC_RES=0; //清零AD转换结果寄存器高位
/ R+ X/ F5 ^# M ADC_RESL=0; //清零AD转换结果寄存器低位
6 a7 V$ L! s2 Q5 v# w$ u, ~& P J ADC_CONTR=ADC_PWR|ADC_START|ADC_SPEEDA;
# k) Q2 r& o: S5 l delayms(1);
: ]9 ]7 x1 y& [5 \}1 u5 H. z" o6 `5 V7 i1 o
unsigned int AD_get(uchar channel)" r. p3 V) b6 ^ k2 }: j
{4 c/ N" d) R$ E7 v- |' x X4 j
ADC_CONTR=ADC_PWR|ADC_START|ADC_SPEEDA|channel; //初始化ADC控制寄存器,(转换速度为90个时钟周期转换一次,模拟输入通道为通道1). J6 _. y/ V7 Y2 C) F+ {
_nop_(); //稳定ADC控制寄存器的值 变channel 值变模拟信号输入口) ^* `) c1 N) W, j" ~: C
_nop_();
1 C5 c; I: W1 }$ w _nop_();+ Q) y' C4 r8 W5 z7 D8 m1 o9 B9 U$ j
_nop_();; a8 B: s. X( d; z* Y$ p6 L" p
while((ADC_FLAG&0x10)==0); //查询转换是否结束
& X. g& w Y! V% y9 V8 c2 f" s( m ADC_CONTR &= 0xef; //清零ADC_FLAG位
% T. P, i6 k2 I5 s //ADC_CONTR = ADC_CONTR & 0xef;5 m% R% h4 \4 c7 l- t. c% V7 P- ?$ K
return (ADC_RES*4+ADC_RESL); //返回转换结果 十位八位寄存器转换 ,去掉 ADC_RES*4则为八位
4 A# w/ w s. X& R, T} T9 }- Q, `* _6 u
float AD_work(uchar channel) //计算结果3 i/ b. }6 ~( ^4 d
{7 f3 Z/ g$ u& _" b0 S0 m6 ~0 J
float AD_val;1 z+ p, j7 V' L& q: E0 |
AD_val=(float)AD_get(channel);
, O+ ?. `+ F! T4 h( r$ \ AD_val=(AD_val*5)/1023; //1023对应5
, V+ y9 }" k- D' T( A return AD_val;
- b' ^, ~0 q% p) B- d+ Z}1 K5 M8 {& e( `( i C/ k5 r* J
main()4 m' z z0 P+ Q$ X" e
{ a! F2 B3 ?! }8 D7 R* P
TMOD=0x01;//定时器0工作方式1?4 j4 y. o$ B7 a" U1 g5 T0 w& c: k' H
TH0=(65536-1000)/256;//赋初值定时7 ^6 n$ S6 U. m c/ l+ k
TL0=(65536-1000)%256;//1ms
" x8 _, m' m% O6 P* f: [4 C3 H// EA=1;//开总中断
7 b" n3 U3 P9 d ET0=1;//开定时器0中断! N0 Z$ X- s7 f, p
TR0=1;//启动定时器0
/ r% H9 E5 {7 d* [1 @ TMOD=0X20; //定时器1工作方式2" {- f6 B- M! y/ _3 |
TH1 = 0Xfd; //设定初值7 S6 L% D) B9 X- X |. o( W
TL1=0xfd;
3 l( d D- A0 I4 j N- _, ] TR1=1; //启动T1: u) b8 {, S/ Q
SM0=0;9 R' q: y1 O+ `0 r9 b4 {& [% p8 @3 l
SM1=1;( d. s3 T4 F N3 t' Z* @9 e/ C
EA=1;
( u+ z7 ~: N0 f+ ]( M ES=1;
5 p/ s0 }) R* Q& X, `6 D$ p$ S5 E P0=0xff;
8 v3 K/ j# \1 Y- {) m Init_adc();
; R% @. E6 M; @8 t; \, D //display();
- V! q8 i3 Z4 F& |& Z9 A0 w. B" B
0 w0 J" `" Z9 e) v5 K5 Z, r while(1): ?" L% r1 [" ^, P. o
{ 2 Y; r* f3 d; P& Y: @! x/ d
AD_Result=AD_work(0);
. R% a; z n/ @1 H) {# n/ X1 P AD_Result = AD_Result*100;
" n+ x( D% n; L3 f4 N: U //DisplayData[4]=DIG_CODE[AD_Result%10000/1000];
, [8 z9 E6 l: _9 K* O( B4 @4 ] DisplayData[5]=table[(int)AD_Result%1000/100];. U- m7 ^8 ~( T! p1 y
DisplayData[6]=table[(int)AD_Result%100/10];
& @: l5 k6 o% R$ ^- V; y" O DisplayData[7]=table[(int)AD_Result%10/1];+ m/ F5 m* m9 P0 p$ v
display();
9 h8 X+ a2 F+ [, I# ^// send(k);
, V a. f+ }5 _& H0 M2 B5 s }5 e# {, \/ }7 p: j) C( J6 ]! O
! r8 \. ]0 F2 F7 r: z8 g
}
; b4 a4 M, Z' L8 qvoid tim0() interrupt 1/ @* R) O( L3 V$ N9 y$ }9 o+ J
{
" g5 ]) N9 |! b" x1 e uchar time;
@5 j+ N' `. N5 P" c TR0=0;//赋初值时,关闭定时器# v8 s& f0 I6 T0 s7 I; P3 }
TH0=(65536-922)/256;//赋初值定时
/ E( L' q6 {+ t2 _5 g/ w: k% \4 | TL0=(65536-922)%256;//定时1ms 6 f3 u( A, U' P
TR0=1;//打开定时器# D, H& x% `0 }, T
time++;
( w' s8 i- R% ^+ @) ?
, h$ F4 q& M6 r5 T8 Q if(time<=10)2 S' n- n' d7 D$ B
PWM=0;//占空比0.13 L; X! ?- d; p( p7 y
else
3 t7 m4 g+ ?" Q# P4 Z PWM=1;' f K% @" \! e1 m: @! C7 T4 g* K
if(time>=100)
; {5 W6 u" |. U( \& s {
! h4 |$ p" f9 `7 d6 Z5 r* F/ _ PWM = 0;
4 y' `5 T- l4 p5 w" c: ?…………限于本文篇幅 余下代码请从论坛下载附件…………
7 ~: I! B9 ]1 _8 b( P% w
, P0 Q5 U* K$ S9 h7 P# R7 u$ O, z
* L4 ?4 z& F% Z' v% G' U3 u) { |
|