找回密码
 注册
关于网站域名变更的通知
查看: 917|回复: 1
打印 上一主题 下一主题

干簧管式流量传感器单片机驱动程序

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2018-11-27 09:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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
游客,如果您要查看本帖隐藏内容请回复

' k8 {( b) R8 F# G3 \' n

该用户从未签到

2#
发表于 2018-11-27 10:12 | 只看该作者
感谢楼主的分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-10-8 19:43 , Processed in 0.140625 second(s), 26 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表