EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
求助,AD转换数据不能通过串口发送。。
( A0 v& P3 `4 s0 D& S( k; Z1 W1 W i6 ~
功能是用光敏传感器输入模拟量信号,通过采集模拟信号,然后转化成数字信号,然后通过串口助手反馈一个值,用hex模式显示,但是问题不知道出哪里了,串口没有数据接收,请各位帮忙看看,谢谢9 _3 ^0 H8 e* J4 f; d* C
6 F/ C# _4 F; C6 j#include <stc12c5a60s2.h>
6 F1 o4 _$ Z5 P& K#include <intrins.h>9 \' V, O0 B' g
#define uchar unsigned char" ~6 L6 D9 a9 d, @7 t( |) x
#define uint unsigned int
6 ]& H# p8 h) k* F. W//#define ADC_POWER 0x80
; _ {) |: m( w% Y- @//#define ADC_SPEEDLL 0x00
$ } K9 v# a8 M0 [. E" Y- Y//#define ADC_START 0x08# N$ e6 ~9 N5 H7 E+ O! q3 Q
//#define ADC_FLAG 0x107 x l1 H c5 [0 l) T6 Q' C
2 Q: f4 k+ ^' H g- B4 \$ C. X0 v( G7 ?) k, G M& M+ ]
void Delay(uint n)
2 L9 H8 r6 j& y( g4 q5 F5 Z4 U{
# Q, A4 d! q$ n: e uint x;: Q% y% h! [0 a' u- v( ?
; w- T% X! b7 V8 _
while (n--)! E7 _# a/ C0 G" o+ O: ^& I$ a+ H
{
% g% L6 o2 V! Y# r x = 5000;
* V8 e2 V: p) M) k4 i: e% g while (x--);0 f1 w! [+ A( ^7 L$ ^3 t
}
6 `3 D9 }& H# z7 h8 v. F: w2 t! S}
4 t$ y9 W- h2 N- S
8 x( H% t) o" Y$ x: Z/*----------------------------
/ i) b4 G% t: G" K1 L串口初始化
6 u: A- ]+ c5 h) }----------------------------*/
/ W, M1 N* A2 l/ C" Rvoid Uartinit() //9600bps@11.0592MHz$ W% L7 R4 m2 @- r% M' d$ x( @
{
' E) [$ E5 u/ Q PCON &= 0x7F; //波特率不倍速
9 v6 l" i) G7 ` SCON = 0x50; //8位数据,可变波特率
3 M: z8 i. B x( m AUXR |= 0x04; //独立波特率发生器时钟为Fosc,即1T4 k; w/ ?! _1 D" x4 `
BRT = 0xDC; //设定独立波特率发生器重装值
0 M8 u2 J' H' @& a$ e. v AUXR |= 0x01; //串口1选择独立波特率发生器为波特率发生器" h: ?: P3 n7 U% M9 u" ^
AUXR |= 0x10; //启动独立波特率发生器- l; c' X' H: `8 J. C% k% ?
}, L0 f: j9 v, b4 o+ d# d
4 a& y: l9 f: M& T: Z: W# n; d
/*----------------------------* y8 J/ x6 n d5 ]+ |
串口发送函数
( w7 R) K$ }% v- ?* m----------------------------*/
; u" r+ W) w/ v; x' m+ s; dvoid SendData(uchar dat)
. c) S) D% O/ u# P4 L( h{
, X2 y+ ?6 C4 K+ R( R; {8 C SBUF = dat;! h+ l @$ v, Y4 U a( W( j% W( [9 ]( q
while (!TI); , J6 j0 U2 R" C
TI = 0; ' z1 |! F( R7 V4 d7 P" W
}
! U& A/ a$ R6 {1 z4 E& \# t
: B: [) e, h/ Z$ O/*----------------------------9 U R: F3 k0 ?; c9 \ J9 _
ADC初始化
3 T x8 e/ @: m. P----------------------------*/
9 G+ w3 \* L3 ^. Evoid InitADC()
W8 m9 _. ?4 X) w' `$ q{* ]) Z- u. ^) g, `
P1ASF = 0x80; //设置P1.7作为模拟口使用
9 S" p& u$ I9 Z$ q) O% _6 F ADC_RES = 0; //清除之前的结果
`) O6 Y6 u" M ADC_CONTR|=0X80;//打开ADC电源) X# [( p N0 P! m R7 [
ADC_CONTR|=0X08;//启动ADC转换* b9 V' }& R) s V% D6 v
ADC_CONTR|=0X07;//选择P1.7作为AD输入口, P/ t$ m6 k8 \- m) z
ADC_CONTR|=0X60;//选择AD转换速度 Y( ]( g+ }' \: Z% j, `
Delay(2); ( h$ D) ^( g' |7 O8 u" V3 y6 h
}8 J& d( l2 T2 G% G. M7 H1 n/ H
' n5 W3 y6 m: X, G$ @
void main()# U) a1 \- w% k: l
{
$ |; Y+ q: u( Y1 _ UartInit(); //Init UART, use to show ADC result5 Q, x8 b! L' q& N/ e9 f$ J& z
InitADC(); //Init ADC sfr! r8 [, ~9 H+ N; U& X
IE = 0xa0; //Enable ADC interrupt and Open master interrupt switch //Start A/D conversion
& @2 w! g) r4 ]2 w1 N% [' R while (1);
; S3 ? A6 _( B& ^7 M1 i- X& F}
4 K+ R: z2 T0 R
3 K+ T$ L- c+ K1 F/*----------------------------6 N9 |' `1 n4 k2 k" `8 N/ M6 r) S
ADC 中断服务程序
; y; n. I2 H* q: ?3 O! p----------------------------*/
, v( t. r, `- U+ M% jvoid adc_isr() interrupt 5 % r. K- ~2 f: o. g4 \
{
( I7 ~/ w0 l; t* S: C ADC_CONTR|=0X80;//打开ADC电源
, v! Y# p0 E1 o- u/ W ADC_CONTR|=0X08;//启动ADC转换) Q" u4 ^" N; v C: d4 D; s
ADC_CONTR|=0X07;//选择P1.7作为AD输入口
( J- r% s/ N' m8 p7 q ADC_CONTR|=0X60;//选择AD转换速度8 l% z3 U3 M# i w, n% K, j7 V! @
if(ADC_CONTR|=0x10)' C# m. ~$ Y+ E4 Z. [( X
{
2 p: T. _- z, e2 F/ ~ ADC_CONTR &=0X10; //清除标志位; o+ g# ~, B6 _1 a/ w
SendData(ADC_RES); //得到ADC高8位数据发送到串口" N( H3 {; t" @# r
}
; n4 R; C, l7 G. t' B}
1 W- Z" A' F% O) @8 X |