本帖最后由 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;
}
大家帮帮忙...十分感谢...... |