如何实现2个51单片机之间通过串口通信的源程序

如何实现2个51单片机之间通过串口通信的源程序,第1张

汇编编写的模拟串口通信程序

T2作为波特率控制

UART_RXD 是硬中断0或1口,如果能进入中断,说明该线有一个起始位产生,进入中断后调

用下面的接收程序。退出硬中断之前还需要将硬高镇中断标志重新复位。

UART_TXD 是任何其它IO即可。

UART_SEND:

PUSH IE

PUSH DPH

PUSH DPL

PUSH PSW

PUSH 00H

PUSH ACC

CLR EA

SETB UART_TXDSTART BIT

MOV R0,A

CLR TR2TR2置1,计数器2启动,时间计数启动。

MOV A,RCAP2L计数器2重新装载值

MOV TL2,A置计数器2初顷念扒值 T2需要重新装雀昌载

MOV A,DPH

MOV A,RCAP2H

MOV TH2,A

MOV A,R0

SETB TR2TR2置1,计数器

JNB TF2,$

CLR TF2

JNB TF2,$

CLR TF2

CLR UART_TXDSTART BIT

JNB TF2,$

CLR TF2

JNB TF2,$

CLR TF2

MOV R0,#08H

UART_SEND_LOOP:

RRC A

MOV UART_TXD,C8 BIT

JNB TF2,$

CLR TF2

JNB TF2,$

CLR TF2

DJNZ R0,UART_SEND_LOOP

SETB UART_TXDEND BIT

JNB TF2,$

CLR TF2

JNB TF2,$

CLR TF2

POP ACC

POP 00H

POP PSW

POP DPL

POP DPH

POP IE

RET

UART_REC:

PUSH IE

PUSH DPH

PUSH DPL

CLR EA

CLR TR2TR2置1,计数器2启动,时间计数启动。

MOV A,RCAP2L计数器2重新装载值

MOV TL2,A置计数器2初值 T2需要重新装载

MOV A,DPH

MOV A,RCAP2H

MOV TH2,A

JB UART_RXD,$REC

SETB TR2TR2置1,计数器2启动,时间计数启动。

JNB TF2,$

CLR TF20.5 BIT

JNB TF2,$

CLR TF21 BIT

JNB TF2,$

CLR TF21.5 BIT

MOV C,UART_RXD

MOV ACC.0,C

JNB TF2,$

CLR TF2

JNB TF2,$

CLR TF22.5

MOV C,UART_RXD

MOV ACC.1,C

JNB TF2,$

CLR TF2

JNB TF2,$

CLR TF23.5

MOV C,UART_RXD

MOV ACC.2,C

JNB TF2,$

CLR TF2

JNB TF2,$

CLR TF24.5

MOV C,UART_RXD

MOV ACC.3,C

JNB TF2,$

CLR TF2

JNB TF2,$

CLR TF25.5

MOV C,UART_RXD

MOV ACC.4,C

JNB TF2,$

CLR TF2

JNB TF2,$

CLR TF26.5

MOV C,UART_RXD

MOV ACC.5,C

JNB TF2,$

CLR TF2

JNB TF2,$

CLR TF27.5

MOV C,UART_RXD

MOV ACC.6,C

JNB TF2,$

CLR TF2

JNB TF2,$

CLR TF28.5

MOV C,UART_RXD

MOV ACC.7,C

JNB TF2,$

CLR TF29.5

JNB UART_RXD,$等待停止位,并重新复位计数器

SETB UART_RXD

POP DPL

POP DPH

POP IE

RET

补充回答:

串口调试

1. 发送:向总线上发命令

2. 接收:从总线接收命令,并分析是地址还是数据。

3. 定时发送:从内存中取数并向主机发送.

经过调试,以上功能基本实现,可以通过上位机对单片机进行实时控制。

程序如下:

//这是一个单片机C51串口接收(中断)和发送例程,可以用来测试51单片机的中断接收

//和查询发送,发送没有必要用中断,因为程序的开销是一样的

#include <reg51.h>

#include<stdio.h>

#include <string.h>

#define INBUF_LEN 4 //数据长度

unsigned char inbuf1[INBUF_LEN]

unsigned char checksum,count3 , flag,temp,ch

bit read_flag=0

sbit cp=P1^1

sbit DIR=P1^2

int i

unsigned int xdata *RAMDATA/*定义RAM地址指针*/

unsigned char a[6] ={0x11,0x22,0x33,0x44,0x55,0x66}

void init_serialcomm(void)

{

SCON=0x50 //在11.0592MHz下,设置串行口波特率为9600,方式1,并允许接收

PCON=0x00

ES=1

TMOD=0x21 //定时器工作于方式2,自动装载方式

TH0=(65536-1000)%256

TL0=(65536-1000)/256

TL1=0xfd

TH1=0xfd

ET0=1

TR0=1

TR1=1

// TI=0

EA=1

// TI=1

RAMDATA=0x1F45

}

void serial () interrupt 4 using 3

{

if(RI)

{ RI=0

ch=SBUF

TI=1 //置SBUF空

switch(ch)

{

case 0x01 :printf("A") TI=0break

case 0x02 :printf("B") TI=0break

case 0x03 :printf("C") TI=0break

case 0x04 :printf("D") TI=0break

default :printf("fg") TI=0break

}

}

}

//向串口发送一个字符

void timer0() interrupt 1 using 3{

// char i

flag++

TH0=0x00

TL0=0x00

if(flag==10)

{// cp=!cp

// for(i=0i<6i++)

P2=0x25

TI=1

temp=*RAMDATA

printf("%c",temp)

TI=0

// RAMDATA--

flag=0

}

}

//主程序

main()

{

init_serialcomm() //初始化串口

//向6264中送数据

{

*RAMDATA=0x33

}

while(1)

{

*RAMDATA=0x33

}

}

调试需要注意的问题:

1. 发送过程:在发送时必须保证TI=1:即发送缓冲器为空,否则将导致数据发不出去,如果想强制发送可以用:TI=1.具体发送数据:利用printf(“abcd”)函数直接发送即可。

2. 接收过程:在接收时多选用中断方式,这样可以节约CPU的时间,提高效率,

这段程序本身没有啥大或闷州问题,不知道程序全貌,如果出现问题,可能在前罩迹面初始化部分吧,修改如下衫蔽:

ORG 0000H

LJMP MAIN

ORG 0030H

MAIN:

MOV TMOD,#20H

MOV TH1,#0FDH

MOV TL1,#0FDH

MOV SCON,#50H

SETB TR1

MOV A,#5AH

LOOP:

MOV SBUF,A

JNB TI,$

CLR TI

JNB RI,$

CLR RI

MOV A,SBUF

SJMP LOOP

END

org 0000h

sjmp main

org 0050h

main:

mov p3,#00h

mov tmod,#20h模式2

mov tl1,#0fdh

mov th1,#0fdh

mov pcon,#00h不加倍,9600

mov scon,#40h工作方式1,REN=0(这个地方有问题,不停的发的话应该将Ti置1,也就是发送中断标志置1,就应该是42H)

mov ie,#00h

setb tr1

send:

nop

clr ti

mov a,#33h

mov sbuf,a

jnb ti,$

clr ti

lcall delay

nop

ljmp send

delay:

MOV R1,#18

DEL1: MOV R2,#102

DEL2: MOV R3,#250

DEL3: DJNZ R3,DEL3 2*2*250*100*10=1000000us

DJNZ R2,DEL2

DJNZ R1,DEL1

RET

end

如果首先你的Ti置0的话,上简启面程序则不能发送拦碧如,就是那点出慧慎了错,你改了试一下

MoV scon,#42H

附加一点:你的延时程序得不到一秒的延时

Delay:mov r5,#10

del1:mov r6,#250

del2:mov r7,#200

djnz r7,$

djnz r6,del1

djnz r5,delay


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

原文地址: http://outofmemory.cn/yw/12393803.html

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

发表评论

登录后才能评论

评论列表(0条)

保存