找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2771|回复: 0
打印 上一主题 下一主题
收起左侧

单片机串口编程参考

[复制链接]
跳转到指定楼层
楼主
ID:104835 发表于 2016-2-4 04:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
标准串口参考程序如下:(来源周立功单片机公司)具有一般参考意义。
#include<reg51.h>
unsigned char UART_RX; //定义串口接收数据变量
unsigned char RX_flag; //定义穿行接收标记
/*********************************************************************************************
函数名:UART串口初始化函数
调  用:UART_init();
参  数:无
返回值:无
结  果:启动UART串口接收中断,允许串口接收,启动T/C1产生波特率(占用)
备  注:振荡晶体为12MHz,PC串口端设置 [ 4800,8,无,1,无 ]
/**********************************************************************************************/
void UART_init (void){
EA = 1; //允许总中断(如不使用中断,可用//屏蔽)
ES = 1; //允许UART串口的中断

TMOD = 0x20; //定时器T/C1工作方式2
SCON = 0x50; //串口工作方式1,允许串口接收(SCON = 0x40 时禁止串口接收)
TH1 = 0xF3; //定时器初值高8位设置
TL1 = 0xF3; //定时器初值低8位设置
PCON = 0x80; //波特率倍频(屏蔽本句波特率为2400)
TR1 = 1; //定时器启动   
}
/**********************************************************************************************/

/*********************************************************************************************
函数名:UART串口接收中断处理函数
调  用:[SBUF收到数据后中断处理]
参  数:无
返回值:无
结  果:UART串口接收到数据时产生中断,用户对数据进行处理(并发送回去)
备  注:过长的处理程序会影响后面数据的接收
/**********************************************************************************************/
void UART_R (void) interrupt 4  using 1{ //切换寄存器组到1
RI = 0;   //令接收中断标志位为0(软件清零)
UART_RX = SBUF; //将接收到的数据送入变量 UART_data
RX_flag=1;  //标记接收
//用户函数内容(用户可使用UART_data做数据处理)

//SBUF = UART_data; //将接收的数据发送回去(删除//即生效)
//while(TI == 0); //检查发送中断标志位
//TI = 0;  //令发送中断标志位为0(软件清零)
}
/**********************************************************************************************/
/*********************************************************************************************
函数名:UART串口发送函数
调  用:UART_T (?);
参  数:需要UART串口发送的数据(8位/1字节)
返回值:无
结  果:将参数中的数据发送给UART串口,确认发送完成后退出,采用非中断方式
备  注:
/**********************************************************************************************/
void UART_T (unsigned char UART_data){ //定义串口发送数据变量
ES=0;    //禁止穿行中断
SBUF = UART_data; //将接收的数据发送回去
while(TI == 0);  //检查发送中断标志位
TI = 0;   //令发送中断标志位为0(软件清零)
ES=1;   //打开穿行中断
}
/*********************************************************************************************
函数名:UART串口发送字符串函数
调  用:UART_S (?);
参  数:需要UART串口发送的数据(8位/1字节)
返回值:无
结  果:将参数中的数据发送给UART串口,确认发送完成后退出,采用非中断方式
备  注:
/**********************************************************************************************/
void UART_S(unsigned char *str)
{
while(1)
{
  if(*str=='\0') break;
  UART_T(*str++);
}
}
/*********************************************************************************************
函数名:主函数
调  用:main();
参  数:
返回值:无
结  果:
备  注:
/**********************************************************************************************/
void main()
{
unsigned char Buf_data[]={"      welcome to MCU world.     \n\r"};
UART_init();
UART_S(Buf_data);
while(1){
  if(RX_flag==1)
  {
   UART_T(UART_RX);
   RX_flag=0;
  }
}
}
///////////////////////////////////////////////////////////////////
个人认为普通单片机在通信频率上及不上AVR单片机,更可能使用USB转串口工具进行开发,所以串口波特率不能过高,最好是2400或4800。过高只会导致乱码或丢失。

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表