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