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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
干簧管式流量传感器单片机驱动程序
! Y# s' ^, i# N* T
干簧管交叉排列,单片机读取电压值,自己实际标定之后转换为流量值# @' @0 [( `# D) U* s
单片机源程序:/ l+ }, s- I* m5 D) K& s2 B
#include "stc12c5a60s2.h") @3 v, ]$ j  ~% Q/ M
#include "string.h"                   //字符串长度
* f0 H0 P9 n; g- y8 q6 s7 i#include "intrins.h"           //_nop_或者移位操作0 F# i7 p1 O7 |+ V
#include "stdio.h"
3 L" X, m' _8 v( P' a
#define ADC_PWR 0x80; ^8 G. ?$ o* C0 E
#define ADC_FLAG 0x10 # k/ @. m! ]/ {/ u
#define ADC_START 0x08+ w8 W$ {" d/ J9 e& Y
#define ADC_SPEEDA 0x60        //不同的值可以改变转换速度

" r- ?# Q2 ~3 \sbit LSA=P2^2;
- `& ]9 k( c* ^! Y! V! Osbit LSB=P2^3;
$ {; a7 w9 @, j& [) }/ j; Ysbit LSC=P2^4;, f" D1 D1 e; ]2 n5 A* o
sbit PWM=P2^0;

3 v+ W( N: J6 r% ^/ [3 _4 Rfloat AD_Result;//储存AD转换结果7 o4 G& B/ ^, q- v
#define uchar unsigned char- y1 {: K) I3 E( |0 t
#define uint unsigned int
7 q1 s7 }8 @( S6 }; h- B0 Guchar DisplayData[8];
0 Q" H! U! N% e; Yuchar code table[]={  //table[]里面无数字        ! h% l4 B# ]: Y" h; Y: ]; j! D
//共阳极代码0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,0x80, 0x90,4 d0 h+ K2 {* X1 ~
                                        0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07," d/ x2 S# m- Q4 }
                                        0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};  //后边带分号

/ L1 P" g& I" M+ q# n% Nvoid delayms(uint xms)+ s0 L8 ~8 T5 d3 R2 A$ m
{' z: O2 L. @" B* N" n
        uint i,j;- J6 ?# Q! |) q; a3 G; F; A
        for(i=xms;i>0;i--)          //后无分号,i=xms 即延时约xms毫秒
) q0 y! Y9 O5 q3 K+ z  ]                for(j=110;j>0;j--);//有分号4 N3 V7 w1 ?7 u7 _1 M! p
}

- n0 Z2 v8 n. F. Q1 jvoid display(void)# [$ e7 @. \" h0 G. X
{4 W" a* s% g7 Z# ^- V4 T& I
        unsigned char i;
: ?# [1 @; Y6 @% J! ]+ s! a. Q) F        for(i=0; i<8; i++)- e# _6 R5 K1 m  B
        {
3 m% R# h$ o8 K$ O                switch(i)         //位选,选择点亮的数码管,
1 J* s9 k8 d2 g1 @* Z( y! z                {: r( y" Z/ x7 N
                        case(0):5 f. \) d: A' E. _2 t4 M; F* C
                                LSA=0;LSB=0;LSC=0; break;//显示第0位4 h. O# a  {  s' ^$ h# a
                        case(1):
+ v% t$ b( ^4 b7 U! M( r, d                                LSA=1;LSB=0;LSC=0; break;//显示第1位
: s1 v% |4 F$ y0 ]" e. v                        case(2):) |4 Y; `, [9 l+ j
                                LSA=0;LSB=1;LSC=0; break;//显示第2位2 ]5 N. y; b1 A
                        case(3):
/ W: P' V1 }& r7 T1 a0 T) L1 j2 r6 l                                LSA=1;LSB=1;LSC=0; break;//显示第3位7 F, B, D$ s# q7 D; d( D; [
                        case(4):
) R# N$ n4 x; e  V4 C: G8 ~# G$ w                                LSA=0;LSB=0;LSC=1; break;//显示第4位0 p" B/ y8 C9 d1 m  }
                        case(5):
/ K0 F) n2 W& C+ u) U# P                                LSA=1;LSB=0;LSC=1; break;//显示第5位
; n+ s8 R/ s8 v# t! ]                        case(6):
1 c; O2 `5 r% X; y9 {# |- f& ?9 ]                                LSA=0;LSB=1;LSC=1; break;//显示第6位; b0 H* \1 R) e5 m0 E- W$ B
                        case(7):) i# J9 y6 m/ R* k' r* E
                                LSA=1;LSB=1;LSC=1; break;//显示第7位        
' r9 s& U2 c/ J( i4 d9 c                }' y* W& y$ j* A+ c6 V) Q
                P0 = DisplayData;//发送段码, E! U. k2 a. n, Q# u1 {7 H1 Q, s
                delayms(10);                 //扫描间隔时间设定4 q; o  r6 L$ ]/ r" x, ^, d
                LSA=1;LSB=0;LSC=1;        //显示小数点$ \2 L8 z) C% Y* T+ s
                P0 = 0x80;
- y4 J/ {1 v7 R% G                delayms(10);                 //扫描间隔时间设定$ X4 M7 h9 N, E# Q
                P0 = 0x00;//消隐  S9 z5 F& _3 P( A0 t' M# q
        }
* Q/ l7 e9 k2 n                //P0=table[keya];% k: n6 P) h$ V1 t9 k( Y5 D  v
}5 U7 [  z2 k- ^! q' N
/*4 _  \; K; G' q; c' p
void send(uchar key_num)
8 c3 g+ ~9 v, L  _: s7 B- D{
' r# q0 i. m: D7 y3 z2 t        SBUF=key_num;% L2 h. a# |4 x% _- {
        while(!TI);$ j: h% b' B( |7 t; }. [
        TI=0;
8 @1 {, m' V& u; r  t: c}
1 ~' E$ C0 c* q& q$ I*/
3 a2 k% B8 I! f1 M) ^6 d& xvoid Init_adc()3 j. k: @6 Z( D" ~  q% ?3 Z
{* ]+ Y! G  `+ H3 J2 m
    P1ASF=0xff;                //P1口为使用AD转换做准备,A/D通道选择,所有的P1口作为转换接口 ,AD使用总开关
, ?2 }1 n) s9 o: B8 N7 j; N  W    ADC_RES=0;                //清零AD转换结果寄存器高位4 h8 _& e2 L& i
    ADC_RESL=0;                //清零AD转换结果寄存器低位
& ]; u6 s: y& r- F- G) z1 U4 x3 R    ADC_CONTR=ADC_PWR|ADC_START|ADC_SPEEDA;
8 l  ^5 \8 ^# V7 s: Z; u8 Y$ _7 ]    delayms(1);* C' ?9 P' V5 ?6 B8 @3 {; H# [
}
3 ^* H! x4 t" R( u" }- W6 M
unsigned int AD_get(uchar channel)1 Y1 `* d3 ]  Z  D$ b7 o7 T
{
7 U, n- N* T  a0 Y, E/ ^! s        ADC_CONTR=ADC_PWR|ADC_START|ADC_SPEEDA|channel; //初始化ADC控制寄存器,(转换速度为90个时钟周期转换一次,模拟输入通道为通道1)
3 _1 q: n8 g. m: f6 _8 c    _nop_();           //稳定ADC控制寄存器的值                变channel 值变模拟信号输入口
  y" r+ f1 M# }/ i    _nop_();8 F( k- v) ?$ Q8 j
    _nop_();
- I% n- I5 C1 D' k3 \$ Y    _nop_();; O( x% B( p  Q% c0 ?- Y6 }& ]) \
    while((ADC_FLAG&0x10)==0);         //查询转换是否结束9 S( \! L: j3 A; A
    ADC_CONTR &= 0xef;                         //清零ADC_FLAG位) f& y, R8 n; ^
        //ADC_CONTR = ADC_CONTR & 0xef;
) I  p) W0 d: ]/ S8 ~        return (ADC_RES*4+ADC_RESL);         //返回转换结果        十位八位寄存器转换        ,去掉 ADC_RES*4则为八位
9 W' K& m& I' W}
5 P6 b8 Z* \. J4 v* \
float AD_work(uchar channel)  //计算结果
0 R; x  t: o! S" J{
; n3 t3 U4 o3 H. q- K; O: O# Z0 R    float AD_val;( ^* X% d. m7 j3 M
    AD_val=(float)AD_get(channel);
) J3 M7 G. U7 Z  C* j2 e    AD_val=(AD_val*5)/1023;        //1023对应5) E6 N; S' D1 R$ r2 M
    return AD_val;" o0 i/ W2 M- _, e: [
}

# t$ G/ d8 b% D* k/ lmain()
2 U2 u. H5 ^  m/ i$ Q{
$ n6 S+ K- H+ `8 i3 `, d6 F9 M1 H        TMOD=0x01;//定时器0工作方式1?* M, g0 W: b9 Y9 N( j+ ~2 D$ V
        TH0=(65536-1000)/256;//赋初值定时
. @) V6 ?( F" K8 O/ z' S1 Y2 G        TL0=(65536-1000)%256;//1ms
, N& }$ c2 R# b5 c& V* T//        EA=1;//开总中断
) D% D& u  Q% d, W- |. z# b8 @        ET0=1;//开定时器0中断8 M2 |% K) b  i( I2 g6 z
        TR0=1;//启动定时器09 d. }7 r% B( v1 m7 J; \
        TMOD=0X20;          //定时器1工作方式2
- j* n1 t( t- ^6 Y" q. X        TH1 = 0Xfd;          //设定初值; `( {. |8 M8 K) F
        TL1=0xfd;
6 p9 ^# B8 h; _2 s. l        TR1=1;           //启动T1
. l) O5 i' F. X4 }( T7 \        SM0=0;- C7 I8 L$ S) A" i# t$ f& l( R9 P
        SM1=1;; m$ B8 }- v) C; r2 J( S# I
        EA=1;
3 p1 [3 |8 i( i        ES=1;) Y( Q& M' B& {5 d  o
        P0=0xff;
+ G9 q) c. ~7 ^! k% C        Init_adc();
0 ~- N0 G" f$ e0 r0 ^        //display();
6 [2 [3 `% K$ ?- j3 Y: `6 l                    
2 G4 a. Y$ a2 B# ^. t+ ~        while(1)! ?- ]$ O3 c+ \
        {         ' T) J! ~  N( P/ P2 @/ S
         AD_Result=AD_work(0);        
0 v" |( D" L4 h; i) Z( p+ l         AD_Result = AD_Result*100;

9 d0 J: s: u7 Y5 p6 \( r# x, \        //DisplayData[4]=DIG_CODE[AD_Result%10000/1000];
4 J$ H+ V+ N! w: C# a4 w        DisplayData[5]=table[(int)AD_Result%1000/100];
8 R  u. E3 G* i2 d  u+ z) b2 n' W        DisplayData[6]=table[(int)AD_Result%100/10];* M7 r7 a# k" }3 N8 _$ {
        DisplayData[7]=table[(int)AD_Result%10/1];
3 Y$ \# {( C: k, I& g0 h        display();- L1 [" N8 [0 e
//        send(k);        6 i9 ?, [! T% S9 a$ Y
        }

6 g) o* o2 R& d6 F1 t0 Z
, y5 |/ ^- ^5 O1 b+ o}9 H" O% W+ T$ e" R" u" i4 v: [
void tim0() interrupt 1
6 B4 W8 {1 b; l% x# s0 C8 x" s{
( i" v  P! N2 r) A' s        uchar time;& G7 r2 v- ?4 u/ O' H) u
        TR0=0;//赋初值时,关闭定时器3 n# |- D2 e1 p7 `" x; l0 O7 |
        TH0=(65536-922)/256;//赋初值定时- S+ x# U1 S$ f' f7 w6 q( O, E
        TL0=(65536-922)%256;//定时1ms
/ n+ E; B: s. U" A- r$ b        TR0=1;//打开定时器
2 [, ^" h- w  O$ ]6 j. I5 J* Z" ~        time++;9 X" K4 ]( C" ], q6 O7 r
        8 ], V% X( a7 k3 G$ C* p
        if(time<=10)
+ Z: y1 V# Z" {( u% A3 @+ l3 C                PWM=0;//占空比0.16 t; M4 `" W: [3 ~2 X& w  u
        else6 g; y$ n; l  [! L* h$ i
                PWM=1;8 o  j! l! K, v- `! T" f6 K  s$ B
        if(time>=100)
4 l$ [" d# K0 v7 @/ d        {
' |- h9 M& S5 A5 Q$ j                PWM = 0;
+ K; [9 y0 E+ o6 P5 o& \5 M…………限于本文篇幅 余下代码请从论坛下载附件…………6 Y7 }9 C0 {0 Z8 |; n8 Z: q( W

7 x/ M6 C% S4 J' L: W4 o& R- e& f( c0 \+ r* m
游客,如果您要查看本帖隐藏内容请回复
) V6 y0 m& ~' `( {$ Z: J% l  c' f

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-8-19 20:59 , Processed in 0.125000 second(s), 26 queries , Gzip On.

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

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

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