打印

机接收不到

[复制链接]
1045|23
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zhaoxqi|  楼主 | 2017-6-18 19:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
jiaxw| | 2017-6-18 19:29 | 只看该作者
楼主程序可以公开吗?贴程序看下吧,这么说看不出什么原因

使用特权

评论回复
板凳
zhaoxqi|  楼主 | 2017-6-18 19:33 | 只看该作者

主机程序:
#include  <msp430x14x.h>
char MST_Data = 0x00;

void main(void)
{
  unsigned int i;
  WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
  P3SEL = 0x00E;                            // Setup P3 for SPI mode
  P3OUT = 0x020;                            // Setup P3.4 for Scope trigger and
  P3DIR |= 0x030;                           // P3.5 for slave initialization
  U0CTL = CHAR + SYNC + MM + SWRST;         // 8-bit, SPI, Master
  U0TCTL = CKPL + SSEL1 + STC;              // Polarity, SMCLK, 3-wire
  U0BR0 = 0x002;                            // SPICLK = SMCLK/2
  U0BR1 = 0x000;
  U0MCTL = 0x000;
  ME1 = USPIE0;                             // Module enable
  U0CTL &= ~SWRST;                          // SPI enable
  IE1 |= URXIE0;                            // Recieve interrupt enable
  _EINT();                                  // Enable interrupts
  P3OUT &= ~0x020;                          // Toggle P3.5: slave reset
  P3OUT |= 0x020;
  i = 50000;                                // Delay
  do (i--);
  while (i != 0);
  while (1)
  {
    TXBUF0 = MST_Data;                      // Transmit first character
    LPM0;                                   // CPU off
  }
} // End Main
#pragma vector=USART0RX_VECTOR
__interrupt void SPI0_rx (void)
{
  
  P3OUT ^= 0x010;                           // XOR P3.4 for scope trigger
  while ((IFG1 & UTXIFG0) == 0);            // USART0 TX buffer ready?
  
    TXBUF0 = 0x0F;

}

从机程序:
#include  <msp430x14x.h>
char MST_Data = 0x00, SLV_Data = 0xFF;
void main(void)
{
  WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
  P3SEL |= 0x0E;                             // Setup P3 for SPI mode
  U0CTL &=~MM;
  U0CTL = CHAR + SYNC + SWRST;              // 8-bit, SPI, Slave
  U0TCTL = CKPL + STC;                      // Polarity, UCLK, 3-wire
  ME1 = USPIE0;                             // Module enable
  U0CTL &= ~SWRST;                          // SPI enable
  
  while (1)
  {
    if(IFG1 & URXIFG0)
    {
      while (!(IFG1 & UTXIFG0));
      TXBUF0 = U0RXBUF;                     
      LPM4;
    }
  }
}
刚开始测试的时候发现不能进入中断服务函数,所以我直接改成了现在查询方式输出,这样可以吗?

使用特权

评论回复
地板
zhanghqi| | 2017-6-18 19:35 | 只看该作者

你的从机接受程序怎么写的

使用特权

评论回复
5
jiajs| | 2017-6-18 19:38 | 只看该作者

收不到?先检查硬件电路是连接正确了的!如果在此基础上还不对的话就是你的驱动的问题了,建议把程序挂上来,你这样说的问题想帮也帮不上啊!

使用特权

评论回复
6
zhanghqi| | 2017-6-18 19:39 | 只看该作者
如何确定主机发送正常  如果能确定就知道为什么收不到了

使用特权

评论回复
7
zhenykun| | 2017-6-18 19:41 | 只看该作者
自发自收试试

使用特权

评论回复
8
wyjie| | 2017-6-18 19:44 | 只看该作者
试试调高波特率。。。。

使用特权

评论回复
9
jlyuan| | 2017-6-18 19:46 | 只看该作者

中断的方式实时性好,查询方式速度慢

使用特权

评论回复
10
yszong| | 2017-6-18 19:48 | 只看该作者

先检查硬件电路是连接正确否     如果在此基础上还不对的话就是驱动的问题    降低波特率试一下

使用特权

评论回复
11
zhenykun| | 2017-6-18 19:50 | 只看该作者
看下两端的波特率是否一致。。

使用特权

评论回复
12
zhaoxqi|  楼主 | 2017-6-18 19:52 | 只看该作者
嗯,那我按大家的说法挨个排查一下,先结贴啦,谢谢哈

使用特权

评论回复
13
huangchui| | 2017-6-18 19:54 | 只看该作者
下面是秒表显示程序:
#include<reg51.h>
//
包含51单片机寄存器定义的头文件
unsigned char code Tab[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

//数码管显示0~9的段码表
unsigned char int_time;
//记录中断次数
unsigned char second;
//储存秒
/***********************************************************************
函数功能:快速动态扫描延时,延时约0.6毫秒
************************************************************************/
void delay(void)
{

unsigned char i;

for(i=0;i<200;i++)

;
}
/***********************************************************************
函数功能:显示秒
入口参数:k
出口参数:无
************************************************************************/

void DisplaySecond(unsigned char k)
{



P2=0xfb;
//P2.6引脚输出低电平, DS6点亮

P0=Tab[k/10];
//显示十位

delay();


P2=0xf7;
//P2.7引脚输出低电平, DS7点亮

P0=Tab[k%10];
//显示个位

delay();
P2=0xff;
//关闭所有数码管




}

void main(void)
//主函数

{


TMOD=0x01;
//使用定时器T0


TH0=(65536-46083)/256;
//将定时器计时时间设定为46083×1.085微秒
//=50000微秒=50毫秒


TL0=(65536-46083)%256;

EA=1;
//开启总中断

ET0=1;
//定时器T0中断允许

TR0=1;

//启动定时器T0开始运行

int_time=0;
//中断次数初始化

second=0;

//秒初始化


while(1)

{


DisplaySecond(second);
//调用秒的显示子程序


}

}

//********************************************************
//函数功能:定时器T0的中断服务程序
//*******************************************************

void interserve(void ) interrupt 1 using 1


{

TR0=0;
//关闭定时器T0

int_time ++;
//每来一次中断,中断次数int_time自加1



if(int_time==20)
//够20次中断,即1秒钟进行一次检测结果采样


{

int_time=0;
//中断次数清0


second++;

//秒加1


if(second==60)


second =0; //秒等于60就返回0


}




TH0=(65536-46083)/256;
//重新给计数器T0赋初值

TL0=(65536-46083)%256;

TR0=1;
//启动定时器T0

}

使用特权

评论回复
14
huangchui| | 2017-6-18 21:48 | 只看该作者

为什么在这个秒表显示,函数void interserve(void ) interrupt 1 using 1 中为什么要先TR0=0将定时器关闭呢?

使用特权

评论回复
15
zhenykun| | 2017-6-18 21:50 | 只看该作者

是啊,那还能计数了吗?

使用特权

评论回复
16
wyjie| | 2017-6-18 21:52 | 只看该作者

是要它不计数啊。

等你把定时器中断里德事情做完了,才让它再开始计数啊。

使用特权

评论回复
17
wyjie| | 2017-6-18 21:54 | 只看该作者

感觉你学单片机不注重实操,是不是只看程序不动手的啊?这样学单片机很吃力.

使用特权

评论回复
18
yszong| | 2017-6-18 21:57 | 只看该作者

不要用using  另外你的注释怎么在语句的下面啊 似乎和一般人不一样吧

使用特权

评论回复
19
zhenykun| | 2017-6-18 22:01 | 只看该作者
进中断后,不用再记数了,需要把中断中的事情做完,才能重新记数.

使用特权

评论回复
20
yszong| | 2017-6-18 22:02 | 只看该作者
不加TR0 = 0;计时更准

使用特权

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

本版积分规则

808

主题

10636

帖子

4

粉丝