打印

写了一个串口程序,帮忙看一下吧

[复制链接]
2151|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hdclml|  楼主 | 2009-9-17 11:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
今天写了一个串口程序,是想能过串口调试程序给单片机发一个字节,单片机接收到后在P1口显示,然后由单片机返回给电脑并在串口调试助手里显示出来,暑假的时候就可以着,现在却怎么调也调不对了,有的时候是单片机的P1口显示是对的,返回的值却不对,有的时候连P1口显示的值都不对,都不知道怎么回事呀,哪个高手帮忙改一下吧,谢谢大家!!!
程序如下:


#include<reg51.h>
unsigned char flag,a;
void main()
{
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
TR1=1;
REN=1;

SM0=0;
SM1=1;
EA=1;
ES=1;
while(1)
{

  if(flag==1)
  {
   ES=0;
   flag=0;
   TI=0;
   SBUF=a;
   while(!TI);
   TI=0;
   ES=1;
  }
}
}

void ser()interrupt 4
{
  RI=0;

  a=SBUF;
P1=a;

flag=1;
}谢谢了……

相关帖子

沙发
ruiwei0201| | 2009-9-17 14:41 | 只看该作者
是否应该在中断里添加flag==1的处理?

使用特权

评论回复
板凳
hdclml|  楼主 | 2009-9-17 22:14 | 只看该作者
怎么处理?能具体说说吗?谢谢你…… 2# ruiwei0201

使用特权

评论回复
地板
因特网用户| | 2009-9-17 22:31 | 只看该作者
很久以前  所长说写串口程序 第一反应就是中断+队列

使用特权

评论回复
5
zhaoyu2005| | 2009-9-17 22:37 | 只看该作者
51单片机的发送和接收中断向量是一个,像你这种双工的,得判断是发送中断还是接收中断,你直接就认为是接收中断,当然不对了

使用特权

评论回复
6
hyj41174| | 2009-9-17 22:39 | 只看该作者
中断程序中要判断是接受中断还是发送中断吧!

使用特权

评论回复
7
isbit| | 2009-9-17 22:49 | 只看该作者
/******************************************************************
UART.C  file

作者:wangchaofeng
建立日期: 2007-06-28
修改日期: 2007-06-28
Copyright(C) isbit 2007-2017
All rights reserved            
*******************************************************************/

#include "W79E4051.H"
#include "UART.h"
#include "mytype.h"

#define INBUF_LEN 4 //数据长度

UINT8 inbuf1[INBUF_LEN]={00,01,02,03};
UINT8 display_buffer[10]={00,01,02,03,04,05,06,07};
UINT8 checksum,count3;
bit read_flag=0;

UINT8 Sending;
code UINT8 HexTable[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
UINT8 uart_Rx_Data_Temp;
UINT8 Sending;

bit uart_Receive_Bit;





/************************************************************************
/ 外部函数位置main.c
/
*************************************************************************/

void Delay_ms(UINT16 count);




/**************************************************************************
/函数名称:InitUART
/入口参数:none
/出口参数:none
/函数功能:串口初始化函数,使用10M晶体
/
/BR=2^Smod/32 x fosc/12(256-x)
/ 定时器初值为0xf5
***************************************************************************/
        void InitUART(void)  //串口初始化函数,使用
        {
         EA=0;
         TMOD&=0x0F;
         TMOD|=0x20;        //定时器1工作在模式2
         SCON=0x50;    //串口工作在模式1
         TCON=0x05;
         TH1=0xf4;           ////Baud:4800 fosc=11.0592MHz 0xF4  16M --0XEF  12M --0XF3  
         TL1=0xf4;
         PCON=0x80;    //串口波特率加倍smod=1;
         ES=1;                   //串行中断允许
         TR1=1;            //启动定时器1
         REN=1;            //允许接收
         EA=1;                   //允许中断
        }


/**************************************************************************
/函数名称:SerialPort
/入口参数:none
/出口参数:none
/函数功能:中断源4
/
***************************************************************************/
#if 0
        void SerialPort(void) interrupt 4
        {
         if(RI)    //收到数据
          {
           RI=0;                                         //清中断请求
          }
         else  //发送完一字节数据
          {
           TI=0;
           Sending=0;                                //清正在发送标志
          }
        }
#endif
/*------------------------------------------------------------------------------
uart中断
------------------------------------------------------------------------------*/
#if 1

void Uart0_Isr(void)  interrupt 4
{
        ES=0;
        if (RI)
                {
                        RI = 0;
                        uart_Rx_Data_Temp= SBUF;
                        uart_Receive_Bit = 1;
                }
        else
                {
                        TI = 0;
                        Sending=0;                                //清正在发送标?
                }

        ES=1;
}

#endif


/**************************************************************************
/函数名称:SendToComport
/入口参数:none
/出口参数:none
/函数功能:往串口发送一字节数据
/
***************************************************************************/
        void SendToComport(UINT8 d)           //往串口发送一字节数据
        {
         Sending=1;
         SBUF=d;
         while(Sending);
        }

/**************************************************************************
/函数名称:prints
/入口参数:none
/出口参数:none
/函数功能:发送一个字符串
/
***************************************************************************/

使用特权

评论回复
8
hdclml|  楼主 | 2009-9-18 11:38 | 只看该作者
能具体说说队列吗: 4# 因特网用户

使用特权

评论回复
9
LYXQ| | 2009-9-18 12:02 | 只看该作者
#include<reg51.h>
unsigned char flag,a;
void main()
{
    TMOD=0x20;
    TH1=0xfd;
    TL1=0xfd;
    TR1=1;
    REN=1;

    SM0=0;
    SM1=1;
    EA=1;
    ES=1;
    while(1)
    {
        ;
    }
}

void ser()interrupt 4
{
    if(RI)
    {   RI=0;
        a=SBUF;
        P1=a;
        SBUF=a;
    }
    TI=0;
}

使用特权

评论回复
10
hdclml|  楼主 | 2009-9-18 22:21 | 只看该作者
9# LYXQ

使用特权

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

本版积分规则

26

主题

89

帖子

0

粉丝