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

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

[复制链接]

该用户从未签到

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

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

该用户从未签到

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

点评

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

该用户从未签到

3#
发表于 2019-4-17 10:30 | 只看该作者
是数据发送不出去还是发送出的数据有问题(注意单片机只能发送8位数据)。你可以单独测试一下发送数据(随便发送个数据),如果单独发送数据没问题的话,那问题就是出在adc转换了。* E; i% q$ z  I$ \7 f  `
$ z9 e: ~# t* C5 ]8 E, x
那单片机是10位adc,不知你是发8位数据还是直接发10位数据(这样肯定有问题)

点评

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

该用户从未签到

4#
发表于 2019-4-17 10:35 | 只看该作者
本帖最后由 码农 于 2019-4-17 10:49 编辑 # A# U1 l# X( a  u% G- ?% O. k/ z$ c
relchhiclty 发表于 2019-4-17 10:22
* w4 a+ H: X/ [: E2 R串口感觉没有启动……直接附值就能传输么?

& T+ I) b4 a# H9 v4 _3 D7 N. P我看手册就是可以的,你看看那stc12c5a60s2的手册,就是可以的

该用户从未签到

5#
 楼主| 发表于 2019-4-17 10:36 | 只看该作者
fanichicl 发表于 2019-4-17 10:30
$ U0 c2 u' l5 A6 H; L是数据发送不出去还是发送出的数据有问题(注意单片机只能发送8位数据)。你可以单独测试一下发送数据(随 ...

/ C4 J% a, e1 ?9 f5 {$ Y- G串口助手上面显示没有接收,但是我测试串口发送没有问题2 }1 k! h; s$ k, u6 z0 m

+ T3 O* p6 C# W. D; _4 `& ~5 I
+ k  O6 z- ~  n+ {
可以发10位,也可以发8位,只不过8位没有10位的精度高
# Y+ c: K% l/ S/ L' ]1 L5 Q( D2 Q

该用户从未签到

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-6-29 02:02 , Processed in 0.109375 second(s), 28 queries , Gzip On.

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

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

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