注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

沙粒的博客

 
 
 

日志

 
 

C51:串口程序  

2014-11-02 11:16:14|  分类: 通信 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

一、程序功能

pcc51发送字符串不大于5个字符,c51将收到的字符前端加’S’,末端加’N’,回传给pc.

二、关键点

1c51串口初始化步骤:

定时器设置,确定波特率发生器,定时器分配。

根据波特率,c51频率计算时间常数。

串口设置。

中断设置

2、定时器时间常数计算方法:

从晶振频率到波特率流程如下

晶振->12分频->定时器输入,8位计数,THTL控制定时器溢出时间,或输入分频值,例TH=0xfd,对输入3分频->2分频(默认SMOD=02分频。如SMOD=1不分频)->16分频->波特率。

3、中断程序格式

void 函数名()  interrupt  n  {函数体}

n=0,外部中断0

n=1,定时器/计数器0

n=2,外部中断1

n=3,定时器/计数器1

n=4,串口RI,TI

n=5,定时器/计数器2

4、以T0为例,设T0为定时器,当T0溢出,内部硬件置位TF0。当开中断,进入中断程序后,TF0由硬件自动清;若未开T0中断,TF0用于条件判断,TF0用软件清0

三、代码

#include <reg52.h>

#define uchar unsigned char

 

//定义变量

uchar recbuf[10]; //接收数据缓存

uchar recnum;

 

//初始化工作,

//T0T1 设置为工作方式2,一个作波特率发生器,一个作定时器定时发送控制信号

//串口设置,

void init();

 

//声明处理函数

void answer();

 

//主函数

void main()

{

 

  init();

  while(1)

  {

   

      answer();

  }

 

 

 

}

 

//初始化工作,

//T0T1 设置为工作方式2,一个作波特率发生器,一个作定时器定时发送控制信号

//串口设置,

void init()

{

  //定时器设置

  //T1,方式2,自动重载作波特率发生器

  //T0,方式013位计数器,作定时器,超时溢出

  TMOD=0x20;

 

  //T1常数计算,baud=9600,f=11.0592MHZ

  //晶振->12分频->定时器输入,8位计数,定时器输出->2分频(默认SMOD=0,如SMOD=1不分频)->16分频->波特率

  //常数TC=2^8-f/12/2/16/baud 

  TL1=0xfd;

  TH1=0xfd;

 

  //串口设置

  //串口方式1,允许接收

  SCON=0x50;

 

  //中断设置,串口开中断

  ES=1;    //串口开中断

  EA=1;   //打开 总允许

 

 

 

  //启动定时器

  TR1=1;

 

 

 

}

 

 

//定义串口中断程序,不需要声明

void serial() interrupt 4

{

 

  //关中断

  TI=0;

  ES=0;  //关键语句,关闭中断,程序可顺序向下执行

 

  //启动定时器,超时推出

  TH0=0x00;

  TL0=0x00;

  TR0=1;

 

  //

  recnum=0;

 

  //----- 收到第一个字节

 

  //没有收到数据,未超时,等待

  while((RI==0) && (TF0==0));

  //手动复位

  RI=0;

  //如果超时,返回

  if(TF0==1)

  goto mm;

                                                                                                                                                             

  //收到第一个字节数据

  recbuf[recnum++]=SBUF;

 

 

  //----- 收到第二个字节

 

  //启动定时器,超时推出

  TH0=0x00;

  TL0=0x00;

 

  //没有收到数据,未超时,等待

  while((RI==0) && (TF0==0));

  //手动复位

  RI=0;

  //如果超时,返回

  if(TF0==1)

  goto mm;

                                                                                                                                                             

  //收到第二个字节数据

  recbuf[recnum++]=SBUF;

 

  //----- 收到第三个字节

 

  //启动定时器,超时推出

  TH0=0x00;

  TL0=0x00;

 

  //没有收到数据,未超时,等待

  while((RI==0) && (TF0==0));

  //手动复位

  RI=0;

  //如果超时,返回

  if(TF0==1)

  goto mm;

                                                                                                                                                             

  //收到第二个字节数据

  recbuf[recnum++]=SBUF;

 

  //----- 收到第四个字节

 

  //启动定时器,超时推出

  TH0=0x00;

  TL0=0x00;

 

  //没有收到数据,未超时,等待

  while((RI==0) && (TF0==0));

  //手动复位

  RI=0;

  //如果超时,返回

  if(TF0==1)

  goto mm;

                                                                                                                                                             

  //收到第二个字节数据

  recbuf[recnum++]=SBUF;

 

  //----- 收到第五个字节

 

  //启动定时器,超时推出

  TH0=0x00;

  TL0=0x00;

 

  //没有收到数据,未超时,等待

  while((RI==0) && (TF0==0));

  //手动复位

  RI=0;

  //如果超时,返回

  if(TF0==1)

  goto mm;

                                                                                                                                                             

  //收到第五个字节数据

  recbuf[recnum++]=SBUF;

 

 

  //关闭T0

mm:TR0=0;

    TF0=0;

  ES=1;

 

       

}

 

 

//定义处理函数

void answer()

{

 

 

 

    //

  uchar i;

 

   //关中断发送数据

   RI=0;

   TI=0;

   ES=0;

 

   if(recnum>0)

   {

 

   //发送数据

   SBUF='S';

   while(TI==0);

   TI=0;

 

   for(i=0;i<recnum;i++)

   {

     //发送数据

   SBUF=recbuf[i];

   while(TI==0);

   TI=0;

   }

 

   SBUF='N';

   while(TI==0);

   TI=0;

 

   recnum=0;

 

   }

 

   ES=1;

 

}

  评论这张
 
阅读(590)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017