51单片机串口通讯

//波特率1200bps,无奇偶校验,停止位1,数据位8

//定时器T1做波特率发生器

// 软件模拟测试说明:

//测试采用查询方式进行串口通讯

//将软件仿真环境的晶振设为11.0592 MHz

//软件模拟全速运行, 观察波特率是1200bps

//在串口1中输入数字或字母,可观察到通讯是否有误。

 

 

#include <reg51.h>

 

//串口初始化

void serial_init(void)

{

//ET1 = 0; //CLR 0ABH ;禁止T1中断

TMOD = 0x20; //MOV 89H,#20H ;timer 1 mode 2: 8-Bit reload(定时器T1 模式2: 8位自动初值重装)

TH1 = 0xE8; //MOV 8DH,#0E8H

TL1 = 0xE8; //MOV 8BH,#0E8H ;1200bps, 11.059

TR1 = 1; //SETB 8EH ;启动定时器1

 

SCON = 0x50; // mode 1: 10-bit UART, enable receiver(模式1: 10位异步发送/接收, 使能接收允许位)

//SM1 = 1; // ;串行口 模式1

//SM0 = 0;

//REN = 1; // ;允许串行中断接收

 

SM2 = 1; //SETB O9DH ;收到有效的停止位时才将RI置1

 

ES = 1; //SETB 0ACH ;允许串行中断

EA = 1; //SETB 0AFH ;总中断开

}

 

//中断方式处理串口数据

 

void serial(void) interrupt 4 using 1

{

if(RI)

{

// RI = 0;

// 串口接收, 采用临时缓冲

}

#if 0

if(TI)

{

// TI = 0;

// 串口发送, 没有必要使用中断方式

}

#endif

 

}

 

// 查询方式接收串口数据

unsigned char getchar(void)

{

while(!RI);// 没有收到串口数据则一直等待

RI=0;

return SBUF;

}

// 查询方式发送串口数据

void putchar(unsigned char ch)

{

SBUF=ch;

while(!TI);

TI=0;

}

 

code unsigned char HEX_TAB []="0123456789ABCDEF";

void puthex(unsigned char ch)

{

unsigned char i,j;

i=ch>>4;

j=ch&0x0f;

putchar(HEX_TAB[i]);

putchar(HEX_TAB[j]);

}

void main(void)

{

unsigned char i;

 

serial_init(); // 串口初始化

 

 

do {

i=getchar(); // 如果没有收到串口数据则一直等待(查询接收串口数据的弊端)

 

++i;

--i; // 观察断点

 

putchar(i); // 在串口显示接收到的ASCII数据(就是把原来收到的数据再送回串口)

putchar(' ');

putchar(' ');

 

putchar('0');

putchar('x');

puthex(i); // 在串口以十六进制格式显示接收的ASCII数据

 

putchar(' ');

putchar(' ');

 

++i;

--i; // 观察断点

 

}while(1);

}

更多单片机程序,请朋友们多多关注免费单片机教程及学习,谢谢!

posted @ 2013-03-18 17:16  顶顶顶顶  阅读(161)  评论(0)    收藏  举报