串口上传数据, 很奇怪,急求大神指导
本帖最后由 liuwei7190 于 2015-3-7 20:26 编辑这个串口程序怎么了很奇怪,求大神指导
我的想法是单片机将检测到的值通过串口上传到电脑串口助手里去。
第二个图片的程序下载后单片机可以正常上传数据、、
第一个图片我给main程序里加了一个AD()程序,下载后单片机就无法上传数据了 怎么回事 求教了{:handshake:} 可能getadcresult内部用死等的语句,而条件总不满足 同上楼,程序跑死了吧 HalenYU 发表于 2015-3-7 20:39
同上楼,程序跑死了吧
我也怀疑程序死在了那里 这个ad()应该没有问题的,去掉这个ad立马就好了{:cry:} 明显是 getadcresult 存在问题 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;
} 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;
} 看看你的 send函数怎么写的 如果是一个往buf写数据的话就有问题了 你得等着ad检测完再送数据给buf啊 很明显是等待转换完成没实现 vipqaz 发表于 2015-3-7 20:47
看看你的 send函数怎么写的 如果是一个往buf写数据的话就有问题了 你得等着ad检测完再送数据给buf啊 ...
voidsend(char dat)
{
SBUF=dat;
while(TI==0)
;
TI=1;
}
这个是send函数 应该没问题吧 NJ8888 发表于 2015-3-7 20:47
很明显是等待转换完成没实现
难道等待转换完成写的有问题?????? liuwei7190 发表于 2015-3-7 20:51
难道等待转换完成写的有问题??????
估计是你ADC相关寄存器配置问题导致ADC不工作,自然等待完成也就是白等 主要关注一下几个AD时间 你的A/D没有初始化就开始读取数据了。
好了,此贴终结。 makeflyeasy 发表于 2015-3-7 21:57
你的A/D没有初始化就开始读取数据了。
adc_init(); 我吧初始化函数加进去也一样的问题 没变化 的 没有初始化,没有把IO口设置为高阻模式。
好了,此贴再一次终结。 仿真看看就知道了 makeflyeasy 发表于 2015-3-7 22:12
没有初始化,没有把IO口设置为高阻模式。
好了,此贴再一次终结。
所以能试的方法,能改的地方都试了一遍,只要有ad初始化函数串口就无法发送太邪门了 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()后就没有串口发送了
完整代码,压缩发上来为好,你这ad初始化在哪里都看不到 makeflyeasy 发表于 2015-3-7 23:50
完整代码,压缩发上来为好,你这ad初始化在哪里都看不到
我这表示下载不了,需要重新上传
点那个文件就跳到这里去了,测试环境,IE11 windows8.1 平板电脑。 makeflyeasy 发表于 2015-3-8 00:09
我这表示下载不了,需要重新上传
本帖最后由 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的文件。
之前也遇到过一个问题,买了十多个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 11:45
之前也遇到过一个问题,买了十多个STC89的片子
总是死在串口发送数据的地方
void SendOneByte(unsigned cha ...
这种情况,基本是程序的问题。STC官网或下载软件有N多例程可以参数。
如果TI不能置1,则你不会有下载成功的机会。
你确定没有使用中断? 见过开了串口中断,中断里清了TI,主程序又用查询读TI。
小李非刀 发表于 2015-3-8 22:52
这种情况,基本是程序的问题。STC官网或下载软件有N多例程可以参数。
如果TI不能置1,则你不会有下载成 ...
一直用的程序段,换另外买来的片子就没问题了 这个好处理呀 在AD()后加一个点亮led函数 看看就知道是不是AD这个函数的问题了。
页:
[1]