串口通讯例程串口通讯例程串口通讯例程
例:SCON=0X50; //把SM1置1,方式1工作方式;把REN置1,串口允许接收位;01010000 (8位串口,波特率从定时器1来的,波特率=((2^SMOD)/32)*(1/定时器1的溢出时间)),

串口通讯例程
串口通讯例程
例:TMOD=0X20; //8位自动装载定时器 00100000

串口通讯例程
例:PCON=0X80;,把SMOD置1;工作方式1,2,3的波特率加倍,1000 0000

串口通讯例程
例:TR1=1;启动定时器1;

串口通讯例程
例:ES=1;打开串口中断 EA=1;打开总中断

#include “reg51.h”

typedef unsigned char u8;
typedef unsigned int u16;

#define FOSC 12000000L
#define BAUD 4800
#define SMOD_2 2 //(2的SMOD次方)

#define T1MS (256-FOSC*SMOD_2/384/BAUD)

void usartinit()
{
SCON=0X50; //寄存器模式 SM0=0,SM1=1方式1(8位串口,波特率从定时器1来的,波特率=((2^SMOD)/32)*(1/定时器1的溢出时间)),
//REN=1,串口允许接收位,01010000
TMOD=0X20; //8位自动装载定时器
PCON=0X80; //设置SMOD置1,波特率提高一倍,
TH1=T1MS; //波特率数值
TL1=T1MS; //波特率数值
TR1=1; //启动定时器1

ES=1; //打开串口中断
EA=1; //打开总中断
}

void main()
{
usartinit(); //调用子函数
while(1); //让它循环
}

void usart () interrupt 4 //编写外部中断号4
{
u8 receivedata; //变量
if(RI==1) //接收完数据由硬件自动置RI=1;判断是否接收完成
{
receivedata=SBUF; // 保存串口发送的数据
RI=0; //软件清0
SBUF=(receivedata+1); //将接收到的数据通过receivedata返回给Pc机串口
//SBUF 是一个寄存器,作为一个缓冲区,当单片机准备接收数据时,会先把数据放到SBUF中,然后再接收,
//发送也是,当单片机准备发送数据时,会先把数据放到SBUF中,然后再发送出去。
while(!TI); //发送完通过while循环判断,等待发送完成
TI=0; //只有发送完,我们才通过软件清零,这样才可以进行下一次发送
}
}

相关文章: