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

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

[复制链接]

该用户从未签到

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

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
游客,如果您要查看本帖隐藏内容请回复
( V! O. U3 A9 ]8 Z

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-9-10 17:45 , Processed in 0.156250 second(s), 26 queries , Gzip On.

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

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

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