打印

请教关于51串口通讯...含泪跪求...请大家帮忙

[复制链接]
2388|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jy0901428|  楼主 | 2011-4-24 18:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 jy0901428 于 2011-4-27 01:51 编辑

51双机单向通讯.主机向从机发送一个十六进制数,为了验证是否通讯成功在从机上接了个数码管显示.若发送成功则数码管灭.失败没反应就是常亮.但是为什么在proteus仿真上可以正常通讯,而在实际的单片机上无法通讯.我用的是Keil在单片机上调试.
程序如下:
主机
#include <reg51.h>
#define XTAL 11059200    // CPU晶振频率
#define baudrate 9600    // 通信波特率
#define uchar unsigned char
#define uint unsigned int
void init(void)
{
    SCON = 0x50;            // 设定串行口工作方式
    PCON &= 0x00;           // 波特率不倍增
    TMOD = 0x20;            // 定时器1工作于8位自动重载模式, 用于产生波特率
    TH1 = (unsigned char)(256 - (XTAL / (32L * 12L * baudrate)));
    TL1 = (unsigned char)(256 - (XTAL / (32L * 12L * baudrate))); // T1赋初值
    TR1 = 1;                // 启动定时器1
    IE = 0x00;              // 禁止任何中断
    EA = 1;                 // 中断总允许
}
void main(void)
{
    init();

    SBUF = 0x28;
    while(TI == 0);
    TI = 0;
}


从机

#include <reg51.h>
#define XTAL 11059200    // CPU晶振频率
#define baudrate 9600    // 通信波特率
#define uchar unsigned char
#define uint unsigned int
uchar temp;
sbit K1 = P1^0;          // 定义端口
void init(void)
{
    SCON = 0x50;            // 设定串行口工作方式
    PCON &= 0x00;           // 波特率不倍增
    TMOD = 0x20;            // 定时器1工作于8位自动重载模式, 用于产生波特率
    TH1 = (unsigned char)(256 - (XTAL / (32L * 12L * baudrate)));
    TL1 = (unsigned char)(256 - (XTAL / (32L * 12L * baudrate))); // T1赋初值
    TR1 = 1;                // 启动定时器1
    EA = 1;                 // 中断总允许
    ES=1;
}
//-----------------------------------------------------------
void main(void)
{
     int i,j;
     init();

     for(i=1000;i>0;i--)
          for(j=100;j>0;j--);              //延迟一段时间再进行数码管灭操作.便于观察

     if ( temp==0x28)
     K1= 0;
}
void  intkolk(void) interrupt 4
{
     if(RI)
     {
         temp=SBUF;
     }
      RI=0;
}



大家帮帮忙...十分感谢......

相关帖子

沙发
chunyang| | 2011-4-26 01:15 | 只看该作者
仿真正确但烧录到MCU中不正确应先检查烧录是否正确,再检查单片机时钟是否起振,复位电路是否有效,你最好给出电路图。

使用特权

评论回复
板凳
zhya666| | 2011-4-26 12:49 | 只看该作者
你现在看到的是灯一直亮呢还是一直灭?
    K1= 0; 是表示灯灭还是灯亮?

使用特权

评论回复
地板
jy0901428|  楼主 | 2011-4-27 01:56 | 只看该作者
2# chunyang   问题解决了...十分感谢...但是有另个个问题.就是两个51传数据`用LEC显示传过来的数据总是不停的变.为什么会有一些没用的数据传到下位机?

使用特权

评论回复
5
jy0901428|  楼主 | 2011-4-27 01:57 | 只看该作者
. 4# jy0901428

使用特权

评论回复
6
chunyang| | 2011-4-27 02:35 | 只看该作者
2# chunyang   问题解决了...十分感谢...但是有另个个问题.就是两个51传数据`用LEC显示传过来的数据总是不停的变.为什么会有一些没用的数据传到下位机?
jy0901428 发表于 2011-4-27 01:56


这是程序错误或电路设计有误造成的,设计正确绝对不会有此现象发生。

使用特权

评论回复
7
s2886251| | 2011-6-29 17:41 | 只看该作者
数据不停的变是因为用的是串口通信,数据接收要一个过程,而LCD是在不停的刷新,数据也在改变,所以你接收的数据显示也在不停的改变,用一个变量保存接收数据,然后显示

使用特权

评论回复
8
huiyi00| | 2011-6-29 17:46 | 只看该作者
不错

使用特权

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

本版积分规则

0

主题

5

帖子

0

粉丝