您的位置:首页 > 其它

51 串口通信程序

2013-05-07 20:14 260 查看
汇编
ORG 0000h;指定rom地址
ajmp main
;跳转到main
org 0023h
;指定rom地址为0023h串口中断程序
ajmp serial
;串口中断程序
org 0030h ;指定rom地址0030h
main:
;main程序段
mov th1,#0fdh
;12mhz,波特率9600 x=0xfd
mov tl1,#0fdh
mov tmod,#20h
;定时器1模式2
setb tr1
;允许定时器1
mov scon,#50h
;serial 1,ren=1
mov pcon, #00h ;smod=0
MOV P0,#00H

SETB ES
;允许串口中断
SETB EA
;中断总开关

LOOP:

JMP LOOP
;死循环,等待串口中断

serial:
MOV A,SBUF
;第一次引起串口中断的是rxd,
MOV P0,A

MOV SBUF,A
;发送数据txd
JNB TI,$
;jnb 等于0则转移。此处知道发送一帧数据完毕,ti=1才执行下一条语句
CLR TI ;
CLR RI
RETI

c语言

#include <reg51.h>

#include
<string.h>

unsigned char ch;

bit read_flag= 0 ;

void init_serialcom( void ) //串口通信初始设定

{

SCON = 0x50
; //UART为模式1,8位数据,允许接收

TMOD |= 0x20
; //定时器1为模式2,8位自动重装

PCON |= 0x80
; //SMOD=1;

TH1 = 0xFD
; //Baud:19200
fosc="11".0592MHz

IE |= 0x90
;
//Enable Serial Interrupt

TR1 = 1
;
// timer 1 run

TI=1;

}

//向串口发送一个字符

void send_char_com( unsigned char ch)

{

SBUF=ch;

while (TI== 0);

TI= 0 ;

}

//串口接收中断函数

void serial () interrupt 4 using 3

{

if
(RI)

{

RI = 0 ;

ch=SBUF;

read_flag= 1 ; //就置位取数标志

}

}

main()

{

init_serialcom(); //初始化串口

while ( 1 )

{

if (read_flag) //如果取数标志已置位,就将读到的数从串口发出

{

read_flag= 0 ; //取数标志清0

send_char_com(ch);

}

}

}

例子2

// 单片机串行口发送/接收程序,每接收到字节即发送出去

// 和微机相接后键入的字符回显示在屏幕上

// 可用此程序测试

//

#include <reg51.h>

#define XTAL
11059200 //
CUP 晶振频率

#define baudrate
9600 //
通信波特率

void main(void)

{

unsigned char c;

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

TH1=(unsigned char)(256 - (XTAL / (32L * 12L * baudrate)));

TL1=(unsigned char)(256 - (XTAL / (32L * 12L *
baudrate)));
// 定时器0赋初值

SCON = 0x50;

PCON =
0x00;

TR1 = 1;

IE = 0x00; //
禁止任何中断

while(1)

{

while(RI == 0);

RI = 0;

c =
SBUF;
// 从缓冲区中把接收的字符放入c中

SBUF =
c;
// 要发送的字符放入缓冲区

while(TI == 0);

TI = 0;

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: