liuwei7190 发表于 2015-3-7 20:24:55

串口上传数据, 很奇怪,急求大神指导

本帖最后由 liuwei7190 于 2015-3-7 20:26 编辑

这个串口程序怎么了很奇怪,求大神指导
我的想法是单片机将检测到的值通过串口上传到电脑串口助手里去。



第二个图片的程序下载后单片机可以正常上传数据、、


第一个图片我给main程序里加了一个AD()程序,下载后单片机就无法上传数据了      怎么回事   求教了{:handshake:}

NJ8888 发表于 2015-3-7 20:28:50

可能getadcresult内部用死等的语句,而条件总不满足

HalenYU 发表于 2015-3-7 20:39:21

同上楼,程序跑死了吧

liuwei7190 发表于 2015-3-7 20:41:39

HalenYU 发表于 2015-3-7 20:39
同上楼,程序跑死了吧

我也怀疑程序死在了那里    这个ad()应该没有问题的,去掉这个ad立马就好了{:cry:}

liyang0727 发表于 2015-3-7 20:42:16

明显是 getadcresult 存在问题

liuwei7190 发表于 2015-3-7 20:45:27

NJ8888 发表于 2015-3-7 20:28
可能getadcresult内部用死等的语句,而条件总不满足


//*********************************初始化A/D转换*************************************************
void adc_init()
{
        P1ASF=0x1f;
        ADC_RES=0;       
        ADC_CONTR = ADC_POWER | ADC_SPEEDLL;
        Delay(10); //适当延时
}
//**********************************获得A/D转换的数据********************************************
uint getADCResult(char ch)
{
        ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START;
        Delay(5);
        while (!(ADC_CONTR & ADC_FLAG));//等待转换完成
        ADC_CONTR &= ~ADC_FLAG; //关闭adc
        return ADC_RES;
}

liuwei7190 发表于 2015-3-7 20:45:51

liyang0727 发表于 2015-3-7 20:42
明显是 getadcresult 存在问题

这个   ad的   内容




//*********************************初始化A/D转换*************************************************
void adc_init()
{
        P1ASF=0x1f;
        ADC_RES=0;       
        ADC_CONTR = ADC_POWER | ADC_SPEEDLL;
        Delay(10); //适当延时
}
//**********************************获得A/D转换的数据********************************************
uint getADCResult(char ch)
{
        ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START;
        Delay(5);
        while (!(ADC_CONTR & ADC_FLAG));//等待转换完成
        ADC_CONTR &= ~ADC_FLAG; //关闭adc
        return ADC_RES;
}

vipqaz 发表于 2015-3-7 20:47:11

看看你的 send函数怎么写的 如果是一个往buf写数据的话就有问题了 你得等着ad检测完再送数据给buf啊

NJ8888 发表于 2015-3-7 20:47:59

很明显是等待转换完成没实现

liuwei7190 发表于 2015-3-7 20:49:04

vipqaz 发表于 2015-3-7 20:47
看看你的 send函数怎么写的 如果是一个往buf写数据的话就有问题了 你得等着ad检测完再送数据给buf啊 ...

voidsend(char dat)
{
           SBUF=dat;
        while(TI==0)
       ;
        TI=1;

}


这个是send函数   应该没问题吧

liuwei7190 发表于 2015-3-7 20:51:34

NJ8888 发表于 2015-3-7 20:47
很明显是等待转换完成没实现

难道等待转换完成写的有问题??????

NJ8888 发表于 2015-3-7 20:54:42

liuwei7190 发表于 2015-3-7 20:51
难道等待转换完成写的有问题??????

估计是你ADC相关寄存器配置问题导致ADC不工作,自然等待完成也就是白等

MR_ZJY 发表于 2015-3-7 21:19:24

主要关注一下几个AD时间

makeflyeasy 发表于 2015-3-7 21:57:01

你的A/D没有初始化就开始读取数据了。



好了,此贴终结。

liuwei7190 发表于 2015-3-7 22:11:01

makeflyeasy 发表于 2015-3-7 21:57
你的A/D没有初始化就开始读取数据了。




adc_init();   我吧初始化函数加进去也一样的问题    没变化 的   

makeflyeasy 发表于 2015-3-7 22:12:38

没有初始化,没有把IO口设置为高阻模式。

好了,此贴再一次终结。

小李非刀 发表于 2015-3-7 22:34:40

仿真看看就知道了

liuwei7190 发表于 2015-3-7 23:40:22

makeflyeasy 发表于 2015-3-7 22:12
没有初始化,没有把IO口设置为高阻模式。

好了,此贴再一次终结。

所以能试的方法,能改的地方都试了一遍,只要有ad初始化函数串口就无法发送太邪门了

liuwei7190 发表于 2015-3-7 23:45:13

makeflyeasy 发表于 2015-3-7 22:12
没有初始化,没有把IO口设置为高阻模式。

好了,此贴再一次终结。

这是遥控器的程序改写的,你帮我看看吧

#include <STC15F2K60S2.H>
#include <intrins.h>
#include <NRF24L01.H>
#include <AD.H>
sbit RLED=P0^5;
sbit GLED=P0^6;
sbit LKEY=P4^7;
sbit RKEY=P3^4;
int ay,ax,by,bx;
int cy,cx,dy,dx;
float battery;
char dat=44;
void UartInit(void)                //9600bps@28.000MHz
{
        SCON = 0x50;                //8位数据,可变波特率
        AUXR |= 0x04;                //定时器2时钟为Fosc,即1T
        T2L = 0x27;                //设定定时初值
        T2H = 0xFD;                //设定定时初值
        AUXR |= 0x01;                //串口1选择定时器2为波特率发生器
        AUXR |= 0x10;                //启动定时器2
}


voidsend(char dat)
{
           SBUF=dat;
        while(TI==0)
       ;
        TI=1;

}
void AD();
void Delay60ms()                //@28MHz
{
        unsigned char i, j, k;
        _nop_();
        _nop_();
        i = 7;
        j = 99;
        k = 50;
        do
        {
                do
                {
                        while (--k);
                } while (--j);
        } while (--i);
}
void Delay(unsigned int s)
{
        unsigned int i;
        for(i=0; i<s; i++);
        for(i=0; i<s; i++);
}
/////////////////////////////////////

void AD();
void AD()                //获取AD采样数据
{
    cy=getADCResult(3); //读取4个摇杆通道每个通道的8位数据,取值范围0-255
        Delay(15);
        cx=getADCResult(2);
        Delay(15);
        dy=getADCResult(1);
    Delay(15);
        dx=getADCResult(0);
        Delay(15);
        battery=(getADCResult(4)*5.05*100)/256;   //电池电压检测通道 低于3.7V亮红灯
        Delay(15);
        if(battery<=370)
{
        RLED=1;GLED=0;
        }
        else
        {
        RLED=0;GLED=1;
        }

}
////////////////////////////////////////////////////////////////

main()
{          P1M0=0x00;//P1设为高阻模式
                P1M1=0xFF;
                P0M0=0XFF;//其他I/O口设置为准双向,弱上拉模式
                P0M1=0X00;
                P2M0=0X00;
                P2M1=0X00;
                P3M0=0X00;
                P3M1=0X00;
                P4M0=0X00;
                P4M1=0X00;
                P5M0=0Xff;
                P5M1=0X00;
                LKEY=1;    //拉高按键检测I/O口电平,按键为低电平触发
                RKEY=1;
        UartInit();
        //adc_init();
       
        //AD();
        //init_NRF24L01();
        GLED=1;
    RLED=1;
        while(1)
        { //RLED=1;
       send(LKEY);
       Delay60ms();
        }
       
}


把adc_init();注释掉后遥控器就有给电脑串口发送,加上adc_init()后就没有串口发送了

makeflyeasy 发表于 2015-3-7 23:50:39

完整代码,压缩发上来为好,你这ad初始化在哪里都看不到

liuwei7190 发表于 2015-3-7 23:54:27

makeflyeasy 发表于 2015-3-7 23:50
完整代码,压缩发上来为好,你这ad初始化在哪里都看不到



makeflyeasy 发表于 2015-3-8 00:09:32

我这表示下载不了,需要重新上传

makeflyeasy 发表于 2015-3-8 00:16:32


点那个文件就跳到这里去了,测试环境,IE11 windows8.1 平板电脑。

liuwei7190 发表于 2015-3-8 00:21:45

makeflyeasy 发表于 2015-3-8 00:09
我这表示下载不了,需要重新上传



makeflyeasy 发表于 2015-3-8 10:54:11

本帖最后由 makeflyeasy 于 2015-3-8 10:56 编辑

liuwei7190 发表于 2015-3-8 00:21

有几个错误。

void AD();你声明了2次


其次,发送建议按STC的示例程序来写,加上串口中断。
bit busy;
void Usart_Init()//28Mhz 波特率115200
{
SCON = 0x50;      
      AUXR |= 0x40;               
      AUXR &= 0xFE;               
      TMOD &= 0x0F;      
      TL1 = 0xC3;               
      TH1 = 0xFF;               
      ET1 = 0;               
      TR1 = 1;      
EA = 1;      
}
void Uart() interrupt 4 using 1
{
    if (RI)
    {
      RI = 0;                     
    }
    if (TI)
    {
      TI = 0;               
      busy = 0;            
    }
}
void SendData(unsigned char dat)
{
    while (busy);            
    ACC = dat;
    busy = 1;
    SBUF = ACC;               
}


再有,你帖子开头的程序有问题,battery是float型变量,send()函数接受的变量是unsigned char型,battery在程序里的取值范围是505.0f至0.0f超过unsigned char数据范围了。




你的Keil该更新了,我这Keil UV5打不开你那UV2的文件。


大米饭 发表于 2015-3-8 11:45:01

之前也遇到过一个问题,买了十多个STC89的片子
总是死在串口发送数据的地方
void SendOneByte(unsigned char c)
{
    SBUF = c;
    while(!TI);
    TI = 0;
}
后来发现竟然是片子的TI无法置位,后来改成
void SendOneByte(unsigned char c)
{
    SBUF = c;
    Delay_5ms();
    TI = 0;
}
就好了,就买回来的那十几个片子会这样,好生奇怪

小李非刀 发表于 2015-3-8 22:52:57

大米饭 发表于 2015-3-8 11:45
之前也遇到过一个问题,买了十多个STC89的片子
总是死在串口发送数据的地方
void SendOneByte(unsigned cha ...

这种情况,基本是程序的问题。STC官网或下载软件有N多例程可以参数。

如果TI不能置1,则你不会有下载成功的机会。

你确定没有使用中断? 见过开了串口中断,中断里清了TI,主程序又用查询读TI。

大米饭 发表于 2015-3-9 08:25:29

小李非刀 发表于 2015-3-8 22:52
这种情况,基本是程序的问题。STC官网或下载软件有N多例程可以参数。

如果TI不能置1,则你不会有下载成 ...

一直用的程序段,换另外买来的片子就没问题了

simahacker 发表于 2015-3-20 23:11:31

这个好处理呀 在AD()后加一个点亮led函数 看看就知道是不是AD这个函数的问题了。
页: [1]
查看完整版本: 串口上传数据, 很奇怪,急求大神指导