串行通信控制

2010-11-18 16:46

http://hi.baidu.com/%D7%F6%B6%F8%C2%DB%B5%C0/blog/item/725053edc5cec62d27979143.html

关于双单片机串口通讯的问题。

要求如下:
1,如果下位机的P1.0口输入低电平,就发出0x01,上位机在自己的P1.0口输出高电平;
2,如果下位机的P1.1口输入低电平,就发出0x03,上位机在自己的P1.1口输出高电平;
3,只有下位机两个口都变成高电平,才发送0x07,上位机在P1.0和P1.1口都输出低电平。
悬赏分:10 - 解决时间:2010-11-19 09:51
//-----------------------------------------------------------
最佳答案:
根据要求,绘制PROTEUS仿真电路图如下:


图片连接:http://hi.baidu.com/%D7%F6%B6%F8%C2%DB%B5%C0/album/item/d9581a5108d990171238c244.html#IMG=d9581a5108d990171238c244

图中的上位机,是完成串行接收、并根据收到的数据,输出高低电平。使用的程序如下:
//================================================
#include <reg51.h>

#define XTAL 11059200    // CPU晶振频率
#define baudrate 9600    // 通信波特率
#define uchar unsigned char
#define uint unsigned int

sbit K1 = P1^0;          // 定义端口
sbit K2 = P1^1;

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();
    while(1) {
      while(RI == 0);
      RI = 0;
      if (SBUF == 0x01) K1 = 1;
      if (SBUF == 0x03) K2 = 1;
      if (SBUF == 0x07) {
        K1 = 0;
        K2 = 0;
}   } }
//================================================

图中的下位机,要完成输入的检测,并发送不同的串行数据。使用的程序如下:
//================================================
#include <reg51.h>

#define XTAL 11059200    // CPU晶振频率
#define baudrate 9600    // 通信波特率
#define uchar unsigned char
#define uint unsigned int

sbit K1 = P1^0;          // 定义端口
sbit K2 = P1^1;
//-----------------------------------------------------------
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)
{
    bit T_1 = 0, T_2 = 0, T_3 = 0;
    init();
//--------------------------------------------------
    while(1) {
      if ((K1 == 0) && (T_1 == 0)) {
        T_1 = 1;
        T_3 = 0;
        SBUF = 0x01;
        while(TI == 0);
        TI = 0;
      }
//-------------------------------------
      if ((K2 == 0) && (T_2 == 0)) {
        T_2 = 1;
        T_3 = 0;
        SBUF = 0x03;
        while(TI == 0);
        TI = 0;
      }
//-------------------------------------
      if ((K1 == 1) && (K2 == 1) && (T_3 == 0)) {
        T_1 = 0;
        T_2 = 0;
        T_3 = 1;
        SBUF = 0x07;
        while(TI == 0);
        TI = 0;
}   } }
//================================================
程序运行的画面,已经在插图中显示,符合楼主要求。
原题网址:http://zhidao.baidu.com/question/198788419.html?fr=im100008
提问者对于答案的评价:谢谢 太有帮助了!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值