EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
求助,AD转换数据不能通过串口发送。。9 [% y) w2 ^/ u' j6 _
: V+ M% J. R& h* y
功能是用光敏传感器输入模拟量信号,通过采集模拟信号,然后转化成数字信号,然后通过串口助手反馈一个值,用hex模式显示,但是问题不知道出哪里了,串口没有数据接收,请各位帮忙看看,谢谢
, O1 P7 q! a4 L9 E& D5 b( [1 q( ?3 b, V+ t
#include <stc12c5a60s2.h>
1 N; q9 D# L6 a$ t. q#include <intrins.h>
. N5 F: Z/ O" [2 K8 k% d- i+ i#define uchar unsigned char& F* ?& d& K/ S* F7 e
#define uint unsigned int3 Z$ {& V" A$ m0 S
//#define ADC_POWER 0x80
- h8 |! r, B# A//#define ADC_SPEEDLL 0x00: h" w0 |/ ~* [7 D, d' Z# o4 p
//#define ADC_START 0x08
0 Y( B) l. \4 W5 X' c2 t! x//#define ADC_FLAG 0x10
1 v' W3 F4 n( w: v& ^' t% j& y$ \4 _* E; N6 R9 ]
8 r- I; b( D7 I9 s2 G1 C* o" ^5 |void Delay(uint n)
9 N- k& A4 v7 N% B{* z: Y7 Y, P% c# O# f- F% u, D
uint x;% z6 @( A3 l3 m6 y6 w
4 W9 o1 D$ @. ?; w; ?, f) P; R1 ~7 v while (n--)
B; i, T- S2 `+ G$ {% d {
( h' i8 i9 w u7 z3 k# @) r x = 5000;/ K+ t2 y, O- D( A7 r* D! t
while (x--);. L! t& h$ z/ H2 K1 f" X, {
}
) U O, i& b6 m9 ]+ g G}
& A6 q4 S. \$ a3 H. c v/ Q1 _( k% V- }' r0 J6 m( K
/*----------------------------
3 _( S' k# Z/ Y5 k. {) k- y; t5 Y串口初始化. H8 } C% B4 m0 C2 e* M
----------------------------*/
' `/ j+ W. A, B6 f/ W0 o0 Bvoid Uartinit() //9600bps@11.0592MHz5 Y. |. Z G. F9 i+ k! T8 ^, T4 D
{) J1 m! ?. e5 d1 h- W9 v+ `' m
PCON &= 0x7F; //波特率不倍速3 ?0 _; j. H& U6 c0 b% |
SCON = 0x50; //8位数据,可变波特率' V) V& Y3 [3 A# e C. a( a, s$ g
AUXR |= 0x04; //独立波特率发生器时钟为Fosc,即1T
8 K# o' E# j; R8 I" Z BRT = 0xDC; //设定独立波特率发生器重装值8 d! o/ _9 U4 J9 f1 x
AUXR |= 0x01; //串口1选择独立波特率发生器为波特率发生器5 A; |4 ~2 d$ y$ F. S g
AUXR |= 0x10; //启动独立波特率发生器
3 p; x6 z0 H/ H4 [. Q6 s/ s}
8 m7 G' x3 C1 t) P9 u _% Y' K5 @4 h
/*----------------------------
% G: ?/ `% R3 Q* |2 h串口发送函数
8 ]* m, M9 [' x' B" K9 ~* L----------------------------*/
% ~- ~, S6 E) v: B: P' Gvoid SendData(uchar dat)
S1 q: b! n! s8 x{2 p& ^3 c; H# b4 [" M+ z
SBUF = dat;$ ?7 X: F( Z8 r4 [, A K: E
while (!TI); ( _. ]6 S/ y; i" [2 N& q9 a2 z6 J
TI = 0;
# t" E0 x4 S! L* v# ^9 a7 [2 d}
4 E- q: @- }9 ]' W* o$ m) _$ E2 f0 ?2 e' P3 O
/*----------------------------$ v$ r; S- J" ^% g2 M0 Z; x/ O
ADC初始化 / G. r/ P- L; r8 c, q [
----------------------------*/" Y# Q( p9 K8 G, |
void InitADC()
- p+ p8 M( b. F{3 ~9 y5 _1 ^) F$ S! U( I
P1ASF = 0x80; //设置P1.7作为模拟口使用0 ?" h3 |& `' o$ M
ADC_RES = 0; //清除之前的结果
" `" v# t( L4 N$ ?1 f, {: T- O ADC_CONTR|=0X80;//打开ADC电源
5 Q0 T! K; U, ` ADC_CONTR|=0X08;//启动ADC转换
; g4 b6 V" C( t- _ ADC_CONTR|=0X07;//选择P1.7作为AD输入口
6 d4 {" p D% _+ d% H0 X ADC_CONTR|=0X60;//选择AD转换速度* U- N+ J/ Y3 N# C# j4 X
Delay(2);
, D) a# h3 Q3 w1 z( p}
: w1 n; X& P1 W& w+ \7 j1 n: _# @/ m9 g
void main()" t, ~3 n& N% c. t
{5 K5 ~1 y* ?6 V
UartInit(); //Init UART, use to show ADC result% @9 I& o) W t0 G+ {2 f3 R
InitADC(); //Init ADC sfr+ b/ k* C$ G5 I6 o; b" p- E& l
IE = 0xa0; //Enable ADC interrupt and Open master interrupt switch //Start A/D conversion
6 F& n+ v k$ n while (1);3 G5 }) x' C0 N8 w
}
0 j) W1 N* s! H: V5 X8 C$ o$ N8 E, H" a2 O3 [% g6 M" O
/*----------------------------
' j- K! D5 z" w* u7 S8 a. p: ^/ sADC 中断服务程序2 c0 _" n+ s: B
----------------------------*/6 s3 ^" z$ p: B9 c0 F& A+ ]
void adc_isr() interrupt 5 2 e3 j) f- |. I, d J$ c4 f
{
/ n$ y7 ^$ r, i7 q ADC_CONTR|=0X80;//打开ADC电源3 r6 ^+ L1 o4 c2 e7 q7 I( O
ADC_CONTR|=0X08;//启动ADC转换3 z- P, h" B6 \1 t4 j% z" a
ADC_CONTR|=0X07;//选择P1.7作为AD输入口
: p# c6 i# |. q: e7 j ADC_CONTR|=0X60;//选择AD转换速度" |& x+ o8 M2 z
if(ADC_CONTR|=0x10)
r" b h: S* f( a' j {& J0 c. N) p7 a3 ^6 h& A5 e# S
ADC_CONTR &=0X10; //清除标志位+ g4 T/ Y7 j3 ^7 H5 d
SendData(ADC_RES); //得到ADC高8位数据发送到串口
4 B, @: ^5 R; H }
! q2 M7 B, N! x6 l j}/ i* }* a1 ~5 w; o
|