51单片机串口通讯之中断法

发布者:草莓熊猫最新更新时间:2016-10-20 来源: eefocus关键字:51单片机  串口通讯  中断法 手机看文章 扫描二维码
随时随地手机看文章
程序讲解:
/*---------------------------------------------------------------*/
 //串口通讯
 //按下按钮,单片机发送数据"Come On!\r\n"给主机
 //单片机晶振:11.0592MHz
 //波特率:  9600bps
 
 
 /*-------------------------------------------------------------*/
 //包含头文件
 #include
 unsigned char code tab[]={"Come On!\r\n"};
 
 #define k1   P3_2  //对应开发板硬件
 
 /*-------------------------------------------------------------*/
 //串口初始化
 void UART_Init(void)
 {
  SCON = 0x50;    //串口工作方式为1,串行允许接受
  TMOD = 0x20;   //定时器1工作在方式2
  PCON = 0x80;   //SMOD = 1; 波特率加倍
  TH1  = 0xfA;      //波特率 9600bps fosc="11".0592MHz
  TL1  = 0xfA;
  ES   = 1;             //开串口中断
  TR1  = 1;            //允许定时器1工作
  EA   = 1;             //开总中断
 }
 
 
 
 /*-------------------------------------------------------------*/
 //延时5000+0us 函数定义
 void delay5ms(void)
 {
   unsigned char i,j,k;
   for(i=135;i>0;i--)
   for(j=2;j>0;j--)
   for(k=7;k>0;k--);
 }
 
 
 
 /*-------------------------------------------------------------*/
 //串口发送一个字节
 void Uart_SendChar(unsigned char dat)
 {
  SBUF = dat;    //待发送的数据写入缓冲区
  while(!TI);        //等待发送完成
  TI = 0;             //清零发送标志位
 }
 
 
 
 /*-------------------------------------------------------------*/
 //串口发送一个字符串
 void Uart_SendString(unsigned char *dat)
 {
  while(*dat!='\0')
  {
   Uart_SendChar(*dat); //发送当前数据
   dat++;                         //指向下一个要发送的数据
  } 
 }
  
 
 
 
 /*-------------------------------------------------------------*/
 //主函数
 void main(void)
 {
  UART_Init();   //初始化串口
 
  while(1)
  { 
   if(k1==0)
   {
    delay5ms();
    if(k1==0)
    {
     Uart_SendString(tab);  //发送数据
     while(P3_2==0);
    }
   }
  }    
 }
 
 
 
 /*-------------------------------------------------------------*/
 //串口接收中断函数
 void INT_UartRcv(void) interrupt 4
 {
  unsigned char Rcv = 0;
  if(RI)                   //查询接收标志位(有数据发送过来时置为1)
  {
   RI  = 0;              //接收标志位清零
   Rcv = SBUF;     //存储缓冲区的数据
   Uart_SendChar(Rcv); //让从电脑上传到单片机的数据,传回的电脑显示
  }
 }
 
本节重点:
1、ES 串行通信中断使能在中断使能寄存器IE 中
寄存器对应位:EA  -   ET2   ES   ET1   EX1   ET0   EX0
EA   使能标志位置位则所有中断使能复位则禁止所有中断
-       保留
ET2  定时器2 中断使能
ES   串行通信中断使能
ET1 定时器1 中断使能
EX1 外部中断1 使能
ET0 定时器0 中断使能
EX0 外部中断0 使能

2、当有数据从串口传送到单片机时,串口接收中断标志位RI会置位,此时若相关中断均使能则会进入串口接收中断服务函数

关键字:51单片机  串口通讯  中断法 引用地址:51单片机串口通讯之中断法

上一篇:使用AT89C51和DS18B20温度测量方法
下一篇:C51 单片机_波形发生器

推荐阅读最新更新时间:2024-03-16 15:16

8051单片机(STC89C52)八个LED灯闪烁
#include STC89C5xRC.h void delay() { int i,j; for(i=0;i 200;i++) for(j=0;j =200;j++) { ; } } int main() { while(1) { P2 = 0xff;//八灯灭 delay(); P2 = 0;//八灯亮 delay(); } }
[单片机]
89C51单片机数码管显示
数码管显示分为静态数码管显示和动态数码管显示 学习掌握数码管相关的内容,可以从以下三方面入手: 1.数码管电路图 2.译码器 3.进制转化 直接上图 数码管电路图 数码管电路的接法有共阴和共阳两种,这里采用共阴接法 从其中取出一个数码管进行分析 单个数码管 此处为一个8位的数码管,想要数码管显示出想要的数字,则需要对数码管进行高低电平的设置 1为高电平,0为低电平 分别对 a,b,c,d,e,f,g,dp进行1和0的编写,此处可以理解为二进制进行十六进制的转化 如图中所示,数字2的 八位二进制就可以表示为 0101 1011,读数为从dp依次读到a,转化为十六进制则是0x5b 数码管中各个数值对应的字节 0:
[单片机]
89C<font color='red'>51单片机</font>数码管显示
51单片机条件转移指令
条件转移指令是指在满足一定条件时进行相对转移。 判A内容是否为0转移指令 JZ rel JNZ rel 第一指令的功能是:如果(A)=0,则转移,否则顺序执行(执行本指令的下一条指令)。转移到什么地方去呢?如果按照传统的方法,就要算偏移量,很麻烦,好在现在我们可以借助于机器汇编了。因此这第指令我们可以这样理解:JZ 标号。即转移到标号处。下面举一例说明: MOV A,R0 JZ L1 MOV R1,#00H AJMP L2 L1: MOV R1,#0FFH L2: SJMP L2 END 在执行上面这段程序前如果R0中的值是0的话,就转移到L1执行,因此最终的执行结果是R1中的值为0FFH。而如果R0中的值
[单片机]
<font color='red'>51单片机</font>条件转移指令
详细介绍用51单片机解密任何红外遥控器
在这里我仅把一些关键的带出来 关于硬件电路 那么抛开那么多文字介绍 最后意思就是说 你家里的遥控板 也就是发射部分 是把所有的封装好了的 比如键盘矩阵、编码调制、LED红外发送器 等等 那么接受部分 SM0038 3个脚 一个脚地 一个脚电源 一个脚信号脚 接到 单片机随便个P口上(此处是P3。6) OK 硬件部分就搞定了当然还有数码管显示 ,这些肯定不用说你都能搞定吧,这些东东都有,所以就不用自己去搭电路那么麻烦了),那么 我们想 我们按一下遥控板 大家看到 有个灯闪了一下 然后OVER 那么 我们现在要做的就是在灯闪了那一下之后让 单片机来读它的键码 然后不同的键码来干不同的事 ,本文 是向大家解释一种方法 当然如果你知道遥控
[单片机]
详细介绍用<font color='red'>51单片机</font>解密任何红外遥控器
51单片机+74HC595驱动数码管程序
这里是电路图: 完整的源码和图纸下载地址: http://www.51hei.com/bbs/dpj-20392-1.html 下面是51单片机驱动74hc595芯片的程序: #include reg52.h //包含51单片机的头文件 #include stdio.h #define uint unsigned int #define uchar unsigned char //sbit sin_595 =P1^0; //sbit rclk_595 =P1^1; //sbit sclk_595 =P1^2; //sbit s_clr =P1^3; sbit a_cp_595
[单片机]
<font color='red'>51单片机</font>+74HC595驱动数码管程序
51单片机——AD/DA转换
模数和数模转换 A:模拟量 D:数字量 模拟量:自然界连续变化的物理量。所谓连续,包含两个方面的含义; 一方面从时间上来说,它是随时间连续变化的; 另一方面从数值上来说,它的数值也是连续变化的。这种连续变化的物理量通常称为模拟量。 数字量:计算机中处理的是不连续变化的量,离散性的数字量。 当计算机用于数据采集和过程控制时,采集的对象往往是连续变化的物理量(模拟信号)如温度、压力、摄像头采集图像、照度、等,但计算机处理的是离散的数字量,因此需要对连续变化的物理量进行A/D转换为不连续的数字量交给计算机处理,保存等。计算机输出的数字量有时需要通过D/A转换为模拟量去控制某些执行元件。A/D转换器完成模拟
[单片机]
<font color='red'>51单片机</font>——AD/DA转换
51单片机解决调试过程
对于一个新设计的电路板,调试起来往往会遇到一些困难,特别是当板比较大、元件比较多时,往往无从下手。但如果掌握好一套合理的调试方法,调试起来将会事半功倍。对于刚拿回来的新PCB板,我们首先要大概观察一下,板上是否存在问题,例如是否有明显的裂痕,有无短路、开路等现象。如果有必要的话,可以检查一下电源跟地线之间的电阻是否足够大。 然后就是安装元件了。相互独立的模块,如果您没有把握保证它们工作正常时,最好不要全部都装上,而是一部分一部分的装上(对于比较小的电路,可以一次全部装上),这样容易确定故障范围,免得到时遇到问题时,无从下手。一般来说,可以把电源部分先装好,然后就上电检测电源输出电压是否正常。如果在上电时您没有太大的把握(即使有
[单片机]
51单片机定时器和计数器
8051单片机内部有两个定时/计数器T0及T1,具有定时和计数两种功能。T0及T1在计数过程中不需要CPU参与,也不影响CPU的其他工作。当计数溢出后,定时/计数器给出中断信号,申请CPU停止当前的工作,去处理预先设定的中断事件。 一、T1内部结构 定时器工作模式:对内部时钟信号计数。由于时钟频率是定值,所以可根据计数值计算出定时时间。 计数器工作模式:是对加在T1(P3.5)引脚上的外部脉冲进行计数。 二、计数功能 计数器用于统计从TO(P3.4)和Tl(P3.5)两个引脚输入脉冲的负跳变数量。负跳变是指前一个机器周期采样为高电平,后一个机器周期为低电平。每输入一个脉冲负跳变,计数器加1。 输入脉冲的高电平与低电平至少应保持
[单片机]
<font color='red'>51单片机</font>定时器和计数器
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
更多每日新闻
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved