EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
求助,AD转换数据不能通过串口发送。。
. Z4 j4 I9 q8 ]' O" @- S
' r3 u( }$ I$ G# j! c$ ~功能是用光敏传感器输入模拟量信号,通过采集模拟信号,然后转化成数字信号,然后通过串口助手反馈一个值,用hex模式显示,但是问题不知道出哪里了,串口没有数据接收,请各位帮忙看看,谢谢
' {, S6 l& Y' g0 q" t1 L3 M: {; I/ H8 ^4 S+ s T0 h. _7 O# @# U, G
#include <stc12c5a60s2.h>
% g6 a/ ]4 e+ I! M#include <intrins.h>. y7 e( A1 F @
#define uchar unsigned char) ~2 F* ~0 B$ U
#define uint unsigned int
! T: D4 z9 i# V3 k//#define ADC_POWER 0x80
6 |9 R" X0 d9 G- s- Q//#define ADC_SPEEDLL 0x00
6 E% n5 f8 r1 }3 Z* e& }8 ]//#define ADC_START 0x08
7 E7 r0 z: @- f0 J5 H//#define ADC_FLAG 0x10$ |% V6 U2 A. t6 U9 Z9 h
0 a) R. Q) z. d* ~( H- ~! j) b& e4 s* x3 e3 y8 D, O
void Delay(uint n). a7 a7 k4 g! @
{
! c$ Z3 d9 w2 \ uint x;
" r+ _" K3 _3 Z4 x# J8 Q- {' ]+ p& y+ E) m- [
while (n--)
3 b' {3 W2 k3 ^5 J% c {
4 t4 {' q$ C F; k5 a: X x = 5000;4 p7 w' z0 w1 U) }6 Q# z
while (x--);) E3 a" q2 | n' a9 P+ X
}
G) z- n8 w8 \}( |- C) x' `& c( B' _
! m$ i( N6 P' L t/*----------------------------: N2 \. a, k" Z& S6 i
串口初始化7 j: }" U! C( D% O" f
----------------------------*/; | a M) h% N# [4 Z& T8 E* [+ s
void Uartinit() //9600bps@11.0592MHz
; ]- R0 g, U' S# ~: i1 \6 e{4 M- f: Z) k2 `5 J
PCON &= 0x7F; //波特率不倍速
; H8 e& P) x2 v5 H, a" Q! ~ SCON = 0x50; //8位数据,可变波特率 s' @& b3 `, F" M7 ]
AUXR |= 0x04; //独立波特率发生器时钟为Fosc,即1T
6 f, m* y( z1 B. ?7 n! A" m1 Z$ M BRT = 0xDC; //设定独立波特率发生器重装值& `. _$ y, H5 U! F+ D) @
AUXR |= 0x01; //串口1选择独立波特率发生器为波特率发生器$ j1 K; ]5 \! Y3 S3 E
AUXR |= 0x10; //启动独立波特率发生器
/ u: h$ y/ k+ y1 ~4 B}
' ^' H1 ]/ F5 i! _
5 K- H" w, P' Q; W$ Q% _/*----------------------------( b+ H1 K3 @1 @1 [1 `( U8 {
串口发送函数. j" @3 ?1 w; b
----------------------------*/9 F+ ], ?2 b4 S& N# Q
void SendData(uchar dat)) Q5 ~# F& Z$ i5 o3 u) c
{
1 U B5 o: }: u T3 c SBUF = dat;
; X# y5 ]2 }& F( ]* {& y while (!TI);
& N0 u# G) g* r: l( x- I TI = 0;
6 C" a# U; m# A- F' a}
: d& M: w1 ^$ K. P) k) f- B$ @/ c' h* x# S
/*----------------------------
9 X" c( Y7 K3 L5 xADC初始化 5 O2 ~& h1 O6 o% n/ [8 O
----------------------------*/
: q8 O7 t" Q6 U8 Z0 jvoid InitADC()6 a" }: d5 f: Y8 q6 H
{/ [8 \4 m d4 q4 C2 ]5 E
P1ASF = 0x80; //设置P1.7作为模拟口使用
- C: s5 [: W' a) u. p& z9 J& D9 I ADC_RES = 0; //清除之前的结果
+ I2 ^# C( G/ z. E; K/ \( q1 P( U! ` ADC_CONTR|=0X80;//打开ADC电源% ~4 ?+ n4 w& \- L r- i
ADC_CONTR|=0X08;//启动ADC转换* f" Q3 w6 f' s. F4 Z
ADC_CONTR|=0X07;//选择P1.7作为AD输入口8 R) \6 ?/ T" ~ n. \
ADC_CONTR|=0X60;//选择AD转换速度
4 `# ]* b: \8 x0 U: R7 M3 w8 k5 |- _5 o Delay(2); 0 m2 l `" L& G/ d3 _
}4 M& n5 O0 [4 C. s" k7 ~# C
6 u; _; n* A. [; Q( @
void main()8 O; T- c$ Y4 E+ T1 E
{
1 J5 L% _" a0 } UartInit(); //Init UART, use to show ADC result# l+ W) m0 v/ s1 _! P& U+ G
InitADC(); //Init ADC sfr
+ j8 U% P% H1 N IE = 0xa0; //Enable ADC interrupt and Open master interrupt switch //Start A/D conversion
8 k, ?! q3 h- Y7 x! ?! E while (1);% ~! E. ]4 J* |+ ~
}
" W' _: A# U* N3 C4 @+ p w) f. K: X( j, O. U. @
/*----------------------------/ X0 r/ ~$ g6 Y
ADC 中断服务程序
5 h& u K6 V. z/ T4 X5 ^: |% Q----------------------------*/
( r# T8 M# F# `) U& yvoid adc_isr() interrupt 5 $ i# j0 {8 U4 `5 G
{
; }4 @) K" h( ^! [- ^ ADC_CONTR|=0X80;//打开ADC电源- G7 R) Q4 Z# B, s% d
ADC_CONTR|=0X08;//启动ADC转换1 `9 V$ M8 ^* G1 b: z
ADC_CONTR|=0X07;//选择P1.7作为AD输入口2 }) x. r2 A* i7 o: d# M; J
ADC_CONTR|=0X60;//选择AD转换速度
4 ^! ]" z" Y# c( O! @' Z$ C$ G if(ADC_CONTR|=0x10)$ u7 U/ l4 e: {7 `
{# `) Y" S* j; @5 n1 L; o% u
ADC_CONTR &=0X10; //清除标志位
: h s. |* h! W! L2 J! ?* ` SendData(ADC_RES); //得到ADC高8位数据发送到串口6 v" _& Y% p$ P7 K
}
8 ]0 X/ d0 o6 u+ \3 h8 y, \6 [}: ]$ o! Q7 [5 a t4 ^
|