找回密码
 注册
关于网站域名变更的通知
查看: 887|回复: 8
打印 上一主题 下一主题

求助,AD转换数据不能通过串口发送。。

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-4-17 10:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

该用户从未签到

2#
发表于 2019-4-17 10:22 | 只看该作者
串口感觉没有启动……直接附值就能传输么?

点评

我看手册就是可以的,你看看那stc12c5a60s2的手册,就是可以的  详情 回复 发表于 2019-4-17 10:35

该用户从未签到

3#
发表于 2019-4-17 10:30 | 只看该作者
是数据发送不出去还是发送出的数据有问题(注意单片机只能发送8位数据)。你可以单独测试一下发送数据(随便发送个数据),如果单独发送数据没问题的话,那问题就是出在adc转换了。
8 D. X" ?& z, K0 M: J
; b& e- n: l( ]; P# m那单片机是10位adc,不知你是发8位数据还是直接发10位数据(这样肯定有问题)

点评

串口助手上面显示没有接收,但是我测试串口发送没有问题 可以发10位,也可以发8位,只不过8位没有10位的精度高  详情 回复 发表于 2019-4-17 10:36

该用户从未签到

4#
发表于 2019-4-17 10:35 | 只看该作者
本帖最后由 码农 于 2019-4-17 10:49 编辑
! K- {! h; i% R1 }; |
relchhiclty 发表于 2019-4-17 10:22
0 H1 S4 I3 F5 e; E+ ]* U0 _# v串口感觉没有启动……直接附值就能传输么?

( }9 w2 D' I' [! X7 ?我看手册就是可以的,你看看那stc12c5a60s2的手册,就是可以的

该用户从未签到

5#
 楼主| 发表于 2019-4-17 10:36 | 只看该作者
fanichicl 发表于 2019-4-17 10:30
! D. D  [4 Z# I$ O1 e是数据发送不出去还是发送出的数据有问题(注意单片机只能发送8位数据)。你可以单独测试一下发送数据(随 ...

8 \  b- `2 ^1 [  N" n串口助手上面显示没有接收,但是我测试串口发送没有问题* {0 F6 q- U, K0 F# m

0 F% v2 U2 l6 R& ?

5 i& G$ T- l1 F5 c6 N0 f可以发10位,也可以发8位,只不过8位没有10位的精度高
4 N1 H0 Q1 [* x: w# o% M

该用户从未签到

6#
发表于 2019-4-17 10:43 | 只看该作者
串口只识别字符串型的数据,不能读取单纯的数值型数据

该用户从未签到

7#
发表于 2019-4-17 10:48 | 只看该作者
进入中断服务之后先清除标志位,然后串口发送,最后再重新开启下次转换试试看。

该用户从未签到

8#
 楼主| 发表于 2019-4-17 11:16 | 只看该作者
谢谢各位的解答
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-8-19 09:46 , Processed in 0.125000 second(s), 28 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表