|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
51单片机ADC0832和1602显示电压值 proteus仿真
8 Y1 |5 \) e4 ^- d3 D7 [/ E" K( n. V$ b# N3 w
' \2 L/ G* z0 K7 }+ k0 z* }proteus仿真关于51单片机ADC0832的下面是原理图:( E3 U/ t7 j8 [5 z
; J, p8 ~% D" `* N A) y
5 @6 V6 K) a; a+ `/ y* g
. d4 r6 O* ^9 }9 A, ]
/ T, v8 O4 A' w单片机源程序:, \+ A, _3 Q$ R4 O8 _0 t
#ifndef ADC0832_H6 F3 p$ U4 ^3 N( P$ M9 m/ M- D
#define ADC0832_H3 q" k$ U/ C1 D8 v, i) j, v
2 T9 p/ n5 [0 M% v h1 f
; t6 g; k) H$ J; e: I% {
" ^8 t6 P$ B- o7 u; I5 l; y4 |+ b0 @* Y
sbit CS_0832 = P1^4;5 o% C7 h4 o2 S5 S3 H3 ^) p8 \
sbit CLK_0832 = P1^5;
: f" Y' ?4 b5 ?0 v% z3 }sbit DO_0832 = P1^6; // DI、DO不同时有效,可共用一个接口: |5 O* e' ~' P1 G1 ^+ y1 {
sbit DI_0832 = P1^7;' s# W* J6 A: E' ~3 H
& Z4 ]3 T# B5 S4 W
. _/ e5 V @. e3 b
8 i$ k5 y: L8 t! D% S X1 n+ i# S" r/ a2 B& {5 O3 y
extern void _nop_ ( void );/ ]* I% E0 ^1 Q: Z l0 Y$ d
#define pulse0832() _nop_();_nop_();CLK_0832=1;_nop_();_nop_();CLK_0832=0% z$ Y1 T& f' L
: z9 |# X: X* ], Z7 a//把模拟电压值转换成8位二进制数并返回. {$ K0 W8 \' x' x. c V J
unsigned char read0832()8 Q3 \: y7 G& {- d
{* h5 J7 j V9 O5 E2 V, U& R, c
unsigned char i, ch = 0, ch1 = 0;
: j6 x7 t" _% y" n CS_0832=0; // 片选,DO为高阻态
6 H( j9 I& {+ U 0 F6 J) \: e Z! u# I( W
DI_0832=1;
* N) q1 l& L z* z- O2 s% D" Y; f9 ~
# y2 ~6 h& ` A0 u // 此处暂停T-SetUp: 250ns (由pulse0832完成)5 x$ f5 Q Z; R
pulse0832(); // 第一个脉冲,起始位,DI置高: N, ]2 Q1 j9 w t2 d: E
5 E" j* H# M" `5 p+ F2 F# q; q# y DI_0832=1;
& R6 X" \0 y5 g. a/ t) _4 ^& o2 x pulse0832(); // 第二个脉冲,DI=1表示双通道单极性输入% p; b0 R' V: g, _6 v) [
, V4 I% e0 \! y! T+ V
DI_0832=1;3 W! U2 f& I6 j# Q
pulse0832(); // 第三个脉冲,DI=1表示选择通道1(CH2)1 N+ Q% x' k' l
1 l0 _0 S$ C1 C" s; B/ c. U1 A // 51单片机为准双向IO口:应先写入1再读取6 c0 c' _ m+ s; D9 c
DI_0832=1;
" L* G* V6 J( S& V, T/ D$ \
8 t0 u4 T( J5 }: Q' H0 Z* j/ x/ B // MSB FIRST DATA/ o5 E0 p8 n. U) u6 q0 C6 ?
for(i = 0; i < 8; ++i) {
5 m/ [! ?9 [& N5 k8 O2 x pulse0832();
6 q* h. d1 M0 q; N0 s' ~+ { ch <<= 1;, N+ z3 b8 H$ f4 v1 T# `
if(DO_0832==1)
% u9 o$ q# v( E" r+ R% m+ i3 t/ e1 H8 P ch |= 0x01;; r! \4 _4 B3 A& a- t5 f1 K
}
+ L7 F! a( z; V3 T2 ^7 S! A
$ x+ a: y k. f3 G% ?& n: y // MSB FIRST输出的最后一位与LSB FIRST输出的第一位是在
* |' G1 v( S8 F9 `+ L" { A; \! b // 同一个时钟下降沿之后,故此处先执行读取,后执行pulse
$ y( x/ L8 q( R // LSB FIRST DATA
+ m! X0 r" S( O" d- s3 e" X9 |1 i# A& K
0 `5 Z9 X% o: {. h6 Z1 j
' W) Z/ @4 ?/ t* w& k9 }. B/ ]+ ~; c& E0 H4 f- }4 T
…………限于本文篇幅 余下代码请从论坛下载附件…………
9 y# L; C) ]+ ^* y' S5 u0 E' n4 b. C; g2 n' h+ F1 t! A5 g
; T: U& s4 U. ?! P1 i* N& Z |
|