找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1320|回复: 0
打印 上一主题 下一主题
收起左侧

关于两个单片机通信中接收方设置问题

[复制链接]
跳转到指定楼层
楼主
先说一下目的:两个单片机,发送方称为A,接收方称为B。现在是想通过A的物理按键发送给B一个指令,让其开始计时,并输出相应的字符串到串口助手上面,然后通过按下B的物理按键停止计时,并输出相应的字符串给串口助手显示。
目前遇到的情况是指令发送,开始计时并输出相应的字符串到串口助手上面,这些都可以实现。但是停止计时按键按下的时候却出现了问题,不发送并且数码管显示也出现了异常(图1)

以下是接收方B的单片机代码。

#include "STC15W4K.H"      // 包含 "STC15W4K.H"寄存器定义头文件
#include "intrins.h"
#include "stdio.h"
#define uchar unsigned char
#define uint unsigned int
void send_byte(uchar by);
void send_string(uchar *p);
void printf_String();
void printf_String1();
unsigned  char num1=0;           // 存放接收到的1个字节的数据

        uchar time ;
int temp;int temp1=0;
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳
uchar yi,er,san,si;
uint num;

uchar data_L, data_H;
uchar data_0, b;

uchar flag=0;

sbit k4 = P3^3;
sbit k3 = P3^2;
/********************************************************************
* 名称 : Delay()
* 功能 : 延时
* 输入 : i
* 输出 : 无
***********************************************************************/
void delay(uchar i)         //延时函数
{
  uint j,k;
  for(j=i;j>0;j--)
    for(k=500;k>0;k--);
}

/********************************************************************
* 名称 : display()
* 功能 : 数码管显示函数
* 输入 : 无
* 输出 : 无
***********************************************************************/

void display(uchar yi,uchar er,uchar san,uchar si) //显示函数
{

   P2=table[yi];
   P41 = 0;
   delay(5);
   P41 = 1;

   P2=table[er];
   P42 = 0;
   delay(5);
   P42 = 1;

   P2=table[san];
   P44 = 0;
   delay(5);
   P44 = 1;

   P2=table[si];
   P45 = 0;
   delay(5);
   P45 = 1;
}

void printf_String(void)
{        char strTempA[5];
        char strTempB[5];
        char strTempC[5];
        char strTempD[5];
    int c=0;
        int d=0;
  sprintf(strTempA,"%d",temp);
        sprintf(strTempB,"%d",temp1);
        sprintf(strTempC,"%d",c);
        sprintf(strTempD,"%d",d);

        printf ("开始时间:%s%s:%s%s  ",strTempC,strTempD,strTempB,strTempA);  
}

void printf_String1(void)
{        
  char strTempE[5];
        char strTempF[5];
        char strTempG[5];
        char strTempH[5];
   int e =0;
        int f =0;
    sprintf(strTempE,"%d",temp);
        sprintf(strTempF,"%d",temp1);
        sprintf(strTempG,"%d",e);
        sprintf(strTempH,"%d",f);
        
        printf ("结束时间:%s%s:%s%s ",strTempG,strTempH,strTempF,strTempE);
        printf ("所用的时间为:%s%s:%s%s\n ",strTempG,strTempH,strTempF,strTempE);
}




/***********************


                串口初始化


**************************/
void UART_init(void)
{                  
        // 下面代码设置定时器2
        T2H  = 0xFD;        // 波特率:9600 /22.1184MHZ,1T
        T2L  = 0xC0;        // 波特率:9600 /22.1184MHZ,1T
        AUXR = 0x15;    // 0001 0101,T2R=1启动T2运行,T2x12=1,定时器2按1T计数,S1ST2=1
        // 下面代码设置定串口1
        SCON = 0x50;         // 0101 0000 SM0.SM1=01(最普遍的8位通信),REN=1(允许接收)
        // 下面代码设置中断
        ES   = 1;                // 开串口1中断
        EA   = 1;                // 开总中断
        TI=1;  


}
/***********************

                主函数

**************************/

void main()
{
           P0M0=0X00;P0M1=0X00;
        delay(5);
        P1M0=0X00;P1M1=0X00;
        delay(5);
        P2M0=0X00;P2M1=0X00;
        P3M0=0X00;P3M1=0X00;
        P4M0=0X00;P4M1=0X00;    //        双端模式。用于数码管的显示



        TH0=0x0D8;
        TL0=0x0F0;
        
        IT0=1;                       // 外中断0设置为下降沿触发
        EX0=1;                 // 开外中断0
                                          

        
        IT1=1;//外中断1设置为下降沿触发
        EX1=1;//开外中断1
        
        EA=1;
        ET0=1;
        TI=1;

        UART_init();
        
        while(1){
         display(yi,er,temp1,temp);
         
        }
}  

/*********发送一个字节******/
void send_byte(uchar by)
{

    SBUF = by;
    while(!TI);//当写下这句的时候,就不要在中断函数里面在写TI = 0;这句了,不然进入中断函数将TI清零之后,程序就会一直卡在这里
    TI = 0;       //在这里将TI清零
}

/*********发送一个字符串*********/
void send_string(uchar *p)
{
     while(*p!= '\0')
         {
        send_byte(*p);
        p++;
         }
}
void UART1(void) interrupt 4  // 串行口1中断函数
//com6
{
        if(TI)
        {
                TI = 0;                        
        }
        if(RI)
        {        PX1=1;
                RI = 0;
                num1 = SBUF;
                 //num1++;
                SBUF = num1;           // 启动数据发送过程
                 if(SBUF=='*')
                 {        
                    //UART_init();
                         // send_string("w1");
                         TR0=1;
                     delay(100);
                         printf_String();
                         delay(100);
                        
                         //printf_String1();
                         delay(100);  
                        
                          
                 }
                 
                        
        }
}




void TIME0(void) interrupt 1
{

TH0 = 0x0D8;
TL0 = 0x0F0;//定时10ms

time++;

if(time==50)//0.5秒到

{

  time=0;

  temp++;

  if(temp==10)

  {
     temp=0;
     temp1=temp1+1;
  }   

}
}



/*******外中断1**************/
/*void init2(void) interrupt 2
{
        if(k4==0){
        TR0=0;
                delay(50);
        //printf_String();
        
        }
        
} */


还请各位大佬指教一下,问题出现在了哪里?
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表