OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5830|回复: 5

STC15W408AS串口通信 不成功

[复制链接]

1

主题

1

帖子

0

精华

新手入门

积分
7
金钱
7
注册时间
2019-9-12
在线时间
1 小时
发表于 2019-9-17 20:04:22 | 显示全部楼层 |阅读模式
1金钱
谁帮我看看怎么回事,我想通过按钮IN1 的开关来控制串口发送一组数组命令
keil debug 的时候  看到TBUF 也是每个数组都发了


//*********************************************************************/
#include "STC15W408AS.h"
#include <intrins.H>
#define uchar unsigned char //宏定义字符型变量
#define uint  unsigned int    //宏定义整型变量
/********************************************************************
                            波特率设定
#define BAUD 0XFE80  //9600bps@ 11.0592MHZ


uchar dat; //用于存储单片机接收发送缓冲寄存器SBUF里面的内容

        sbit IN1 = P1^2;            /*单片机1.2引脚检测IN1是否动作*/
       sbit IN2 = P1^3;            /*单片机1.3引脚检测IN2是否动作*/
       sbit IN3 = P1^4;            /*单片机1.4引脚检测IN3是否动作*/
       sbit IN4 = P1^5;            /*单片机1.5引脚检测IN4是否动作*/
       sbit IN5 = P1^6;            /*单片机1.6引脚检测IN5是否动作*/
       sbit IN6 = P1^7;            /*单片机1.7引脚检测IN5是否动作*/
       sbit IN7 = P5^4;            /*单片机5.4引脚检测IN5是否动作*/
       sbit IN8 = P5^5;            /*单片机5.5引脚检测IN5是否动作*/
      
  sbit COM1 = P3^7;          /*单片机3.7引脚控制继电器COM1*/
  sbit COM2 = P3^6;          /*单片机3.6引脚控制继电器COM2*/
  sbit COM3 = P3^5;          /*单片机3.5引脚控制继电器COM3*/
  sbit COM4 = P3^4;          /*单片机3.4引脚控制继电器COM4*/
    bit bz1=0;
    bit bz2=0;
    bit bz3=0;
    bit bz4=0;
    bit bz5=0;
    bit bz6=0;
    bit bz7=0;
    bit bz8=0;
/********************************************************************
                            定义特殊寄存器
*********************************************************************/
sbit RXB=P3^0;
sbit TXB=P3^1;
/********************************************************************
                           定义数据类型
*********************************************************************/
uchar TBUF,RBUF;
uchar TDAT,RDAT;
uchar TCNT,RCNT;
uchar TBIT,RBIT;
uint TING,RING;
uint TEND,REND;

void UART_INIT(); //声明函数

uchar t,r;          //定义数据类型
uchar but;      //数据存储数组

uchar code DisPlayOn[21]=
{0x01, 0x30 ,0x41 ,0x30 ,0x41 ,0x30 ,0x43 ,0x02 ,0x43 ,0x32 ,0x30 ,0x33 ,0x44 ,0x36 ,0x30 ,0x30 ,0x30 ,0x31 ,0x03 ,0x73 ,0x0d};
// 0A0A0CC203D60001s       开机
uchar code DisPlayOff[21]=
{0x01, 0x30 ,0x41 ,0x30 ,0x41 ,0x30 ,0x43 ,0x02 ,0x43 ,0x32 ,0x30 ,0x33 ,0x44 ,0x36 ,0x30 ,0x30 ,0x30 ,0x34 ,0x03 ,0x76 ,0x0d};
// 0A0A0CC203D60004v    关机



/********************************************************************
                            延时函数
*********************************************************************/
void delay(uchar t)
{
  uchar i,j;
   for(i=0;i<t;i++)
   {
        for(j=130;j>0;j--);
     { ;
     }
   }
}
/****************发送函数*********************/
void senduart2(char* str)
{   
     uchar i;
            if(TEND)      //允许发送
            {
              TEND=0;
               for(i=0;i<21;i++)
                {
                  TBUF=str;
                }
                  TING=1;
            }
            while(!TEND);
}
/********************************************************************
                            主函数
*********************************************************************/
void main()
{  
TMOD=0X00;       //定时器T0设定
AUXR=0X80;       //辅助寄存器
TL0=BAUD;       //十六位寄存器
TH0=BAUD>>8;   //十六位寄存器
TR0=1;           //开定时器
ET0=1;
PT0=1;
EA=1;           //开总中断
UART_INIT();   //串口初始化
while(1)       //无线循环
{
if((IN1==0)&&(bz1==0))
{
  delay(10);
  if(IN1==0)
  {
     bz1=1;
     senduart2(DisPlayOn);
  }
}
}
}

/********************************************************************
                            定时器T0
*********************************************************************/
void tm0()interrupt 1 using 1
{
if(RING)
  {
   if(--RCNT==0)
    {
     RCNT=3;
     if(--RBIT==0)
        {
         RBUF=RDAT;
         RING=0;
         REND=1;
        }
        else
        {
         RDAT>>=1;
         if(RXB)RDAT|=0X80;
        }

    }
  }
    else if(!RXB)
    {
     RING=1;
     RCNT=4;
     RBIT=9;
    }
    if(--TCNT==0)
    {
    TCNT=3;
    if(TING)
    {
      if(TBIT==0)
      {
      TXB=0;
      TDAT=TBUF;
      TBIT=9;
      }
      else
      {
      TDAT>>=1;
      if(--TBIT==0)
      {
       TXB=1;
       TING=0;
       TEND=1;
      }
      else
      {
      TXB=CY;
      }
      }
    }
    }
}
/********************************************************************
              功能:串口初始化,波特率9600,方式1
*********************************************************************/
void UART_INIT()
{
TING=0;
RING=0;

TEND=1;
REND=0;

TCNT=0;
RCNT=0;
}

/********************************************************************
                            结束
*********************************************************************/



正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165369
金钱
165369
注册时间
2010-12-1
在线时间
2110 小时
发表于 2019-9-18 01:37:11 | 显示全部楼层
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165369
金钱
165369
注册时间
2010-12-1
在线时间
2110 小时
发表于 2019-9-18 01:37:13 | 显示全部楼层
帮顶
回复

使用道具 举报

6

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
194
金钱
194
注册时间
2019-9-24
在线时间
69 小时
发表于 2019-12-5 15:50:41 | 显示全部楼层
开了中断,没有中断服务函数是不得的
回复

使用道具 举报

8

主题

169

帖子

0

精华

高级会员

Rank: 4

积分
563
金钱
563
注册时间
2015-7-4
在线时间
105 小时
发表于 2019-12-20 11:17:06 | 显示全部楼层
本帖最后由 chaifuwu 于 2019-12-20 11:19 编辑

参考STC提供的例程你是用的是  循环等待发送机制,需要判断发送完成后才可发送下一个字节

void senduart2(char* str)
{   
     uchar i;
            if(TEND)      //允许发送
            {
              TEND=0;
               for(i=0;i<21;i++)
                {
                  while(!IT);
                  TBUF=str;
                }
                  TING=1;
            }
            while(!TEND);
}

回复

使用道具 举报

8

主题

169

帖子

0

精华

高级会员

Rank: 4

积分
563
金钱
563
注册时间
2015-7-4
在线时间
105 小时
发表于 2019-12-20 11:20:37 | 显示全部楼层
taiyue123 发表于 2019-12-5 15:50
开了中断,没有中断服务函数是不得的

对滴,也是一个问题
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-1 04:51

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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