打印

关于PC机串口通信问题,欢迎高手来看下

[复制链接]
3715|23
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
prodigals|  楼主 | 2011-8-14 21:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
自己弄的新手程序,主要问题处,我加了“注意”两个字的,所以对高手应该很好看清楚哦。谢谢哈,希望解答啊。
#include <REGX52.H>
#include"MAX232_H.H"
#include"MacroAndConst.h"
void main()
{
InitMax232();
SBUF=0x55;while(!TI)TI=0;         //注意:此处本来应该由PC机发出,我调试的时候,先程序模拟的
SBUF=0xAA;while(!TI)TI=0;
SBUF=0x01;while(!TI)TI=0;
while(1)
   { RI=1;
    if(Txdflag)
   {
   Txdflag=0;
   Serial_Txd(Txdnum);
   }
   }
}
/***********************************************************************************
***********************************************************************************/
#ifndef __MAX232_H__
#define __MAX232_H__
/*---------------------------------------------------------------------------------*
调用的头文件
*---------------------------------------------------------------------------------*/
#include <REGX52.H>
#include"MacroAndConst.h"
/*---------------------------------------------------------------------------------*
可调用变量
*---------------------------------------------------------------------------------*/
extern bit Txdflag;
extern uchar Txdnum[15];
/*---------------------------------------------------------------------------------*
可调用函数
*---------------------------------------------------------------------------------*/
extern void InitMax232(void);
extern void Serial_Txd(uchar *p);
#endif
/***********************************************************************************
***********************************************************************************/
#include"MAX232_H.H"
bit Txdflag=0;
uchar Txdnum[15]={0,1,2,3,4,5,6,7,8,9,0xa0,0xa1,0xa2,0xa3,0xa4};
/*-------------片内RAM初始化-----------------------*/
void InitMax232(void)
{
TMOD=0X21;
TH1=0XFD;TL1=0XFD;
SCON=0X50;
PCON=0X00;
TR1=1;ES=1;
  
TH0=0XDC;TL0=0X00;
ET0=1;
EA=1;
}
/*-----------------------------------------*/
void Serial_Txd(uchar *p)
{
uchar i;
for(i=0;i<15;i++)
    {
SBUF=*p++;
while(!TI);TI=0;
}
}
/*------------T0中断块---------------------*/
void T0interrupt() interrupt 1
{
static uchar timercount=200;
TH0=0XDC;
TL0=0X00;
if(--timercount==0)
    {
timercount=200;
Txdflag=1;
}
}
/*-----------------串口中断块------------------*/
void Serial_Int() interrupt 4
{
uchar temp;
ES=0;
if(RI)                                              // 注意:为什么一直进不了这个if()里面??我直接将RI=1。或者把RI换成1,都进不去
   {
    temp=SBUF;RI=0;
    if(temp==0x55)
     {
  while(!RI);
  temp=SBUF;RI=0;
  if(temp==0xAA)
    {
    while(!RI);
    temp=SBUF;RI=0;
    if(temp==0x01)
      {
   P1=~temp;
   TR0=1;
   }
    }
    else ES=1;
  }
    else ES=1;
   }
   ES=1;
}
另外,想找个网络上的师傅,不知道那位DX看得起在下的

相关帖子

沙发
prodigals|  楼主 | 2011-8-14 21:20 | 只看该作者
1.程序是这样的,由PC机发出55H,AAH,01H
2.当单片机接受完这3个数据后,将LED1点亮,并且开启T0定时
3.每隔2S,单片机向PC机发送15个字节的数据;
问题关键是:为什么不能进入if()
    按道理,我将SBUF装入数据,RI就应该置位;然后取数据,RI再清零,如此执行下去啊......
    疑惑啊

使用特权

评论回复
板凳
prodigals|  楼主 | 2011-8-14 21:21 | 只看该作者
自己顶起,看了的人,一定要顶一个,谢谢

使用特权

评论回复
地板
prodigals|  楼主 | 2011-8-14 21:21 | 只看该作者
再顶一个

使用特权

评论回复
5
prodigals|  楼主 | 2011-8-14 21:22 | 只看该作者
谢谢,在线等待啊。

使用特权

评论回复
6
相信哥咯| | 2011-8-14 22:36 | 只看该作者
while(!TI)TI=0;
一直卡在这里?

使用特权

评论回复
7
bobo1957| | 2011-8-14 22:56 | 只看该作者
你的中断有没有打开啊!

使用特权

评论回复
8
柳江蔗农| | 2011-8-14 23:50 | 只看该作者
按道理,我将SBUF装入数据,RI就应该置位;然后取数据,RI再清零,如此执行下去啊......
楼主哥,发送数据的SBUF和接收数据的SBUF虽然地址是一样,但是在读写时对寄存器的操作不是同一个寄存器,你写数据进入SBUF,在发送完成后TI置1.如果串口接收到数据,那么RI置1,你这样写SBUF不会把RI置1吧,另外接收为什么不采用状态机方式?

使用特权

评论回复
9
mohanwei| | 2011-8-14 23:58 | 只看该作者
while(!TI)TI=0; ????????
很黄很暴力:lol

使用特权

评论回复
10
huanben| | 2011-8-15 08:26 | 只看该作者
8# 柳江蔗农
你好 串口接受用状态机是怎么样的思路? 我想在都采用中断,觉的不怎么合适啊///

使用特权

评论回复
11
caner_hn| | 2011-8-15 08:26 | 只看该作者
while(!TI)TI=0; ????????
很黄很暴力:lol
mohanwei 发表于 2011-8-14 23:58

while(!TI);TI=0;
没问题吧?

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
sxhhhjicbb + 1
12
huanben| | 2011-8-15 08:28 | 只看该作者
8楼正解,
LZ应该在把51的书,串口方面的在翻一下。

使用特权

评论回复
13
prodigals|  楼主 | 2011-8-15 09:02 | 只看该作者
嗯  
1.while(!TI)TI=0;
这个问题我注意到了,手误了while(!TI);TI=0;
2.8L的说的问题,我刚调试的时候发现了,是有问题的(就是RI和BI会重复一直中断,那么SBUF里面的值不能按照55,AA,01一气存放,也就是会被打断,这是以前对概念不清导致的)
3.状态机是什么,希望讲解一下,谢谢

使用特权

评论回复
14
mohanwei| | 2011-8-15 09:04 | 只看该作者
新手不要乱搞风格……
用KR风格把代码格式化一遍再看吧。
如果是这样你绝对不会写错:
while(!TI)
{
    ;
}
TI=0;

使用特权

评论回复
15
prodigals|  楼主 | 2011-8-15 09:04 | 只看该作者
回6L:
   能进中断的,你说打开没?
   ES=1;ET0=1;EA=1;

使用特权

评论回复
16
zwy65182899| | 2011-8-15 09:19 | 只看该作者
围观一下

使用特权

评论回复
17
peigang| | 2011-8-15 15:24 | 只看该作者
楼主写代码的时候注意一下格式。
你写的很乱,
另外多看看51基础书籍

使用特权

评论回复
18
dfhqgd| | 2011-8-15 16:00 | 只看该作者
呵呵 你的那个WHILE(!TI) 后面应该跟一个分号,正确的写法如下

使用特权

评论回复
19
dfhqgd| | 2011-8-15 16:00 | 只看该作者
while(!ti);
ti = 0;

使用特权

评论回复
20
prodigals|  楼主 | 2011-8-15 17:51 | 只看该作者
回14L:
         KR风格是指什么啊,没听说过呢
         while(!TI){;}TI=0;和while(!TI);TI=0;有区别吗??
回17L:
       程序乱?那应该怎么写,能给个模版吗?

使用特权

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

本版积分规则

1

主题

147

帖子

1

粉丝