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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

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

- J% `# L" |" C0 ^4 l* S3 |% q干簧管交叉排列,单片机读取电压值,自己实际标定之后转换为流量值
3 h6 w5 f% g+ Q- s3 U
单片机源程序:! c# q' P& o" \4 H
#include "stc12c5a60s2.h"; ?/ l! |4 [- a" w
#include "string.h"                   //字符串长度
1 ~( N0 }8 |1 T) g" C#include "intrins.h"           //_nop_或者移位操作$ x) s2 Y* a( S% r, X
#include "stdio.h"
2 u, H" O* ~, a1 T" ^
#define ADC_PWR 0x803 K  F# B& T# _; a& T8 v( Y
#define ADC_FLAG 0x10
- i, ~) n% _8 i5 H6 o9 V% |- L( O, W#define ADC_START 0x08
2 K1 A* [6 v5 T- y#define ADC_SPEEDA 0x60        //不同的值可以改变转换速度

( b1 r1 Y, ?6 F' u: z3 z$ wsbit LSA=P2^2;
" C2 K% W, V+ {1 a1 u: W( w8 y3 }sbit LSB=P2^3;+ v3 n/ ?. |) x2 ?# w& K  ?
sbit LSC=P2^4;
4 Q$ s; g5 [% ^0 a& n( tsbit PWM=P2^0;

1 z# x, i$ n9 K1 ?+ k8 Ufloat AD_Result;//储存AD转换结果! }. j: r2 y: W' x, b
#define uchar unsigned char
+ K/ f( W- ~2 G, q#define uint unsigned int
; d: _2 r& N! J4 D* M% g! s# [uchar DisplayData[8];
% D6 M4 j' c& z3 q) ^6 duchar code table[]={  //table[]里面无数字        
& i% C! y: k, K9 E8 l" x4 ~# M//共阳极代码0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,0x80, 0x90,# }: z2 v3 H9 O( a5 ?
                                        0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
" E& [& i+ m: `+ m                                        0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};  //后边带分号

/ ^& V0 y4 M8 j7 B! E1 N* dvoid delayms(uint xms)
4 q% K. J# w: O, b5 X+ V3 x8 v* H{
8 ?7 x+ l% v+ W$ @. K        uint i,j;: I- H6 ~2 ]5 z- m8 v# i
        for(i=xms;i>0;i--)          //后无分号,i=xms 即延时约xms毫秒7 C) o4 y, W6 R
                for(j=110;j>0;j--);//有分号3 d1 A5 }9 f, G1 p, U% D
}
! O$ a3 W2 ^2 U) K
void display(void)4 Y( p9 O4 p3 U$ G
{
# L4 X5 \, J  ^: K        unsigned char i;
/ b+ D, F  L" M4 j: R        for(i=0; i<8; i++)
& X0 r5 a' }# ^/ G7 {        {6 F9 q) q+ j7 w2 O- a" O
                switch(i)         //位选,选择点亮的数码管,* q4 s8 o0 l% q( ^# k
                {
3 Q7 S1 J0 C9 p+ f' @                        case(0):* b. }+ g, W, i  C: z% X4 U4 {
                                LSA=0;LSB=0;LSC=0; break;//显示第0位5 p8 w6 x5 T! m5 [( m
                        case(1):, y1 C2 O' T5 A  W
                                LSA=1;LSB=0;LSC=0; break;//显示第1位
' ]+ @# W! X1 h& A4 S6 d% i% Z                        case(2):
8 @1 H9 C6 B0 G- p, ^# D! ~1 b: u4 i                                LSA=0;LSB=1;LSC=0; break;//显示第2位
9 S: [+ H* x% E/ H$ q. D                        case(3):
/ y6 V% V! |% B6 S                                LSA=1;LSB=1;LSC=0; break;//显示第3位. S; _7 ~, H& G. y
                        case(4):
  a$ j, `' c8 Q/ k- c/ \                                LSA=0;LSB=0;LSC=1; break;//显示第4位
! Z; B& F) @$ D                        case(5):
9 T9 g' K# P2 [$ H0 T; x- Q0 E                                LSA=1;LSB=0;LSC=1; break;//显示第5位
' Z( a# f# s2 f                        case(6):
2 V+ P  V% k$ j! H- P+ ~7 X                                LSA=0;LSB=1;LSC=1; break;//显示第6位( j  m. d* q- U2 @/ a
                        case(7):
3 E; r: x% {6 T# l# P. a+ Y6 K                                LSA=1;LSB=1;LSC=1; break;//显示第7位        
$ z$ ~2 L; H) V; i4 K! }, z7 {                }9 o: O1 d: Z; q. A4 c  n, E
                P0 = DisplayData;//发送段码5 M1 h6 Q7 x3 n' X$ O  F% R$ J
                delayms(10);                 //扫描间隔时间设定
" u4 Q1 f1 u4 {7 A$ {$ M                LSA=1;LSB=0;LSC=1;        //显示小数点
- I3 g0 G6 i  F# w# p# O. |/ |                P0 = 0x80;+ r' k* Z. D  ~' _9 Y" E
                delayms(10);                 //扫描间隔时间设定3 E" O* e4 Z' f5 M! M5 c
                P0 = 0x00;//消隐
4 c  o% v( Y" p! G        }; U, D2 F. }+ n  ]% d/ P: `8 u
                //P0=table[keya];
% y3 }( H& F0 D! `! s9 t}
* d( s2 D9 J3 L/ q/*
  \0 L4 b8 C$ K8 y1 w+ Xvoid send(uchar key_num)
3 u& u: F& q( |5 [{3 @1 m# |" C4 ]( w9 y
        SBUF=key_num;
. V$ u4 G* E$ K        while(!TI);
. E  r' Y7 t% y8 Q        TI=0;/ w+ n8 M7 q1 h
}
, _2 _5 G4 L. C$ k*/  s9 \0 V! l( o% @( x! c
void Init_adc()
% d2 ?+ K7 @2 w& B0 k! O{
0 {' y0 {  C( X    P1ASF=0xff;                //P1口为使用AD转换做准备,A/D通道选择,所有的P1口作为转换接口 ,AD使用总开关1 M7 }- T$ M# J# p  G; A$ c
    ADC_RES=0;                //清零AD转换结果寄存器高位( ~  P4 K3 Z) n
    ADC_RESL=0;                //清零AD转换结果寄存器低位
+ _+ {) ~1 i. P! R8 B8 G- `    ADC_CONTR=ADC_PWR|ADC_START|ADC_SPEEDA;- h4 N2 J7 g, y+ n' i  O" ?
    delayms(1);' c) d& a9 B  a- s% `
}

: \9 ~/ g  m( Vunsigned int AD_get(uchar channel)
) m8 r# B6 }! J{4 u- a- X8 r7 e" Q! l3 n
        ADC_CONTR=ADC_PWR|ADC_START|ADC_SPEEDA|channel; //初始化ADC控制寄存器,(转换速度为90个时钟周期转换一次,模拟输入通道为通道1)% ^9 ^' m+ Z" L; ]2 M
    _nop_();           //稳定ADC控制寄存器的值                变channel 值变模拟信号输入口) Q, S" a7 |" c) k
    _nop_();
! g: Q/ L: T8 z7 n% R1 F3 u+ n    _nop_();& F+ |; c* |* p! A9 v
    _nop_();
; c2 S' z$ l. Q5 Y; a( Z    while((ADC_FLAG&0x10)==0);         //查询转换是否结束" d" D1 x1 g. a4 q; M- _
    ADC_CONTR &= 0xef;                         //清零ADC_FLAG位
% p. |  Q( `. `- m0 D) b( c. @1 k        //ADC_CONTR = ADC_CONTR & 0xef;; f* c9 V2 K* v# z1 X- {
        return (ADC_RES*4+ADC_RESL);         //返回转换结果        十位八位寄存器转换        ,去掉 ADC_RES*4则为八位
  O* n+ H3 o* v+ z  Y}

" ^) {) Q6 Y/ `' F2 H4 c* g4 Hfloat AD_work(uchar channel)  //计算结果6 P% K& @& n4 M8 z+ p* \
{0 M4 w' _  B5 G
    float AD_val;5 a  Y- Z4 W3 o* q6 ]& p3 Z' V: B. C
    AD_val=(float)AD_get(channel);
5 f" m. a9 l* R0 [2 ~/ R% Y    AD_val=(AD_val*5)/1023;        //1023对应5
: r0 O) {+ n+ U' K( M6 Y* w    return AD_val;% I; K! x) S4 p! f' [% _1 E8 J
}
! \9 K7 s4 F: N- d/ A
main()8 v- C  M: g1 O
{& \4 U7 o. `$ w# V* t4 g, m
        TMOD=0x01;//定时器0工作方式1?
! X# O9 C# R1 I2 c        TH0=(65536-1000)/256;//赋初值定时
- _3 Q" y$ _  I        TL0=(65536-1000)%256;//1ms
0 W4 @# T! l8 Z* w5 ~6 f( W) P//        EA=1;//开总中断
# O; Y0 [& s! P8 x. X- d9 k2 X        ET0=1;//开定时器0中断; d  ~' o( t" p6 i5 `' s7 Z( |
        TR0=1;//启动定时器00 s( @" d* x/ X. n( g! v* x
        TMOD=0X20;          //定时器1工作方式2, }* E$ v6 I2 W) I) t: L8 x
        TH1 = 0Xfd;          //设定初值
& B) R7 o$ `6 s" A        TL1=0xfd;6 b" t9 ]4 Y( R* E+ t# J
        TR1=1;           //启动T1
" x: h5 T0 ?8 B        SM0=0;' ^+ b7 j# S4 O8 ]2 f
        SM1=1;9 t# F( K) H3 l
        EA=1;. N! p# c3 g+ O% `) c+ D/ m  ?
        ES=1;
6 a$ B6 F, \- @; D! v. r5 S        P0=0xff;" n& g$ x6 }; z0 I, m  T$ a; Y
        Init_adc();" ?  ?. b+ j+ D. A8 B
        //display();+ g# `9 H* ?9 |  H; l
                    8 g1 L( K& ~; L( f# [) o/ C6 a
        while(1): ~0 I/ E& r1 D: E- w4 I; M
        {         
9 Q% i3 b, G$ p3 A4 `# V5 H         AD_Result=AD_work(0);        
$ B% ?) Y3 B2 ]         AD_Result = AD_Result*100;
  ~* U3 U6 B9 p5 [+ d. U
        //DisplayData[4]=DIG_CODE[AD_Result%10000/1000];
) O- w' a6 M' i. q        DisplayData[5]=table[(int)AD_Result%1000/100];% s4 A/ |# x( i5 ?9 o& N
        DisplayData[6]=table[(int)AD_Result%100/10];% X  A7 t- A) a' ?; ]
        DisplayData[7]=table[(int)AD_Result%10/1];( J; ^# v2 v- J' a6 f8 Z. N
        display();) `& j/ _- D& T  y( p
//        send(k);        - x2 a+ J7 f9 X4 A; `! K
        }

5 r. n6 c! ^. C6 j" m- m. x' K4 K6 x3 q  J9 N1 z& B" t5 @- D$ b
}
! o1 N& J+ C9 c9 ]# }void tim0() interrupt 1" l  t- o$ W7 B7 k  h" m9 q5 Y
{" S, u% l+ M: J
        uchar time;
' b  m4 k: z; X. k- q        TR0=0;//赋初值时,关闭定时器+ }4 `9 ]; Y# v' E- p3 q+ h- ^, n
        TH0=(65536-922)/256;//赋初值定时
2 p. C# e' G& Z6 B. `4 a' V        TL0=(65536-922)%256;//定时1ms ( u2 r- D3 V* G  I7 z3 s2 I
        TR0=1;//打开定时器
5 |" }5 @" ?2 t/ V        time++;
6 Z0 }1 \+ q/ j        0 l1 a3 H1 h6 X3 ^) D1 k; P* G" P
        if(time<=10)4 B, j% H8 E3 R2 d
                PWM=0;//占空比0.12 {4 K5 H# ~: g% J
        else
1 w& g5 @( c4 H  R% ~; ^; O! J2 x3 Y                PWM=1;
* B3 y1 m. {& S' q! J        if(time>=100)
" [/ J2 C/ `7 K; w1 o% D- V/ ^        {
  \* j( ^1 C0 S" |; N                PWM = 0;
8 @+ q5 J: ?0 G  l…………限于本文篇幅 余下代码请从论坛下载附件…………
1 L5 U7 V4 k2 {/ X1 A8 f) F$ _( }  d3 L, l1 N
" W9 N, T" Y4 f3 P$ d- T$ S
游客,如果您要查看本帖隐藏内容请回复
  F9 n, u9 f* p# e

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-6-7 03:08 , Processed in 0.078125 second(s), 26 queries , Gzip On.

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

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

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