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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
干簧管式流量传感器单片机驱动程序
8 T/ t: s3 l  V! w7 R
干簧管交叉排列,单片机读取电压值,自己实际标定之后转换为流量值
: o6 p4 M3 a) W4 `  X3 i
单片机源程序:/ p! S; I0 @) l( t; {
#include "stc12c5a60s2.h"  K. v/ E6 U/ p  c/ T7 d1 P
#include "string.h"                   //字符串长度% q  D+ i) J$ r1 v& E2 k
#include "intrins.h"           //_nop_或者移位操作
; ?. _- u0 y& T5 V( |0 {% @#include "stdio.h"

, c1 e1 w& ^# U0 v+ b#define ADC_PWR 0x80! B9 i9 k* a9 \' C, t/ C
#define ADC_FLAG 0x10
0 S" [0 X  q( u3 T  {4 a#define ADC_START 0x08
0 |9 e& ~2 e* Q! F0 t4 ^$ b6 D#define ADC_SPEEDA 0x60        //不同的值可以改变转换速度
1 B) L5 A% g) J0 R6 V) [
sbit LSA=P2^2;0 d8 G/ i+ u. Z
sbit LSB=P2^3;9 q' ~$ g" }* y1 z, E
sbit LSC=P2^4;8 g  \5 g, y) z  x1 v' a0 G4 e
sbit PWM=P2^0;

* a  s  z, B" a0 b. _2 zfloat AD_Result;//储存AD转换结果' r! d" u6 C- w- s. \! W  o( f* n: S
#define uchar unsigned char7 w( o. h7 H4 D. f4 e: \
#define uint unsigned int4 q8 ^/ i9 d! o: g4 x" T
uchar DisplayData[8];8 f# F6 z9 `* ]; V( _+ W& q4 l
uchar code table[]={  //table[]里面无数字        
2 K, P) E  T% p0 g" Q. H. j//共阳极代码0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,0x80, 0x90,
  e4 U6 P& u1 ^. b- r1 t- Q/ a                                        0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07," v  N" F; {- s$ s7 n* Q$ }* N) l
                                        0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};  //后边带分号

2 R5 u" O3 J; l, Uvoid delayms(uint xms)3 b: c9 O0 J) A6 g3 l
{
0 m; }3 ~' @/ S' T% b) _        uint i,j;
" o- x8 v; X- X        for(i=xms;i>0;i--)          //后无分号,i=xms 即延时约xms毫秒
0 W' {, E5 ~! V3 `* P: Z- c                for(j=110;j>0;j--);//有分号: {8 ?4 G9 j3 R0 U
}
2 t/ q. i9 C& s5 T& ]4 e  k  Z
void display(void)7 Q9 ^  M7 o6 N$ a# A
{
8 k9 {- T3 J) \# f# R& ^        unsigned char i;2 S) b! M) r# ]
        for(i=0; i<8; i++)
; `# _+ V. s! x4 \0 e8 ~6 m        {
7 c9 C! K6 s, ?1 g5 _, l+ a( P- n                switch(i)         //位选,选择点亮的数码管,7 b( h& R# L( Z: o! _3 G9 n
                {
' N7 a3 P5 k8 k) n1 K                        case(0):
- D8 o; P! u% \4 y% E                                LSA=0;LSB=0;LSC=0; break;//显示第0位3 [( T4 V1 ~. B$ O8 E5 p4 f9 B
                        case(1):, R2 n  Y, `+ I* q* a- X
                                LSA=1;LSB=0;LSC=0; break;//显示第1位
/ U) [" @) T" J  L# M) U; M$ u8 W% @6 f                        case(2):$ B7 T6 z2 [; g3 v
                                LSA=0;LSB=1;LSC=0; break;//显示第2位, |3 L5 D" o* C7 B( L0 @' S
                        case(3):
8 H0 B6 C* _: v& ^8 J, ]! a4 m                                LSA=1;LSB=1;LSC=0; break;//显示第3位, u& o2 E4 W) D
                        case(4):
) J0 }- i* `# [' _/ i* ~                                LSA=0;LSB=0;LSC=1; break;//显示第4位
6 s  v8 v9 N- J* O                        case(5):
) {8 K0 k( |- r! G                                LSA=1;LSB=0;LSC=1; break;//显示第5位
$ c- O# ]; G9 B! S- C. L                        case(6):
. }8 z! }0 z! y% z" V- `) ?                                LSA=0;LSB=1;LSC=1; break;//显示第6位- V. |6 h/ H, R" H1 G- Q
                        case(7):" ?% ]: e0 [- l9 @
                                LSA=1;LSB=1;LSC=1; break;//显示第7位        1 U- t" O9 S' s/ T+ ?
                }) P8 w' I: L/ l# ^
                P0 = DisplayData;//发送段码
+ l4 p/ A7 m- z4 M                delayms(10);                 //扫描间隔时间设定
3 X; z2 t4 r' s! s  K) s+ x                LSA=1;LSB=0;LSC=1;        //显示小数点7 h* {& A" p- P
                P0 = 0x80;
6 t, s$ U6 J& v( |& s                delayms(10);                 //扫描间隔时间设定* {9 h0 T$ v, @) z# ]# l
                P0 = 0x00;//消隐
0 ^, D+ c/ ?! c        }( a2 t& Y) |5 ?) A
                //P0=table[keya];
" ?6 |5 K5 \$ Z7 I( E}
5 M; K/ G, l" i7 _' g# _/*" B: H% f* Y* E# m8 p6 \6 Z
void send(uchar key_num)
( i0 \, H4 I0 |( H* b! s{
/ u0 O+ d7 ?! g' q2 Z" M1 `) o: ^8 b        SBUF=key_num;# _: B- [% X! M
        while(!TI);$ z' T( P' E& g$ }: j7 ?8 v
        TI=0;  I  N+ M% \4 p4 ^
}& }, Q: B, d2 y2 k( }; {. _
*/
7 Y2 a3 N! _; |1 Z$ ~  \+ ~" R0 Hvoid Init_adc()
1 f" R" w! ]& i. m' C{1 K$ |" ~8 d1 o2 w0 J/ q  I& u
    P1ASF=0xff;                //P1口为使用AD转换做准备,A/D通道选择,所有的P1口作为转换接口 ,AD使用总开关
# `1 V/ _4 N) W2 U; a    ADC_RES=0;                //清零AD转换结果寄存器高位" U, A& j& j% j5 L
    ADC_RESL=0;                //清零AD转换结果寄存器低位7 |7 O* o3 j& ^% x: v3 ?; z1 ?
    ADC_CONTR=ADC_PWR|ADC_START|ADC_SPEEDA;, M( ^5 s) _3 _: T2 u/ u
    delayms(1);
; o# h/ j; {* d. u, R" w! R+ a}
/ F# u" N" D0 ]. w5 v5 b
unsigned int AD_get(uchar channel)
- G" o! s8 _' `" M9 ]% `. d{
% z% k. _) v$ m- G9 G, U  g, U        ADC_CONTR=ADC_PWR|ADC_START|ADC_SPEEDA|channel; //初始化ADC控制寄存器,(转换速度为90个时钟周期转换一次,模拟输入通道为通道1)( o2 j& k% b$ X! e" }
    _nop_();           //稳定ADC控制寄存器的值                变channel 值变模拟信号输入口
" K9 `. `! G6 q4 }" v    _nop_();
! }! y+ A8 m$ w, z7 M+ N. b0 U9 z( L    _nop_();
# u' w& W6 `1 j( O5 L    _nop_();$ q9 X, i8 b4 W& N% R
    while((ADC_FLAG&0x10)==0);         //查询转换是否结束
) Y6 m7 {4 O0 d" V" n- \    ADC_CONTR &= 0xef;                         //清零ADC_FLAG位) a; Y  O. W6 f
        //ADC_CONTR = ADC_CONTR & 0xef;
7 @, f  _  S4 ~( _# L# d+ W' W! X        return (ADC_RES*4+ADC_RESL);         //返回转换结果        十位八位寄存器转换        ,去掉 ADC_RES*4则为八位
0 C- V5 d* z) z6 T$ D; l3 A}

& J1 [2 E; ?( j6 m! I- g% V) f8 [float AD_work(uchar channel)  //计算结果
9 _# E9 W2 Y/ ^# r{. t! f1 C, C0 d6 t+ S
    float AD_val;
6 D% d0 Z4 \( `; ]( m    AD_val=(float)AD_get(channel);. ~  Z9 ~+ ?- e8 T/ J5 |* Y$ n
    AD_val=(AD_val*5)/1023;        //1023对应5- e' O- w/ c2 v9 Q
    return AD_val;
$ i) v- l8 |! j* H3 q}
- N# s2 q. f5 n# e8 c- k
main()8 F( X) l6 k/ m
{
3 _/ {" B( K3 p  K% A        TMOD=0x01;//定时器0工作方式1?
8 ^3 d3 C9 p! a/ d        TH0=(65536-1000)/256;//赋初值定时
: n% ^8 T- c, z9 T3 u        TL0=(65536-1000)%256;//1ms, @6 Y; z3 Z7 w$ b% N
//        EA=1;//开总中断6 n1 G! U" {# o/ t, e. \
        ET0=1;//开定时器0中断# W& m" Y6 T! H( r8 u
        TR0=1;//启动定时器0, ]6 y) N, i' n
        TMOD=0X20;          //定时器1工作方式2
! ?1 E3 j) V7 ]        TH1 = 0Xfd;          //设定初值
4 v+ D& t3 \' v* E        TL1=0xfd;
+ N2 M) b+ W/ x5 D. J9 t        TR1=1;           //启动T1' A: g' V; {) \1 ^' U: b' Q
        SM0=0;
# t/ \1 [) C; I6 p7 A9 N6 b        SM1=1;
* q% {1 F; c2 m! J        EA=1;
6 l" c% c# B8 Y6 a: d. {1 l        ES=1;0 X# R4 m6 Q$ V9 ]4 r; ]) X0 W
        P0=0xff;
% |! v; m0 W0 t$ `0 ^. n+ `        Init_adc();: v) e( e" H% y6 y
        //display();
* U: z" W4 S0 U: [! L7 k" U$ E                    5 G1 y6 z$ y+ w7 h( {( l
        while(1)
9 n3 h3 K0 g* g9 e3 n  |& Q        {         2 R* |# p, ^, I8 J- h5 c, V
         AD_Result=AD_work(0);        7 |5 _7 n$ p1 L5 f# c- q4 q
         AD_Result = AD_Result*100;
* c: O/ G$ D1 s8 |
        //DisplayData[4]=DIG_CODE[AD_Result%10000/1000];( B9 U6 D8 {# L& |
        DisplayData[5]=table[(int)AD_Result%1000/100];# l7 Q& p. J) R: ?& M! w
        DisplayData[6]=table[(int)AD_Result%100/10];
7 ^; r/ e# h: |9 Z8 X4 ]# `        DisplayData[7]=table[(int)AD_Result%10/1];
. c2 t/ }! Q  i8 H        display();
& m5 G1 l3 N) }, {$ V//        send(k);        
: h( g- F) y% X5 ]1 o        }
6 P7 _( h. D8 G. Q8 _) [  |" d- {

+ T+ c3 B- t4 D5 W. `$ {}* C# {( r3 S2 R3 r) e
void tim0() interrupt 1
  Z$ M6 A& K2 Z) A{
$ I% P3 |; I+ e0 F9 ~        uchar time;
# b8 S) `: t7 u5 D! B5 W* h" x        TR0=0;//赋初值时,关闭定时器" U5 I6 k. Z) ]+ H4 a
        TH0=(65536-922)/256;//赋初值定时
* v# W" }: W+ x+ Q. s        TL0=(65536-922)%256;//定时1ms
& f; }6 x  i1 t  B" m& {- c# }( b        TR0=1;//打开定时器
) ~* y4 h0 H* f- A$ F        time++;
) ^, B' {9 f: r( Q  H6 a        
8 a$ |; j6 I! A        if(time<=10)
& @9 {; ?0 o8 Y/ J/ z% v& m                PWM=0;//占空比0.1
, g, c) N" L0 f5 C  {- g- X' \. a3 c5 o        else7 O/ Y. S  U2 k" O3 ?" O. u* g" a
                PWM=1;
9 u2 K7 M3 y3 a. U1 d' D        if(time>=100)" t8 h" {1 X" |/ Q4 \$ X
        {; L' C5 A0 L+ a8 v
                PWM = 0;" X7 Y: n( h9 O6 W  r
…………限于本文篇幅 余下代码请从论坛下载附件…………8 C7 v& {: l3 R; t+ Q9 r9 Y$ s' q. T- Q
# V$ J! ?' }; ?; N
4 @( g' y# ?5 S2 P; a
游客,如果您要查看本帖隐藏内容请回复

0 O+ g1 o2 n; M" D, I3 u, u& f1 H

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-7-17 13:36 , Processed in 0.125000 second(s), 26 queries , Gzip On.

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

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

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