这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » Kevin的MCU开发板DIY--串口问题求解!

共9条 1/1 1 跳转至

Kevin的MCU开发板DIY--串口问题求解!

菜鸟
2011-11-08 23:45:51     打赏

   对嵌入式十分感兴趣,最近在研究uc/osII,正准备去买块简单的开发版呢,突然在论坛看到了MCU开发板DIY的通知,只希望能申请上,必定把我学习uc/osII的全过程与大家分享!!
   祈祷中。。。


-------------------------------------------------------串口问题求解--------------------------------------------------
  板子终于是焊好了,结果上电后发现电源短路,测试了好久才终于找到问题--电源线在电路板背面USB标示下面那一点和地连到一块了,此中的周折就不细说了吧。高兴地开始一个一个模块地测试,结果第一个串口就被难住了,而且是想了很多方法都解决不了,伤心呀...
  说说我遇到的问题吧,强烈希望大家能给我提点意见,我实在是想不出我这板子的问题出在哪里。
(1)我的电路板能下载程序,这说明串口的基本功能应该没什么大问题。
(2)串口测试代码如下,这程序非常简单,串口波特率为9600,方式三 ,主程序的while循环中用串口反复发送0X11,0X22,0X33,发送过程中依次点亮几个LED指示一下, 当串口接收到第一个数据后停止主动发送,并将接收到的数据重新发送回去。

//串口测试代码
#include<reg52.h>
#define uchar unsigned  char
#define uint unsigned  int
uchar flag = 1;
uchar array[100] = 0;
sbit P17 = P1^7;

void Initial_uart(void)
{
 TMOD = 0X20;//定时器一 自动装入
 TL1 = 0XF9;//9600,24M
 TH1 = 0XF9;
 SCON = 0XD8;//方式三
 PCON = 0X00;//波特率不加倍
 TR1= 1;//启动定时器一
}

void delay( unsigned long i )
{
   int j = 1000;
   for( ;j > 0;j-- )
 {
      for( ;i > 0;i-- )
     {
    i++;
   i--;
  }
 }
}

void serial(void) interrupt 4 using 2
{
 if(RI == 1)
 {
  RI = 0;
  array[89] = SBUF;
  SBUF = array[89];
  while( TI == 0 );
  TI = 0; 
  flag = 0;
 }
}
main()
{
 uchar temp1 = 0x11;
 uchar temp2 = 0x22;
 uchar temp3 = 0x33;
 
 EA = 1;//CPU开中断
 ES = 1;//串口开中断

 flag = 1;//
 Initial_uart();
 P1 = 0xff;
 delay(500);
 P1 = 0xfe;
 while(1)
 {
  
  if(flag == 1)
  {
   
   SBUF = temp1;
   while(TI==0);
   P1 = ~0x01;
   TI=0;
   delay(50000);

   SBUF = temp2;
   while(TI==0);
   P1 = ~0x02;
   TI=0; 
   delay(50000);

   SBUF = temp3;
   while(TI==0);
   P1 = ~0x04;
   TI=0;
   delay(50000);
  }

  delay(50000);

 }
}

(3)程序运行起来后,LED闪烁正常且上位机能接收到数据,但是接收到的数据中间总会出现一些错误。例如接收到的数据如下:
11 22 33 11 22 33 11 22 73 11 22 33 11 22 33 11 22 33 11 22 33 11 62 73 11 22 33 11 22 33 11 22 33 11 22 33 11 62 73 11 22 33 11 22 33 11 22 33 11 22 33 1162 73 11 22 33 11 22 33 11 22 33 11 22 33 11 62 33 11 22 33 11 22 33
(4)我的分析:能收到数据,且数据绝大部分正确,数据个数也没有出现异常,这说明串口初始化应该没有错误,故排除软件的错误。但是硬件如果出问题,那为什么可以下载程序?问题可能出在哪里?请大家给我点建议,感激不尽!
---------------------------------------------------------------------------------------------------------------------------




关键词: Kevin     开发     DIY--     串口     问题     求解    

菜鸟
2011-11-21 20:11:14     打赏
2楼

   元件准备好了,今天又在最新的名单上看到了自己的名字,很是兴奋。最近一直太忙抽不出来时间,不过这几天应该会有些时间了。
   想先把这块电路板上的各个模块搞清楚,把每个模块的功能和使用方法简单介绍一下,然后为每个模块先写个简单的测试程序,等板子到手了,焊接好了可以用这些小程序做个简单的测试。期待我近期的更新吧~~


菜鸟
2011-11-21 22:58:51     打赏
3楼

谢谢管理员的支持,感激中...
晚上奋斗了两个小时,写了个数码管的测试程序。我想数码管的功能和用法就不需要过多介绍了,只是我们的电路中在数码管的数据口加了个锁存器74HC573,接好跳线帽后就可以用P3.7引脚来锁存数据了,当然也可以不使用锁存器(跳线帽接高电平),这样数码管的数据口就和P2后处于常通状态。我的程序没使用锁存器,程序源码如下:
////////////////////////////////////////////////////////////////////////////////////
#include <reg52.h>
#include <absacc.h>

typedef unsigned char uchar;
typedef unsigned int uint;


uchar code DispNPoint[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//数码管无小数点显示的数值
uchar code SEGAddr[8]={0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7};//数码管地址


//软件延时函数
void delay(uint time)
{
     uint i,j;
     for(i=0;i<time;i++)
          for(j=0;j<10;j++)
              ;
}


//数码管显示函数(无小数点),addr:0~7,dat:0~9
void DspSEG(uchar addr,uchar dat)
{
     int i;
     for(i=0;i<50;i++)
     {
          P2 = SEGAddr[addr];
          P0 = DispNPoint[dat];
          delay(1);
     }
}


void main()
{
     int i = 0;
     while(1)
     {
          for(i=0; i<8; i++)
          {
              DspSEG(i,i);
          }
     }
}
////////////////////////////////////////////////////////////////////////////////////
程序很简单,希望高手不吝赐教。
在proteus中搭了个仿真电路测试了一下,貌似很不错呵呵。下图是仿真结果:


菜鸟
2011-11-21 23:00:18     打赏
4楼

菜鸟
2011-11-22 23:12:16     打赏
5楼
DS1302的实验已经在Proteus上走通了,配合串口测试了一下数据,貌似没有问题。下图是proteus上的仿真电路图,程序还想再修改修改再发上来。

菜鸟
2011-11-23 19:35:10     打赏
6楼
恩,好的,没问题呀。

菜鸟
2011-11-23 21:48:03     打赏
7楼

是吗,太好了,uc/os的板子是基于什么处理器的呢?


菜鸟
2011-11-24 15:56:53     打赏
8楼
收到PCB啦,还有一本09年的电子产品世界,好高兴呀!

菜鸟
2011-12-11 21:39:01     打赏
9楼
串口问题求解,希望大家能给些建议!

共9条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]