EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
求助,AD转换数据不能通过串口发送。。* ]; R4 ?( @1 j: v6 _
% W. J t$ V) B1 F功能是用光敏传感器输入模拟量信号,通过采集模拟信号,然后转化成数字信号,然后通过串口助手反馈一个值,用hex模式显示,但是问题不知道出哪里了,串口没有数据接收,请各位帮忙看看,谢谢! h2 g7 }2 U: y
" e' W$ w* u! b! M% {
#include <stc12c5a60s2.h>( b3 u# P6 L& Q, j& |& b, r
#include <intrins.h># a7 @) {! H0 X* ~/ ]
#define uchar unsigned char
& [0 f% s! B% v0 f+ X#define uint unsigned int
4 A: s( n: U: R9 e//#define ADC_POWER 0x807 ?8 w- ~/ n, m C
//#define ADC_SPEEDLL 0x00
: s; i. T7 b9 l0 N- Q//#define ADC_START 0x08
$ F2 `! b2 Z+ Y6 o* M+ V: z7 c//#define ADC_FLAG 0x10' ]) P4 I6 i, N% g! b; W E! u
6 K1 |4 a! o/ T% Z% D0 c1 G r3 W8 \# }
void Delay(uint n)$ Q8 K) p, {; N- }9 b4 H
{
% e0 R: N2 e3 J _ uint x;
3 F7 Q$ h' F* Q- B% W }4 w5 i% A0 s6 P
while (n--): y$ q2 r. T8 p
{
& I& s0 g3 [: P, G% M3 W x = 5000;
6 E8 [/ Z! E; J, W+ _# N0 b* H while (x--);$ P7 f7 Z+ q: O
}" |9 T# P- K( }) V7 N1 K3 |( z/ d
}6 L3 a9 Z' Q: @+ J6 {4 B
1 r& U1 J9 }+ p6 b0 z$ }% F! o/*----------------------------
2 |2 h% C& _# ~串口初始化& [' S! M$ W4 [: K# q
----------------------------*/
0 o5 e$ ]0 i# h6 g+ `void Uartinit() //9600bps@11.0592MHz
. P6 a6 H! x! h2 l6 h; q{ A7 ~1 ^: D( C) ]% a$ l% u
PCON &= 0x7F; //波特率不倍速
2 b9 p1 j- W: B) k6 x7 J SCON = 0x50; //8位数据,可变波特率
, D* T/ p' O& y. \: q AUXR |= 0x04; //独立波特率发生器时钟为Fosc,即1T# t+ H" ]( g$ q y/ q1 P: D( d
BRT = 0xDC; //设定独立波特率发生器重装值
' c% h2 j* @. v& h& k AUXR |= 0x01; //串口1选择独立波特率发生器为波特率发生器! u& v8 U+ q; ]- q" q. L
AUXR |= 0x10; //启动独立波特率发生器% w; e% |* w8 {: b. g8 w5 y
}
4 \8 X$ S1 m% O6 u" V
- C7 e6 A& w8 V/*----------------------------' i# r0 s3 r. c5 J; d7 l
串口发送函数
0 L. {! r0 o D3 i9 O# W----------------------------*/- J* d" h2 I! C/ A! b$ G4 ? G( K
void SendData(uchar dat)3 m. P: `% n* ]0 b
{4 o1 a) R$ C# y& D$ ]
SBUF = dat;0 ?+ x5 R& `5 o. A u6 F0 S' u
while (!TI);
1 C2 I/ k6 h, X TI = 0; 6 w+ ~- h. q+ q4 Z
}2 p/ J- F& ?1 w( _5 o% Q* f* }" ?7 ~
, H- e% J6 q1 T" n/*----------------------------6 ^' e% O9 d: k6 T- ]
ADC初始化 / l: c W0 j O, y4 ]; V8 L# g2 O
----------------------------*/5 s: n5 }- z7 b& i5 u) m
void InitADC()
( c, k% D) [: m+ s- {" M{7 o% z! s6 y( Y$ h7 Z) S! a" R
P1ASF = 0x80; //设置P1.7作为模拟口使用: U! ]. U' [! u
ADC_RES = 0; //清除之前的结果
0 H) J) f4 c. O ADC_CONTR|=0X80;//打开ADC电源$ o. W+ r. {( j1 ^
ADC_CONTR|=0X08;//启动ADC转换+ o4 m5 D1 h" p8 {
ADC_CONTR|=0X07;//选择P1.7作为AD输入口& E+ A: r$ y: |' k4 s7 h0 A% w
ADC_CONTR|=0X60;//选择AD转换速度
- l1 N5 l1 y2 q/ f @' Q Delay(2);
! Q: S" a W' o/ O& h}8 e8 g* h1 f0 S+ z% H4 j$ w/ N
6 Y0 M* s" R- N9 Tvoid main()1 O# T1 m/ a! A- N
{
9 ?, j; b5 Q$ W! p" V' w2 B- i UartInit(); //Init UART, use to show ADC result0 s: C. ]8 g. ~1 O* i7 |
InitADC(); //Init ADC sfr
5 }" h) u2 {* ?& r9 d0 q: m$ i IE = 0xa0; //Enable ADC interrupt and Open master interrupt switch //Start A/D conversion$ D+ J9 e I4 y. C2 b; v- U* _
while (1);
* [& L& o, \* F V2 }, h- s}% T5 P, v7 O' ?) s2 H- i0 w+ e: ^
2 f% {2 |! M4 s+ M* l! d) l
/*----------------------------
! I: e: C; L9 _) }8 aADC 中断服务程序8 F8 @' c1 f# }0 A1 S# `
----------------------------*/
5 I9 D# x, T' w! ~void adc_isr() interrupt 5 % C! K+ G- T+ b, M
{
3 H' h: C% D7 L: |1 h6 w. d% K* F ADC_CONTR|=0X80;//打开ADC电源, U: N' F s. P" S8 s" |" z4 ?/ M
ADC_CONTR|=0X08;//启动ADC转换
& d. `1 N* R6 z1 ]: D7 o ADC_CONTR|=0X07;//选择P1.7作为AD输入口
/ g. | i- j" q0 _$ r ADC_CONTR|=0X60;//选择AD转换速度
6 b% z) @) |% r! z6 A, z if(ADC_CONTR|=0x10): e& y3 G. g8 ^, J) H* `
{2 l% N2 v) B( ^! U5 |
ADC_CONTR &=0X10; //清除标志位: ^7 Z( e9 Q* z# O
SendData(ADC_RES); //得到ADC高8位数据发送到串口
- b% E3 d5 Q9 v8 F4 W$ r }
* {; \4 \' U v! O1 r1 i}
; S5 c. J$ q2 t& n8 p# W |