`
hzy3774
  • 浏览: 984718 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
社区版块
存档分类
最新评论

51单片机串口通信

 
阅读更多

使用串口可以方便的让单片机与高速设备之间通信,虽然速度比不上USB,但简单容易实现,而且.Net提供了串口通信接口,编写上机位十分方便:

单片机与电脑通信接收数据实例



 单片机串口收发是采用中断机制,单片机中有一个寄存器可以接收串口上发来的一个字节数据,位数用户可以设置,接收完成后单片机触发中断。

   所以在中断函数中处理接收的那个字节就可以了,一般将其缓存入数组或者变量,以免接收下一个字节时被覆盖。

   而主函数中,只需要从缓存中读取已接受的数据就可以了:

如下示例:

serial.h

#ifndef SERIAL_H
#define SERIAL_H

#define uchar unsigned char

//#define FOSC 11059200L //晶振频率
#define FOSC 22118400L //晶振频率
#define BAUD 9600L		//波特率

extern uchar recData;//接受到的数据
extern uchar flag;//标志位,标志是否收到数据

extern void uartInit();
extern void sendByte(uchar dat);

#endif

 

 

serial.c

#include <reg51.h>
#include "serial.h"

uchar recData;
uchar flag;

void uartInit() {
    TMOD = 0x20;//定时器一方式二
    TH1 = TL1 = -(FOSC/12/32/BAUD);//设置装入初值
    TR1 = 1;//启动定时器1
    SM0 = 0;
    SM1 = 1;//设置串口为方式一
    REN = 1;//接收使能
    EA = 1;
    ES = 1;//打开中断
    flag = 0;
}

static void serial() interrupt 4 {
    recData = SBUF;
    RI = 0;//清除中断
    flag = 1;
}

void sendByte(uchar dat) {
    ES = 0;//关闭中断
    SBUF = dat;//写入数据
    while(!TI);//等待数据发送结束
    TI = 0;//手动置0
    ES = 1;//打开中断
}
/*
void sendString(uchar *str) {
    while(*str) {
        sendByte(*str++);
    }
}*/

 main.c

#include "serial.h"

void main(){
	uartInit();
    while(1) {
        if(flag) {
            sendByte(recData);//如果收到数据,将数据原样返回
			flag = 0;
        }
    }
}

 

 如果所需的晶振和波特率不相同,在头文件中直接修改就行了

  • 大小: 52.1 KB
  • 大小: 40.2 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics