打印

求助基于C8051F340单片机的RS485通信pc发数据,然后没有返回

[复制链接]
2897|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 fengwenjiong 于 2012-8-10 15:39 编辑


#include <RS485.h>
uchar temp;  
void RS485(void)
{

init();                                    //初始化

while (1)
{
            Recv_Data()  ;                          //主机发命令,单片机接收
   
            switch( temp )
              {
                case( 0x1F ):                        //空操作:握手,测试通讯是否正常
                       {
          delay ();
                         Send_Data(READY);
                       }
                        break;
                case( 0x00 ):                         //写命令,设置昼模式亮度,00H-FFH
                      {
                         Send_Data(DAY_MODE);
                         Recv_Data();
                      }
                        break;
                case( 0x0A ):                        //写命令,设置夜模式亮度,00H-FFH  
                     {
                        Send_Data(NIGHT_MODE);
                        Recv_Data();
                     }
                        break;
                case( 0x0C ):                       //写命令,伽马控制,0-100
                    {
                       Send_Data(GAMMA_CRTL);
                       Recv_Data();
                     }
                       break;
                case( 0x30 ):                     //读命令,读亮度值
                     {
                       Send_Data(LIGHT_READ);
                     //  Send_Data();
                     }
                       break;
                case( 0x55 ):                    //——,命令自检测
                     {
                      Send_Data(CHECK);
                     // Send_Data();
                     }
                      break;
                case( 0x36 ):                    //读命令,读取自检结果
                      {
                       Send_Data(CHECK_RESULT);
                      // Send_Data()  ;
                      }
                     break;
                case( 0x69 ):                    //——,显示画面镜像
                     {
                       Send_Data(MIRROR_DISPLAY);
                     }
                       break;
                default: break;           //发送不合规格指令则无返回
               }
}
}
void init(void)
{
// TCON      = 0x10;
//    TMOD      = 0x01;
//    TL0       = 0x18;
//    TH0       = 0xFC;

    P1MDOUT   = 0x80;
    P2MDOUT   = 0xC0;
    P3MDOUT   = 0x7F;
    XBR1      = 0x40;

TMOD = 0x10; //方式2:自动重装载的8 位计数器/ 定时器
SCON0 = 0x50;   // SMOD=0,REN=1 UART接收允许 ,方式0 :波特率可编程的 8 位UART0
TH1 = 0x64;     //波特率9600bps,osc=48MHz
TL1 = 0x64;
TR1 = 1; //定时器1 允许
REN0= 1;        //接收使能
PCON = 0x00;    //电源控制寄存器
EA = 1;  //开中断
ES0 = 1;       // 开串行中断
      
}

void Recv_Data()
{
        
          /* 禁止发送,允许接收 */
      DE = 0;
      RE = 0;
         RI0 = 0;   //接收中断 ,置1中断有效
      while (!RI0);
      temp = SBUF0;
      RI0 = 0;

}

void Send_Data(uchar temp )
{
      
        /* 允许发送,禁止接收 */
DE = 1;
RE = 1;
    TI0 = 0;
while(!TI0);
SBUF0 = temp;   
TI0 = 0;

}
void delay ()
{
   _nop_(); //延时
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
}

相关帖子

沙发
fengwenjiong|  楼主 | 2012-8-10 15:39 | 只看该作者
波特率是9600,不知道初始化设置错了没有

使用特权

评论回复
板凳
ayb_ice| | 2012-8-10 15:52 | 只看该作者
波特率是9600,不知道初始化设置错了没有
fengwenjiong 发表于 2012-8-10 15:39


去想办法知道

都喜欢写个程序,然后让别人替你找BUG,这样要不得的

使用特权

评论回复
地板
ayb_ice| | 2012-8-10 15:56 | 只看该作者
void Send_Data(uchar temp )
{
      
        /* 允许发送,禁止接收 */
DE = 1;
RE = 1;
    TI0 = 0;
while(!TI0);    // 前面已经将TI0清0,此处不死循环了
SBUF0 = temp;   
TI0 = 0;

}

使用特权

评论回复
5
sfpxfpcfp| | 2012-8-10 16:10 | 只看该作者
3# ayb_ice
非常认同楼上

使用特权

评论回复
6
yiucing| | 2012-8-10 16:57 | 只看该作者
应该是这样的吧
void Send_Data(uchar temp )
{
      
        /* 允许发送,禁止接收 */
DE = 1;
RE = 1;
    TI0 = 0;
SBUF0 = temp;
while(!TI0);   
TI0 = 0;
}

使用特权

评论回复
7
ningling_21| | 2012-8-10 22:50 | 只看该作者
2个疑点:
1--程序中好像没有:XBR0=1;  //使能串口0
2--原理图中,串口0好像是分配到P0.4和P0.5,而控制485收发DE的只能用其它引脚...

使用特权

评论回复
8
fengwenjiong|  楼主 | 2012-8-11 15:36 | 只看该作者
--原理图中,rx接到P0.4,tx接到P0.6,使能RE和DE共接到P0.5,好像串口0只能固定接到P0.4和P0.5。但是给老师我的原理图就是这样的,是不是有可能用串口1呢?
  还有就是波特率9600是这样设置的吗?谢谢热心人不吝赐教

使用特权

评论回复
9
fengwenjiong|  楼主 | 2012-8-11 15:37 | 只看该作者
--原理图中,rx接到P0.4,tx接到P0.6,使能RE和DE共接到P0.5,好像串口0只能固定接到P0.4和P0.5。但是给老师我的原理图就是这样的,是不是有可能用串口1呢?

  还有就是波特率9600是这样设置的吗?谢谢热心人不吝赐教

使用特权

评论回复
10
NE5532| | 2012-8-11 15:39 | 只看该作者
看不清楼主的图,但是感觉楼主还没理清楚硬件关系,先看图,看清楚资源分配,再在上位机搞串口监听,验证单片机软件跑到什么地方了。

使用特权

评论回复
11
fengwenjiong|  楼主 | 2012-8-11 15:39 | 只看该作者
不好意思,我也是弄了很久然后也查了很多资料,有各种说法才来论坛求助大神的

使用特权

评论回复
12
NE5532| | 2012-8-11 15:43 | 只看该作者
不好意思,我也是弄了很久然后也查了很多资料,有各种说法才来论坛求助大神的
fengwenjiong 发表于 2012-8-11 15:39


这句话一听就黄了。

不需要很多资料,只需要3份

1.单片机的数据手册
2.485芯片的数据手册
3.网上查一下什么是485接口

说法也不可能有很多个,只有1个——按照手册说明的管脚功能,该怎么接就怎么接。

另外楼主的电路图里,单片机引脚只标明了IO功能,没有标明第二功能,这图如果真是你们老师所为,说明他实在有点业余。

使用特权

评论回复
13
fengwenjiong|  楼主 | 2012-8-11 15:57 | 只看该作者
恩,我改过来了,请问端口设置对了没,还有就是波特率9600 这样设置TH1=TL1=0x64对否,谢谢

使用特权

评论回复
14
fengwenjiong|  楼主 | 2012-8-11 16:08 | 只看该作者
呵呵,主要是我比较业余,初学,不小心把老师扯进来了

使用特权

评论回复
15
NE5532| | 2012-8-12 00:00 | 只看该作者
写程序不需要问人家对不对,挂示波器看有没有数据出来就知道了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

10

帖子

0

粉丝