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

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

[复制链接]

该用户从未签到

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

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 ^

该用户从未签到

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

点评

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

该用户从未签到

3#
发表于 2019-4-17 10:30 | 只看该作者
是数据发送不出去还是发送出的数据有问题(注意单片机只能发送8位数据)。你可以单独测试一下发送数据(随便发送个数据),如果单独发送数据没问题的话,那问题就是出在adc转换了。" U5 T. z( t5 D) o5 X1 S
* V% v' X& {: @$ }& P) x" a
那单片机是10位adc,不知你是发8位数据还是直接发10位数据(这样肯定有问题)

点评

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

该用户从未签到

4#
发表于 2019-4-17 10:35 | 只看该作者
本帖最后由 码农 于 2019-4-17 10:49 编辑 2 ~% K# s% V5 p! d2 U. G8 `0 \. v
relchhiclty 发表于 2019-4-17 10:22
1 [- Q" g. l4 @! u* R" Q  y2 |串口感觉没有启动……直接附值就能传输么?

1 o) E4 ~! {+ x. x" ?我看手册就是可以的,你看看那stc12c5a60s2的手册,就是可以的

该用户从未签到

5#
 楼主| 发表于 2019-4-17 10:36 | 只看该作者
fanichicl 发表于 2019-4-17 10:304 p$ l4 X1 i' h1 k( a2 F* g
是数据发送不出去还是发送出的数据有问题(注意单片机只能发送8位数据)。你可以单独测试一下发送数据(随 ...
9 T7 x2 C% |3 R
串口助手上面显示没有接收,但是我测试串口发送没有问题' O# ?1 R( v8 ?( U5 E" l8 m- y. ?
% J  `  w  I8 N4 m- q8 y, J8 D
7 D& [7 [, {+ E0 E6 |
可以发10位,也可以发8位,只不过8位没有10位的精度高: ~3 g7 _: G8 f4 V# D6 e

该用户从未签到

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-7-24 01:24 , Processed in 0.156250 second(s), 29 queries , Gzip On.

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

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

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