双机通信(8051单片机)

双机通信(8051单片机),第1张

仿真图用了DB9接口,那个DB9是对应电脑硬件的串口的,即仿真时,数据从DB9收/发,对应的电脑实际串口数据收发。所以,两个DB9是不能用导线连接起通信片,你那三条线画了也没用。

DB9是直接与单片机的RXD,TXD连接的,不能姿衫加MAX232,加了反倒不对了。

要仿真双机通信,很简单,两迹郑腔个单片机的TXD,RXD直接交叉连接就行,而你这么画,又加MAX232,又用DB9反倒不行了。要用MAX232也可以,但丛昌不能用DB9了,两个单片机的MAX232对接。

初始化程序:

SCON = 0x50 //方式1,允许接陆尘受

TMOD = 0x20 //设闹仿置time1,方式2

TH1 = 0xfd//波特率9600b/s晶振12MHz

TL1 = 0xfd

ES = 1 //允许串口液悉纤中断

EA = 1 //中断总开启

TR1 = 1 //T1开启

#include <reg52.h>

#include <intrins.h>

#define uchar unsigned char

#define uint unsigned int

sbit LCD_RS = P2^0

sbit LCD_RW = P2^1

sbit LCD_EN = P2^2

#define delayNOP(){_nop_()_nop_()_nop_()_nop_()}

uchar data RXDdata[ ] = {0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,

0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20 }

uchar temp,buf,m,count

bit playflag=0

uchar code cdis1[ ] = {" SERILA TRANFER "}

uchar code cdis2[ ] = {""贺茄}

/**********************************************************

延时子程序

**********************************************************/

char code SST516[3] _at_ 0x003b

void delay1(uint ms)

{

uchar k

while(ms--)

{

for(k = 0k <120k++)

}

}

/******************************************************************/

/**/

/*检查LCD忙状态禅梁察 */

/*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。 */

/**/

/******************************************************************/

bit lcd_busy()

{

bit result

LCD_RS = 0

LCD_RW = 1

LCD_EN = 1

delayNOP()

result = (bit)(P0&0x80)

LCD_EN = 0

return(result)

}

/*******************************************************************/

/* */

/*写指令数据到渣巧LCD */

/*RS=L,RW=L,E=高脉冲,D0-D7=指令码。 */

/* */

/*******************************************************************/

void lcd_wcmd(uchar cmd)

{

while(lcd_busy())

LCD_RS = 0

LCD_RW = 0

LCD_EN = 0

_nop_()

_nop_()

P0 = cmd

delayNOP()

LCD_EN = 1

delayNOP()

LCD_EN = 0

}

/*******************************************************************/

/* */

/*写显示数据到LCD */

/*RS=H,RW=L,E=高脉冲,D0-D7=数据。 */

/* */

/*******************************************************************/

void lcd_wdat(uchar dat)

{

while(lcd_busy())

LCD_RS = 1

LCD_RW = 0

LCD_EN = 0

P0 = dat

delayNOP()

LCD_EN = 1

delayNOP()

LCD_EN = 0

}

/*******************************************************************/

/* */

/* LCD初始化设定 */

/* */

/*******************************************************************/

void lcd_init()

{

delay1(15)

lcd_wcmd(0x01) //清除LCD的显示内容

lcd_wcmd(0x38) //16*2显示,5*7点阵,8位数据

delay1(5)

lcd_wcmd(0x38)

delay1(5)

lcd_wcmd(0x38)

delay1(5)

lcd_wcmd(0x0c) //开显示,显示光标,光标闪烁

delay1(5)

lcd_wcmd(0x01) //清除LCD的显示内容

delay1(5)

}

/*******************************************************************/

/* */

/* 设定显示位置 */

/* */

/*******************************************************************/

void lcd_pos(uchar pos)

{

lcd_wcmd(pos | 0x80) //数据指针=80+地址变量

}

/*********************************************************

发送数据函数

*********************************************************/

void senddata(uchar dat)

{

SBUF =dat

while(!TI)

TI = 0

}

/*********************************************************

串行中断服务函数

*********************************************************/

void serial() interrupt 4

{

ES = 0 //关闭串行中断

RI = 0 //清除串行接受标志位

buf = SBUF //从串口缓冲区取得数据

playflag=1

switch(buf)

{

case 0x31: senddata('X')break //接受到1,发送字符'W'给计算机

case 0x32: senddata('L')break //接受到2,发送字符'I'给计算机

case 0x33: senddata('1')break //接受到3,发送字符'L'给计算机

case 0x34: senddata('0')break //接受到4,发送字符'L'给计算机

case 0x35: senddata('0')break //接受到5,发送字符'A'给计算机

case 0x36: senddata('0')break //接受到5,发送字符'R'给计算机

default:senddata(buf)break //接受到其它数据,将其发送给计算机

}

if(buf!=0x0D)

{

if(buf!=0x0A)

{

temp =buf

if(count<16)

{

RXDdata[count]=temp

count++

}

}

}

ES = 1 //允许串口中断

}

/*********************************************************

数据显示函数

*********************************************************/

void play()

{

if(playflag)

{

lcd_pos(0x40) //设置位置为第二行

for(m=0m<16m++)

lcd_wdat(cdis2[m]) //清LCD1602第二行

for(m=0m<16m++)

{

lcd_pos(0x40+m) //设置显示位置为第二行

lcd_wdat(RXDdata[m]) //显示字符

}

playflag=0

count=0x00

for(m=0m<16m++)

RXDdata[m]=0x20//清显存单元

}

}

/*********************************************************

主函数

*********************************************************/

void main(void)

{

P0 = 0xff

P2 = 0xff

SCON=0x50 //设定串口工作方式

PCON=0x00 //波特率不倍增

TMOD=0x20 //定时器1工作于8位自动重载模式, 用于产生波特率

EA=1

ES = 1 //允许串口中断

TL1=0xf3

TH1=0xf3//波特率2400

TR1=1

lcd_init()

lcd_pos(0x00) //设置显示位置为第一行

for(m=0m<16m++)

lcd_wdat(cdis1[m]) //显示字符

lcd_pos(0x40) //设置显示位置为第二行

for(m=0m<16m++)

lcd_wdat(cdis2[m]) //显示字符

while(1)

{

play()

}

}

这个串口通信程序在我的开发版上已经全部验证通过,你可以根据实际,攸 改里面某些参数,满足你自己的需要就行。

比如你你点亮小灯,这部分你只可在相应位置添加代码即可。单片机都是51的。

其中1602的显示程序是用来验证是否通信成功,这部分你可作为参考。这部分你大可用小灯显示程序来替代。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/12475969.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-24
下一篇2023-05-24

发表评论

登录后才能评论

评论列表(0条)

    保存