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

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

[复制链接]

该用户从未签到

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

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) {

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-6-28 05:45 , Processed in 0.109375 second(s), 26 queries , Gzip On.

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

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

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