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
提问者对于答案的评价:谢谢 太有帮助了!