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;
}
}
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;
}
}
相关文章推荐
- 【转载】MFC实现串口通信编程 - yu…
- s3c2440&nbsp;串口驱动和测试程序
- 用vs2010开发基于VC++的MFC串口通信程序2***一台机子的两个串口进行通信****
- [2014-03-20]iOS与JAVA&nbsp;通信时Enco…
- 串口通信程序中十六进制格式发送和接收实现
- 安卓蓝牙程序中android&nbsp;java.lang.…
- VC控件MSComm编写串口通信程序(转)
- linux&nbsp;bring&nbsp;up串口何时初始化
- 单片机单串口简单通信程序
- JAVA 树形结构程序事件实例
- DOS下串口通信程序来传送文件的源代码
- Unity3D内部串口通信和Unity3D与Winform程序的串口通信的实现和异常问题
- Tribon Vitesse程序中的run()函数
- Tribon Vitesse程序路径查找顺序
- QT程序移植&nbsp;触摸屏和鼠标的支持
- Cocos2d-x 程序是如何开始运…
- C8051F340串口通信程序(UART0)
- 使用VC++6.0以MFC框架写一个串口通信程序
- 一个C串口通信程序
- VB串口通信技术资料:媒体/源码/论文/书籍/视频/控件/程序