C51 串口
Posted 一只小阿大:)
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C51 串口相关的知识,希望对你有一定的参考价值。
目录
串口的介绍
串口是一种十分广泛的通讯接口,串口成本低,容易使用,通信线路简单,可实现两个设备的互相通信。
单片机的串口可以使单片机与单片机,单片机与电脑,单片机与各式各样的模块相互通信,极大的扩展了单片机的应用范围,增强了单片机系统的硬件实力。
51单片机内部自带UART(),可实现单片机的串口通信。
串口硬件电路
简单双向串口通信有两根通信线(发送端TXD和接收端RXD)
TXD与RXD要交叉连接
当只需单向的数据传输时,可以直接一根通信线
当电平标准不一致时,需要加电平转换芯片
串口电平标准
电平标准是与数据的对应关系数据1与数据0的表达方式,是传输线缆中认为规定的电压,串口常用的电平标准有三种:
1.TTL电平:+5V 表示1,0V表示 0
2.RS232电平:-3 ~-15V表示1,+3 ~ +15V表示0
3.RS485电平:两线压差 +2 ~ +6V 表示1, -2 ~ -6V表示0(差分信号)
常用通信接口比较
全双工:通信双方可以在同一时刻互相传输数据
半双工:通信双方可以互相传输数据,但某一时刻,只能一个状态
单 :通信只能有一方发送到另一方,不能反向纯属
异步 :通信双方各自约定通信速率
同步 :通信双方靠一根时钟线来约定通信速率
总线 : 连接各个设备的数据传输线
(类似于一条阿鲁,把路边各住户连接起来,使住户可以相互交流)
51单片机的UART
STC89C52有一个UART
STC89C52的UART有四种工作模式:
模式0: 同步移位寄存器
模式1: 8位UART,波特率可变(常用)
模式2:9位UART,波特率固定
模式3:9位UART,波特率可变
UART参数及时序图
波特率 : 串口通信的速率(发送和接收各数据位的间隔时间)
校验位: 用于数据验证
停止位: 用于数据帧的间隔
奇校验:让1的个数为奇数,例如:0100 1001 这时候有三个1了,校验位就为0
偶校验:让1的个数为偶数,例如:0100 1001 这时候有三个1了,校验位就为1
UART模式图
SUBF: 串口数据缓存寄存器,物理上是两个独立的寄存器,但占用相同的地址。
写操作时,写入的是发送寄存器,读操作时,读出的是接收寄存器。
串口和中断
串行口相关寄存器
SUBF: 串口数据缓存寄存器,物理上是两个独立的寄存器,但占用相同的地址。
写操作时,写入的是发送寄存器,读操作时,读出的是接收寄存器。
这是C52的,C51只有一个中断优先级寄存器
串口发送数据
代码
usart.h
#ifndef _UART_H_
#define _UART_H_
void UART_Init(void);
void UART_SendByte(unsigned char Byte);
#endif
usart.c
#include <REGX52.h>
#include "uart.h"
/**
*¹¦ÄÜ£º´®¿Ú³õʼ»¯
*²ÎÊý£ºvoid
*·µ»ØÖµ£ºvoid
*²¨ÌØÂÊ£º4800£¬Ð£Ñéλ£ºÎÞ£¬Í£Ö¹Î»£º1
*/
void UART_Init(void)
{
SCON = 0x40; //0100 0000 ´®¿Ú¿ØÖƼĴæÆ÷
PCON |= 0x80; //ÅäÖò¨ÌØÂʼӱ¶
TMOD &= 0x0F; //µÍËÄλ²»±ä£¬¸ßËÄλÇåÁã
TMOD |= 0x20; //ÅäÖö¨Ê±Æ÷ģʽ1£¬0010 0000 ,µÍËÄλ²»±ä£¬µÚÈýλΪ1
TR1 = 1; //¿ªÆô¶¨Ê±Æ÷1
TL1 = 0xF4;
TH1 = 0xF4;
ET1 = 0;
}
/**
*¹¦ÄÜ£º´®¿Ú·¢ËÍÊý¾Ý
*²ÎÊý£ºByte ÐèÒª·¢Ë͵ÄÊý¾Ý
*·µ»ØÖµ£ºvoid
*/
void UART_SendByte(unsigned char Byte)
{
SBUF = Byte;
while(TI == 0);//ÅжÏÊÇ·ñ·¢ËÍÍê³É
TI = 0;//¸´Î»
}
main.c
#include <REGX52.h>
#include <INTRINS.H>
#include "Timer0.h"
#include "uart.h"
/**
*¹¦ÄÜ£ºÑÓʱ500ms
*²ÎÊý£ºvoid
*·µ»ØÖµ£ºvoid
*/
void Delay500ms(void) //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
_nop_();
i = 22;
j = 3;
k = 227;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
int main()
{
UART_Init();
while(1)
{
UART_SendByte(0x66);
Delay500ms();
}
}
串口中断控制灯开关
注意:我LED灯是P2,输入0和1都会让灯亮,其他会让灯暗,如果是P1,输入0亮,其他暗,具体为啥还不清楚。
代码
uart.h
#ifndef _UART_H_
#define _UART_H_
void UART_Init(void);
void UART_SendByte(unsigned char Byte);
#endif
uart.c
#include <REGX52.h>
#include "uart.h"
/**
*¹¦ÄÜ£º´®¿Ú³õʼ»¯
*²ÎÊý£ºvoid
*·µ»ØÖµ£ºvoid
*²¨ÌØÂÊ£º4800£¬Ð£Ñéλ£ºÎÞ£¬Í£Ö¹Î»£º1
*/
void UART_Init(void)
{
SCON = 0x40; //0101 0000 ´®¿Ú¿ØÖƼĴæÆ÷
PCON |= 0x80; //ÅäÖò¨ÌØÂʼӱ¶
TMOD &= 0x0F; //µÍËÄλ²»±ä£¬¸ßËÄλÇåÁã
TMOD |= 0x20; //ÅäÖö¨Ê±Æ÷ģʽ1£¬0010 0000 ,µÍËÄλ²»±ä£¬µÚÈýλΪ1
TR1 = 1; //¿ªÆô¶¨Ê±Æ÷1
TL1 = 0xF4;
TH1 = 0xF4;
ET1 = 0;
}
/**
*¹¦ÄÜ£º´®¿Ú³õʼ»¯(ÖжÏ)
*²ÎÊý£ºvoid
*·µ»ØÖµ£ºvoid
*²¨ÌØÂÊ£º4800£¬Ð£Ñéλ£ºÎÞ£¬Í£Ö¹Î»£º1
*/
void UART_InterruptInit(void)
{
SCON = 0x50; //0101 0000 ´®¿Ú¿ØÖƼĴæÆ÷
PCON |= 0x80; //ÅäÖò¨ÌØÂʼӱ¶
TMOD &= 0x0F; //µÍËÄλ²»±ä£¬¸ßËÄλÇåÁã
TMOD |= 0x20; //ÅäÖö¨Ê±Æ÷ģʽ1£¬0010 0000 ,µÍËÄλ²»±ä£¬µÚÈýλΪ1
TR1 = 1; //¿ªÆô¶¨Ê±Æ÷1
TL1 = 0xF4;
TH1 = 0xF4;
ET1 = 0;
ES = 1; //´ò¿ª´®¿ÚÖжÏ
EA = 1; //´ò¿ª×ÜÖжÏ
PS = 1; //ÖжÏÓÅÏȼ¶
}
/**
*¹¦ÄÜ£º´®¿Ú·¢ËÍÊý¾Ý
*²ÎÊý£ºByte ÐèÒª·¢Ë͵ÄÊý¾Ý
*·µ»ØÖµ£ºvoid
*/
void UART_SendByte(unsigned char Byte)
{
SBUF = Byte;
while(TI == 0);//ÅжÏÊÇ·ñ·¢ËÍÍê³É
TI = 0;//¸´Î»
}
/**
*¹¦ÄÜ£ºÖжϷþÎñº¯Êý
*²ÎÊý£ºvoid
*·µ»ØÖµ£ºvoid
*/
//×¢Ò⣺ÎÒÕâÊÇP2£¬ÊäÈë0ºÍ1¶¼»áÈõÆÁÁ£¬ÆäËû°µ£¬Èç¹û¸ÄΪP1µÄ»°£¬0ÁÁ1°µ
void UART_Routine(void) interrupt 4
{
if(RI == 1){ //ÅжÏÊÇ·ñÊǽÓÊÕÖжÏ
P2 = SBUF;//½«Êý¾Ý¶Á³ö
RI = 0; //½«RIÇå0£¬·½±ãÏ´ζÁÈ¡
}
}
main.c
#include <REGX52.h>
#include <INTRINS.H>
#include "Timer0.h"
#include "uart.h"
/*¼ÌµçÆ÷µÆ*/
sbit LED = P2^1;
/**
*¹¦ÄÜ£ºÑÓʱ500ms
*²ÎÊý£ºvoid
*·µ»ØÖµ£ºvoid
*/
void Delay500ms(void) //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
_nop_();
i = 22;
j = 3;
k = 227;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
int main()
{
UART_InterruptInit();
while(1)
{
}
}
以上是关于C51 串口的主要内容,如果未能解决你的问题,请参考以下文章