$ p! `& w8 s7 W! U+ q! H& |
简易数字电压表设计
3 {+ F8 w4 [1 R设计要求
q7 S1 ]' L6 a$ w: m# W设计要求:
- 能用数码管显示电压值
- 可以测量0~5V范围内的4路输入电压值
- 其测量最小分辨率为0.02V
- 在4位LED数码管上轮流显示或者单路显示
# @1 ~, c4 D p) _% |! W9 |
1、 前言
' H; f; z2 n* C9 L5 n8 m7 i+ V随着微电子技术的不断发展,微处理器芯片的集成程度越来越高,单片机已可以在一块芯片上同时集成运算部件、控制部件、数据存储器、程序存储器、定时器/计数器中断系统,这就很容易将计算机技术与测量控制技术结合,组成智能化测量控制系统。
数字电压表(Digtal Voltmeter)简称DVM,它是采用数字化测量技术,把连续的模拟量(直流输入电压)转换成不连续、离散的数字形式并加以显示的仪表。与此同时,由DVM扩展而成的各种通用及专用数字仪器仪表,也把电量及非电量测量技术提高到崭新水平。本文重点介绍基于单片机的简易数字电压表。目前,由各种单片A/D 转换器构成的数字电压表,已被广泛用于电子及电工测量、工业自动化仪表、自动测试系统等智能化测量领域,显示出强大的生命力量。
本设计是基于STC89C52单片机的一种电压测量电路,该电路采用ADC0809进行A/D转换电路,测量范围为直流 0~5V 的4路输入电压值,并在四位LED数码管上显示,测量最小分辨率为0.019V,测量误差约为正负0.02V。
% j a) d! m8 I3 w, n
" ] [2 e( |- k* [8 c# Y
1 q9 G6 S$ y" U8 q* C2、方案选择与论证6 m" m6 U- L* v4 Q( F5 G; {% n
2.1方案一
$ \" T* p( l! p& V- r# OA/D转换器采用ICL7107型三位半显示的芯片,输入信号,流经取样电路取样后送到ICL7107型三位半A/D转换器,只需要很少的简单外围元件,就可组成数字电流表模块,直接驱动三位半LED显示器显示,最后输入电流在显示部分显示。此方案的方框图如图2-2-1所示。
![]()
# K4 M- e1 L, t* D4 h' n3 H X6 m- d
: h) L# u3 l# A2 R/ a5 T
1 ~0 }3 s# s7 C! R% y0 A4 E
0 s9 P2 Y+ g/ q( L" I. ]6 H. B& O# W9 {9 ?, g+ v# ]% U
( N5 m m, K5 ~5 e# \' K
; Y) i9 p5 A R& Z
1 H# H' T- z1 b![]()
3 I5 k. W4 u. P3 X4 T2 o1 B* @4 y0 r, s, p, q' ], k2 G
7 T7 g* ?- f+ O/ X) F$ J
) T5 a# x: X! X# J. ?
% ^1 ^% _9 |: C7 ?3 A4 Q5 C* |
- G2 O6 a8 p9 q1 B1 G2 T( D$ U: F+ o
. K9 z$ K0 S. z0 z+ o$ _. n7 G
( L: \) `; H8 \7 R- r! B
0 \3 e3 g5 Z5 j9 }, g
l$ `" C% x* y) k- `& X6 y" ?* [* \6 U) o0 N- k& D- }
' Y& E+ G; W, O. B2.2方案二5 n i% |4 m @6 {2 x
STC89C52是一种低功耗、高性能CMOS8位微控制器,具有 8K 在系统可编程Flash 存储器。使用STC公司高密度非易失性存储器技术制造,与工业80C51 产品指令和引脚完 全兼容。片上Flash允许程序存储器在系统可编程,亦适于 常规编程器。STC89C52具有以下标准功能: 8k字节Flash,256字节RAM, 32 位I/O 口线,看门狗定时器,2个数据指针,2个16 位定时器/计数器,一个6向量2级中断结构,全双工串行口, 片内晶振及时钟电路。另外,STC89C52 可降至0Hz 静态逻 辑操作,支持2种软件可选择节电模式。空闲模式下,CPU 停止工作,允许RAM、定时器/计数器、串口、中断继续工 作。掉电保护方式下,RAM内容被保存,振荡器被冻结, 单片机一切工作停止,直到下一个中断或硬件复位为止。方案二的方框图如图2-2-1所示:
![]()
* o v2 c6 L" l; r- b- S+ L' E) X P, r% V
- \! Z# |* G0 z& m
; Y' C6 z. @3 k g* v
0 P8 G5 }. r8 m) ~
0 c2 I, r5 l5 y9 U* n
. @0 S. v& ?8 e) `8 M$ x( O; i7 g: F7 `! d; q
/ e9 ~* I- r8 Y5 c9 r3 x1 u
4 r4 w# x6 [/ x
" g. p5 _" q- p) ^1 H/ x: |9 E4 ?) e x
$ o! B$ T2 i, Y/ m: P9 w
! J% V3 O: y7 O+ T
2 @6 F# Y% s8 _! ^* n, I0 |, O7 S: e# A/ o2 b7 o
! y( ^6 J! d( K, X4 z
' E# G. U" y4 m5 V4 N: a
$ z# }% B) Z/ g" q y5 l
1 k6 i7 d( r5 @/ Y2.3方案对比与选择
; ^9 z# |1 B1 @方案一: ICL7107做的LED数字表,能直接驱动共阳极的LED显示器,不须另加驱动硬件,缺点就是数字乱跳不稳定,特别最后一位。并且本人对此电路不是很熟悉,我们平时学的都是STC89C52,也有相应的单片机板子。
方案二:采用单片机作为系统的控制单元,通过A/D转换将被测值转换为数字量送入单片机中,再由单片机来送显。此方案各类功能易于实现,成本低、功耗低,显示稳定。
通过比较,我选择方案二。
) H3 \5 z$ _. D% I% d, j2 h4 X8 x. c* Z& K ?# }0 B5 M
* P0 W: m( p6 z3 I% l! r% D5 r* B8 m
, W& z% Q1 O1 t
* a- v& l* }1 ^/ D) M% _
6 H: ~. @, q* t8 E, q: C" [! ^- @# k
9 g: S) |+ z: J* I
8 Z& @9 x) j& j% A! l' Q, h2 I7 a c( ^3 Q+ G
9 i x$ @5 i8 ~/ J% z3 单元电路设计- k0 l4 a( E# a+ z
设计方案
硬件电路设计由7个部分组成; A/D转换电路,STC89C52单片机系统,数码管显示系统、时钟电路、电源电路,、复位电路以及测量电压输入电路。
3.1单片机系统
' H% p$ D- @2 Q2 W3 j [本次课程设计选择的单片机是STC89C52,之所以选择这块芯片,是因为该芯片的各项功能均符合本次课程设计的指标要求,并且该芯片有很多成熟的资料供我们学习,使用起来很方便,也有专门的下载程序平台,方便现场调试。本实验所用的单片机板子原理图如图3-1-1所示。
![]()
* A: B/ e5 _# C' F) ?- q$ r
' U2 p, d3 C( D![]()
4 ?; p. M; F* r# o V) Y- B
% Q/ [, H g" d* v" u0 v8 y, `+ W& U0 c2 a% m2 P$ f w% [& S
3.2时钟电路; q% a/ Z/ T- f* y% t8 G
单片机中CPU每执行一条指令,都必须在统一的时钟脉冲的控制下严格按时间节拍进行,而这个时钟脉冲是单片机控制中的时序电路发出的。CPU执行一条指令的各个微操作所对应时间顺序称为单片机的时序。MCS-51单片机芯片内部有一个高增益反相放大器,用于构成震荡器,XTAL1为该放大器的输入端,XTAL2为该放大器输出端,但形成时钟电路还需附加其他电路。
本设计系统采用内部时钟方式,利用单片机内部的高增益反相放大器,外部电路简,只需要一个晶振和 2个电容即可。
) |2 J# p, g9 t; V- U. |1 [
6 Z8 r- M& P# i: ^" t0 }
图 3-2-1时钟电路
- L- x3 O) c. }/ L7 L% N0 N
/ k. _. n4 U; V& \- Y+ C3 u3.3电源电路
& K" M( ?6 E. o如图3-3-1:通过数据线的USB接口与电源相接,给单片机供电。
1 A" A4 Z. a6 {
1 F2 n7 ^" T8 S! X7 O. ~" F4 E
$ ^' t" Z& W0 I& k, C( r+ H [6 a0 `2 v# z' B. x3 ?
|4 v. [( p1 p" }* ]3 O* f$ ?3 z) q3 ^: l
) v# X4 l4 o9 [ P![]()
% }( U/ S. I- ~8 p R: W; v3 e
( o4 w" M5 \2 `" k2 g3.4复位电路
9 c4 @. q( y+ F# W! o( ~复位电路工作原理如图3-4-1所示,VCC上电时,C充电,在电阻上出现电压,使得单片机复位;几个毫秒后,C充满,电阻上电流降为0,电压也为0,使得单片机进入工作状态。工作期间,按下摁键放电,松手,C又充电,在电阻上出现电压,使得单片机复位。几个毫秒后,单片机进入工作状态。
0 o% h3 ]3 O. S3 @: ~5 S) a2 `) m; m* G: h; d6 @
: T& m$ ~2 v- H! }: G
0 G; ?- z' _/ }% c$ n0 y" n![]()
( E0 n: L% [. R9 p `- c" z
, F; M5 W1 F- ?3 C& E7 ]8 f) _2 R; ^
3.5 A/D 转换电路8 ~( O$ k% X2 h1 X6 |# t3 u, t
原理图如图3-5-1所示,本设计用的ADC0809是8位A/D转换器,每采集一次一般需 ![]()
5 P1 D; n; b- E
。本设计采用中断方式读入A/D转换结果,在中断方式下,A/D转换结束后会自动产生EOC信号,本设计中该信号与CPU的外部中断0相接。 _' ?# ^& A3 \' b+ |' v, p( C N
; I; k$ l6 O7 d5 K$ X' V
3.6 显示电路设计( J# W# G' W! I6 O0 {4 K3 v8 J
LED是发光二极管显示器的缩写。LED由于结构简单、价格便宜、与单片机接口方便等优点而得到广泛应用。在单片机中使用最多的是七段数码显示器。本次采用的是共阳极7端数码管,并且采用软件译码的方式,既简化了硬件电路又增加了程序编写的灵活性。其电路原理图如图3-6-1所示。
& @: H" {3 R W5 N' |7 B" x8 `( N. m
![]()
) o- N" U9 N U6 X
* w) Y7 i% y7 X/ V) ]" N- K
3 H* [" P, |# F& b/ g$ P
% N) ~; U) r# [- q, O
2 l6 F; e% }$ V/ R$ F8 J! f5 v1 C' Y3 ^! @% T$ ]# i1 W
, N9 J- `3 \* Z! t) k/ O. w
; |! `3 @; V8 D$ V, C
0 v4 {9 \+ L" ]7 [+ O2 E
9 }/ w* i; s& ~
! N2 n- z5 z) x; ^2 v4 Y
& G* q) h+ D7 J: o
4 K( _ R+ d4 R# ^7 r2 v
$ z2 v$ m0 E7 Z% I1 F: q( M% T7 t1 f! w( g3 E/ t. r
" @0 L. U, ^. [- l$ d, u+ F) S( |6 C9 I本课程设计利用8255可编程并行口芯片,实现数据从STC89C52输入,用8255PA和PB口做输出,其中用PA口控制数码管的位选信号,表3-6-1为PA口控制位选信号的编码;用PB口控制数码管的段选信号,表3-6-2为共阳极数码管的段码表。
$ F# y" c. N; D) N9 v
表3-6-1 数码管的位选码
) v/ ` _* C; w3 l: i2 a9 }9 K
表3-6-2 共阳极数码管的段码表
% A$ W: W0 y/ c- X
) \/ e' T' c- g( Y7 V
3.7 总体电路设计此电路的工作原理是:+5V模拟电压信号通过变阻器分压后由ADC0809的通道进入(本设计用到IN0、IN1、IN2、IN3四个通道),经过模/数转换后,产生相应的数字量经过其输出通道D0-D7传送给STC89C52芯片的P0口,STC89C52和8255负责把接收到的数字量经过数据处理并产生正确的7段数码管的显示段码传送给四位LED,8255的PA口产生位选信号控制数码管的亮灭。此外,STC89C52还控制ADC0809的工作:START与单片机的P2^7相连;CLK与单片机的P2^0相连;EOC与单片机的P3^4相连;OE与单片机的P2^3相连;数据输出端与P0口相连。工作是先将START置为低电平,再置为高电平,产生一个上升沿从而清除内部寄存器;然后再将其置为低电平,产生下降沿,从而启动控制电路开始A/D 转换。转换结束后EOC输出一个宽为8个CLK周期的正脉冲,通过检测该信号把OE置为1,即允许数据输出,暂存转换结果后再关闭输出。把暂存的数据取出并把其换算为十进制数字,通过数码管显示出电压值。
4路电压值轮流显示的原理:硬件上把ADC0809的ADD A与P1^0相连,ADC0809的ADD B与P1^1相连,所以会伴随有LED亮灭现象。其通道选择与对应的LED亮灭现象如表3-7-1所示,同时通过数码管显示通道“0”“1”“2”“3”。
表3-7-1 通道选择与对应的LED亮灭现象
9 S, ` n" y3 ?- {# r* p: z. |
" C. T3 G5 _. }. E
简易数字直流电压表的硬件电路已经设计完成,就可以选取相应的芯片和元器件,利用Proteus软件绘制出硬件的原理,并仔细地检查修改,直至形成完善的硬件原理图。但要真正实现电路对电压的测量和显示的功能,还需要有相应的软件配合,才能达到设计要求。
4、程序设计与调试4.1 程序设计总方案
; z7 l( L8 q2 e! [7 B本程序利用KEIL软件进行程序编写,根据模块的划分原则,将该程序划分初始化模块,A/D转换子程序和显示子程序,这三个程序模块构成了整个系统软件的主程序,如图4-1-1所示。
% a5 F ]8 K) ?- y, J( T
图4-1-1 数字式直流电压表主程序框图
6 g# k( ]% D h& k/ u* }# T4.2 程序调试
' c- G, B1 z& c/ Y: F% a软件调试的主要任务是排查错误,错误主要包括逻辑和功能错误,这些错误有些是显性的,而有些是隐形的,可以通过仿真开发系统发现逐步改正。编好程序后,在KEIL平台下对程序进行调试,本课程设计的程序是用C语言编写的,由于程序代码不多,因此调试也较为顺利,但还是遇到一些问题,因此也学到了不少东西,积累了一些调试经验。
+ F( D& y! G Q( G! _2 K
0 j" V; _. O& _/ e5、结果显示及误差分析5.1 结果显示(1)IN0口输入电压值为3.93V时,显示结果如图5-1-1所示,测量结果为3.95V,误差为0.02V。
![]()
: {: w8 L( M9 r( M0 o: Y4 i- h
前一位为通道数,后三位为实际电压值。
$ h( o# J& }! g![]()
8 a" C3 b! f8 v1 O: h8 B8 L4 P7 c
! F8 Y0 M+ S9 s) k. z% [
1 F$ a. ~0 a% X
0 I. T- n8 G7 K) ^图5-1-1
# I; [5 O Q/ d! J+ l3 R
(2)当IN1输入电压值为3.57V时,显示结果如图5-1-2所示。测量误差为0.01 V。
P+ P$ |0 E; m: P
* x% F) A& _1 m, R2 [
9 _. G t' ^- X; O图5-1-2
(3)当IN2口输入电压值为2.77V时,显示结果如图5-1-3。测量误差为0.00V。
" N7 N I& E( r8 P7 g5 D6 k
7 }+ m/ _8 b( z5 [图5-1-3
2 P% M- M5 T4 l' k( I(4)当IN3输入电压值为1.50V时,显示结果如图5-1-4所示。测量误差为0.01 V。
! e; W+ u) c; d
$ P/ q7 t% a, {, f7 s, O5.2 误差分析. [' ~7 }% \% p2 H- h: R% t" }& i
通过以上仿真测量结果可得到简易数字电压表与“标准”数字电压表对比测试表,如下表5.2.1所示:
表5.2.1 简易数字电压表与“标准”数字电压表对比测试表
9 J1 T$ [8 d: Q8 j" r
由于单片机STC89C52为8位处理器,当输入电压为5.00V时,ADC0804输出数据值为255(FFH),因此单片机最高的数值分辨率为0.0196V(5/255)。这就决定了电压表的最高分辨率只能到0.0196V,从上表可看到,测试电压一般以0.01V的幅度变化。
从上表可以看出,简易数字电压表测得的值基本上比标准电压值偏小0-0.01V,这可以通过校正ADC0809的基准电压来解决。因为该电压表设计时直接用数据线的USB接口接上电源作为测量电压,且数据线上有电压损耗,所以电压可能有偏差。当要测量大于5V的电压时,可在输入口使用分压电阻,而程序中只要将计算程序的除数进行调整就可以了。
0 e4 G1 U) y" R* u' H" k
/ X1 [. r$ z' J2 d8 T8 J
; ~ E0 B' B d# V. d! w$ g& ^# r- q. p2 p
8 ?% y! h: r- U* S$ x* s2 y2 s$ ^) f5 ]8 M! o+ a
6、设计总结5 h% S( V, O& W+ ]
通过本学期对单片机原理及应用这门课程的学习完成这次课程设计让我们对此门课程有了更深的认识,为期两个星期的课程设计不仅巩固了我们的理论知识而且也培养了我们的动手能力,同时也让我们认识到理论与实践的差距,让我们受益匪浅。
首先在课题的设计过程中,不仅要运用到课堂学到的知识,还需要查阅不少单片机相关的资料,对我们学习用的单片机板子的原理图进行详细地了解。经过一段时间的努力,基于单片机的简易数字电压表基本完成。但设计中的不足之处仍然存在。在这过程中,我对电路设计,单片机的使用等都有了进一步地认识。通过这次设计我加深了对Keil软件的使用方法,掌握了从系统的需要、方案的设计、功能模块的划分、原理图的设计和电路图的仿真的设计流程,积累了不少经验。
通过本次设计,提高了自己的能力,无论是在硬件连接方面还是在软件编程方面。本次设计采用了STC89C52单片机芯片,与以往的单片机相比增加了许多新的功能,使其功能更为完善,应用领域也更为广泛。设计中还用到了模/数转换芯片ADC0809,以前在学单片机课程时只是对其理论知识有了初步的理解,做实验时也很少自己去编写程序,只是在原有的程序下了解然后做一些小的修改完成老师要求的扩展实验。通过这次设计,对编程有了更深的理解。在调试过程中遇到很多问题,硬件上的理论知识学得不够扎实,对电路的仿真方面也不够熟练。
总之这次电路的设计和仿真,基本上达到了设计的功能要求。在以后的实践中,我将继续努力学习电路设计方面的理论知识,并理论联系实际,争取在电路设计方面能有所提升。同时在课程设计的自主设计、学习和研究过程中,通过写课程设计的总结报告,初步训练我们的书面表达能力。组织逻辑能力,这些技能应用性强,对我们的将来就业和进一步发展帮助较大。同时也加强了我们对课本知识的理解,使我们做到理论和与实际的联系,收获很大。并且我们也深深地体会到自己所学知识的不足,激发了我们的自学能力和应对挑战的能力。为今后学习打下了良好的基础,培养了我们严谨务实,戒骄戒躁的作风,为我们的未来做了很好的铺垫。
+ k9 q% ?& V$ c
9 {5 z3 i# b" d5 w; e3 r7、主要芯片资料7.1 STC89C52其引脚图如图7-1-1所示:
* @7 ^5 S2 v2 F( G: ] ?! K9 @9 U o2 J; P3 j$ ?$ i. @
( _4 Q9 v1 t: W! d
5 f& G9 i. v! t' J
6 m, _) P# o8 n& F0 q
- m/ J$ B0 c" ?" R5 p2 m/ H) A A& q) }1 p& U# ?" t
5 v i5 {) i: q# p9 _
$ }, T7 H- f" x$ }' [* x2 H0 V5 d) K; R$ z+ V8 B
/ P$ A9 S- B$ `& D, L8 L7 r/ M# @) o& N9 }
1 j: @! H; T+ Q/ u9 |
![]()
! z, b/ |9 D1 v% ?% \, `; A3 F* T! ]; g5 O+ W: t
部分引脚功能说明:
Vcc(40脚):接+5V电源正极;
Vss(20脚):接+5V电源地;
XTAL1(19脚):接外部晶体的一个引脚;
XTAL2(18脚):接外部晶体的另一端,在单片机内部接至反相放大器的输出端。
RST/VPD(9脚):当振荡器运行时,在此引脚加上两个周期以上的高电平将使单片机复位(RST);
P0口(P0.0~P0.7):为双向8位三态I /O口,当作为I /O口使用时,连接外部I /O设备由于输出的驱动电路工作于开漏状态,因此需要外接上拉电阻。P0口还是地址总线低8位及数据总线分时复用口,可驱动8个TTL负载;
![]()
4 m+ j: A9 _" E0 N. t
P1口(P1.0~P1.7):为8位准双向I /O口,它的每一位都可以分别定义为输入线或输出线,可驱动4个TTL负载;: R$ E8 j; Z2 J
P2口(P2.0~P2.7):为8位准双向I /O口,当作为I /O口使用时,可直接连接外部
I /O设备。它是与地址总线高8位复用,可驱动4个TTL负载;
P3口(P3.0~P3.7):为8位准双向I /O口,是双功能复用口,可驱动4个TTL负载。
' r5 J! Z9 f! l7.2 ADC0809
# d" A3 @' }5 F0 F! P' ~; fADC0809是一种8路模拟量输入、8位逐次逼近法 A/D,转换时间在典型时钟频率下约为100 微秒,适用于多路数据采集。
ADC0809的引脚图如图7-2-1所示:
# j% ^3 L9 t1 \( y! y9 B4 } J3 {$ D
6 k+ ~. `6 _2 F! W
$ m' b8 E) Z2 }2 O; U1 X
; q/ i) {$ R3 R; t# n; v7 o, t+ {: M9 o! p2 h* z/ o0 }6 a8 v$ v" u
8 g: C* S! `: `' i$ k9 O- _5 }& j
1 T" J. x( g4 k( D
9 \8 S/ K$ E8 H) u- K6 ^5 C8 @0 B! e) a2 \
![]()
; k4 r8 r3 g5 d2 ]2 c: S* d$ J& N! j& b0 g5 R
, f v& C6 m9 QADC0809的引脚功率如下:
IN0~IN7:8路模拟量输入线;
2-1~2-8 :8位三态数据输入线,常用D7~D0表示;
A、B、C:模拟通道选择输入线;
ALE:通道锁存控制信号输入线,ALE电平正跳变时可以锁存A、B、C上的地址信息,经译码后控制IN0~IN7中哪一路模拟电压送入比较器;
CLOCK:转换时钟输入线,CLOCK的频率范围为10~1200kHz,一般取640 kHz(此时转换速度为100微秒);
START:启动转换信号控制信号输入线,该信号的上升沿清除内部寄存器,下降沿启动控制电路开始A/D转换;
EOC:转换结束信号输出线,转换结束后EOC输出一个宽为8个CLK周期的正脉冲;
OE:输出允许控制信号输出线,OE为高电平时把转换结果送数据线2-1~2-8,OE为低电平时2-1~2-8为浮空态;
Vcc:主电源+5V;
GND:数字地;
VREF+:参考电压输入线,VREF+≤Vcc;
VREF-:参考电压输入线,VREF+≥GND,应保证VREF++ VREF-= Vcc。
7.3 8255A8255A是Intel公司生产的可编程并行接口芯片,它具有3个8位的并行I /O口,分别称为 PA、PB、PC口,其中PC口又分为高四位和低四位口,它们都可以通过软件编程来改变其I /O口的输入输出工作方式。8255A在单片机应用系统中被广泛用作可编
程外部I /O扩展接口。
8255A的引脚图及其内部结构图如图7-3-1所示:
![]()
4 @8 Y0 ^9 T5 Q9 j8 ^$ e2 g3 H% D
+ k6 Y; S7 d0 J- s
8、参考文献
- ]& ?$ S9 ]" q1 s# J6 }[1] 杨恢先,黄辉先,等.单片机原理及应用[M]. 湘潭:湘潭大学出版社,2013.1.5 _6 |3 s; _$ h6 y6 F9 x% s2 N
[2] 于殿泓,王新年.单片机原理与程序设计实验教程[M].西安:西安电子科技大学出版社,2007.5.& r- W u9 @0 n n0 O+ ~. X, ]
[3] 周兴华.手把手教你学单片机C程序设计 [M].北京:北京航空航天大学出版社,2007.$ y/ v- m; J: J/ f
[4] 马忠梅,等.单片机的C语言应用程序设计(第4版)[M]. 北京:北京航空航天大学出版社,2007.1 E1 `# k) }' a7 U! n
[5]李光飞,楼然苗,胡佳文,等.单片机课程设计实例指导[M]. 北京:北京航空航天大学出版社,2004.1 }0 n* b% l4 W5 z- G
[6] 李光飞,李良儿,楼然苗,等.单片机C程序设计实例指导[M]. 北京:北京航空航天大学出版社,2005.
# |/ c: V% g; Q; o+ ?0 x0 e& a/ d, R9 K I% I+ D
) w$ `0 @0 N$ y3 C
9 S7 Y1 l6 k' Z/ m f; L; s$ d' a- z9 s5 [) Q
G `* d: d1 f ~# J3 h8 ]
4 W1 R4 m) g* W& o/ W' E% z, Q( I$ g6 M4 W; u' i
: _/ m$ E' ~- i9 Q
% S8 ~# n+ @9 u- o- _5 x5 y T
. _& N2 Q J5 h- u+ l
, q7 m+ N+ N$ Z: @" M: L
* k3 X- d' `% n# o( U$ }% @ U3 U2 r* d- S5 Z) `( [( i' {2 {
- x% h6 J* G/ w# k, z* V A
! y* w& B/ h m1 W/ r* u
+ z6 ?8 W. K, _* V) c9 M* [
$ |7 K9 @: p0 ^9、致谢 此次的课程设计能顺利完成,首先要感谢学院提供我们这个宝贵的平台,让我们有这个机会去锻炼自己,发展自己。还要感谢老师们和学长的细心指导,是你们的指导使我们一步一步走向成功。课程设计中到充满了欢笑和泪水,我们为了一小块的成功而高兴,为了一时的困难而沮丧,但是整个过程让我们收获了不少,动手和动脑能力得到了加强,学到了许多书本上学不到的知识。总之,我们在课程设计中学到了许多,真是一言难尽。在这里我们谢谢老师和同学们的帮助,真诚地谢谢大家!
( G* J' N1 [8 D8 ? h. X C u/ p
8 S' y7 K5 \( y
; C7 C D5 i$ e" e
2 T. Q0 u2 N+ m( A" r" n! ^
9 p' ], j" w! F$ W1 k6 X; `/ |. k- P% Y1 d
/ Q+ F2 [+ p' b3 U$ V6 n$ a( B9 o h+ W6 t4 T2 N2 ^9 w
- U* X$ O6 G% f4 Q B9 x: C& v3 y. l& n: S' A6 u
) c5 |' w; `3 H* @7 y( J2 `+ X
( B7 |0 m+ q) I8 ]2 I
: d* a4 Y9 o' j) ]5 T: x9 X% a a5 m4 U5 f
1 ?& P" I* ?+ o8 Y1 v5 J
1 }: g S: x% g6 X8 j% G( v j$ r! c* M: ^6 s
. S- N0 }9 l, O- ~! X3 ]( g
# s% U c- o' ]" h3 ^& s8 u10、附 录附录 C语言源程序
单路显示:
#include<reg52.h>
#include <absacc.h>
#include <intrins.h>
#define A8255_PA XBYTE[0xD1FF] /*PA口地址*/
#define A8255_PB XBYTE[0xD2FF] /*PB口地址*/
#define A8255_CON XBYTE[0xD7FF] /*控制字地址*/
sbit start=P2^7;
sbit oe=P2^3;
sbit eoc=P3^4;
sbit clock=P2^0;
code unsigned char dispdata[10]={ 0xA0,0xBB,0x62,0x2A,0x39,0x2C,0x24,0xBA,0x20,0x28};//‘0’‘1’‘2’‘3’‘4’‘5’‘6’‘7’‘8’‘9’
code unsigned char dispdatad[10]={ 0x80,0x9B,0x42,0x0A,0x19,0x0C,0x04,0x9A,0x00,0x08};// 带小数点的数字显示
code unsigned char wei[3]={0xDF,0xEF,0xF7,};// 右边第一个数码管,第二个数码
unsigned char getdata,num[3],count=20;
void init()
{
TMOD=0x01;
TH0=0x3C;//50ms
TL0=0xB0;
TR0=1;
EA=1;
ET0=1;
A8255_CON=0x80;
A8255_PB=0xFF;
A8255_PA=0xFF;
}
void delay(int x)
{
int y;
for(;x>0;x--)
for(y=100;y>0;y--);
}
void display()
{
unsigned char i;
for(i=0;i<3;i++)
{
A8255_PA=wei;
if(i==2)A8255_PB=dispdatad[num];
else A8255_PB=dispdata[num];
delay(5);
}
}
void xch()
{ float temp;
unsigned int buf=0;
temp =(float)getdata ;
buf =(unsigned int)temp*19.53;
num[2] = buf/1000; //个位
num[1] = buf/100%10; //小数点后第一位
num[0] = buf/10%10; //小数点后第二位
}
void main()
{
init();
while(1)
{
if(count==20)
{
count=0;
start=0;
start=1;
start=0;
while(eoc==0)
clock=~clock ;
oe=1;
getdata=P0;
delay(10);
oe=0;
xch();
}
display();
}
}
void int0() interrupt 1 using 0
{
TH0=0x3C;
TL0=0xB0;
count++;
}
多路显示:
#include <reg52.h>
#include <absacc.h>
#include <intrins.h>
#define A8255_PA XBYTE[0xD1FF] /*PA口地址*/
#define A8255_PB XBYTE[0xD2FF] /*PB口地址*/
#define A8255_CON XBYTE[0xD7FF] /*控制字地址*/
sbit start=P2^7;
sbit oe=P2^3;
sbit eoc=P3^4;
sbit clock=P2^0;
sbit adda=P1^0;
sbit addb=P1^1;
code unsigned char dispdata[10]={ 0xA0,0xBB,0x62,0x2A,0x39,0x2C,0x24,0xBA,0x20,0x28};//‘0’‘1’‘2’‘3’‘4’‘5’‘6’‘7’‘8’‘9’
code unsigned char dispdatad[10]={ 0x80,0x9B,0x42,0x0A,0x19,0x0C,0x04,0x9A,0x00,0x08};// 带小数点的数字显示
code unsigned char wei[4]={0xDF,0xEF,0xF7,0xFB};// 右边第一个数码管,第二个数码管,第三个数码管,第四个数码管
unsigned char num[4],count=20,xbit;
void init()
{
TMOD=0x01;
TH0=0x3C;//50ms
TL0=0xB0;
TR0=1;
EA=1;
ET0=1;
A8255_CON=0x80;
A8255_PB=0xFF;
A8255_PA=0xFF;
}
void delay(int x)
{
int y;
for(;x>0;x--)
for(y=100;y>0;y--);
}
void tongdao(unsigned char ch)
{
switch(ch)
{
case 0: adda=0,addb=0;break;
case 1: adda=0,addb=1;break;
case 2: adda=1,addb=0;break;
case 3: adda=1,addb=1;break;
default: break;
}
}
void display()
{
unsigned char i;
for(i=0;i<4;i++)
{
A8255_PA=wei;
if(i==2)A8255_PB=dispdatad[num];
else A8255_PB=dispdata[num];
delay(5);
}
}
void xch(unsigned char data1)
{
float temp;
unsigned int buf;
temp =(float)data1;
buf =(unsigned int)(temp*19.53);
num[3] = xbit;
num[2] = buf/1000; //个位
num[1] = buf/100%10; //小数点后第一位
num[0] = buf/10%10; //小数点后第二位
}
unsigned char ADC_change(unsigned char ch)
{
unsigned char value;
tongdao(ch);
if(count>=20)
{
count=0;
start=0;
start=1;
start=0;
while(eoc==0)
clock=~clock ;
oe=1;
value=P0;
delay(10);
oe=0;
}
return value;
}
void main()
{
unsigned char i,n;
init();
while(1)
{
+ z# h a0 m- _% z
…………限于本文篇幅 余下代码请从论坛下载附件…………