51单片机 UART串口通信

发布者:自由思考最新更新时间:2017-11-15 来源: eefocus关键字:51单片机  UART  串口通信 手机看文章 扫描二维码
随时随地手机看文章

使用半双工通信


  1. /************************************ 

  2.     使用硬件UART模块和串口中断 

  3. ************************************/  

  4. #include   

  5.   

  6. typedef unsigned int uint;  

  7.   

  8. void configUART(uint baud);  

  9.   

  10. void main() {  

  11.     EA = 1;  

  12.     configUART(9600);  

  13.     while (1) ;  

  14. }  

  15.   

  16. void configUART(uint baud) {  

  17.     SCON = 0x50;    //配置串口为模式1,并使能串行接收  

  18.     TMOD &= 0x0F;   //清零T1的控制位  

  19.     TMOD |= 0x20;   //配置T1为模式2(自动重装模式)  

  20.     TH1 = 256 - 11059200 / 12 / 16 / 2 / baud;  

  21.     TL1 = TH1;  

  22.     ET1 = 0;        //!!!禁止T1中断(因为做了波特率发生器)  

  23.     ES = 1;         //使能串口中断  

  24.     TR1 = 1;  

  25. }  

  26. //中断类型码为4,中断向量的地址 = 中断类型码 * 8 + 3  

  27. void interruptUART() interrupt 4 {  

  28.     if (RI) {       //如果接收到了字节  

  29.         RI = 0;     //手动清零  

  30.         SBUF++;     //可以自己设置接收到后数据的处理方式  

  31.     }  

  32.     if (TI) {       //如果字节发送完毕  

  33.         TI = 0;     //手动清零  

  34.     }  

  35. }  


下面的程序把书上的代码做了点优化,加了一个isNewInfo,在主循环里判断只有当接收到了新的字节数据以后才更新显示缓冲区。



  1. #include   

  2.   

  3. typedef unsigned char uchar;  

  4. typedef unsigned int uint;  

  5. typedef unsigned long ulong;  

  6.   

  7. sbit ADDR3 = P1^3;  

  8. sbit ENLED = P1^4;  

  9.   

  10. uchar code LEDChar[] = {  //数码管显示字符转换表  

  11.     0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,  

  12.     0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E  

  13. };  

  14. uchar LEDBuf[7] = {  //数码管和独立LED的显示缓冲区  

  15.     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF  

  16. };  

  17. uchar T0RH = 0;  //T0重载值的高字节  

  18. uchar T0RL = 0;  //T0重载值的低字节  

  19. uchar RXDByte = 0;  //串口接收到的字节  

  20. bit isNewInfo = 0;  //是否接收到了新信息  

  21.   

  22. void configTmr0(uint ms);  

  23. void configUART(uint baud);  

  24. void LEDScan();  

  25. //void interruptTmr0();  

  26. //void interruptUART();  

  27.   

  28. void main() {  

  29.     EA = 1;       //使能总中断  

  30.     ENLED = 0;    //选择数码管和独立LED  

  31.     ADDR3 = 1;  

  32.     configTmr0(1);   //配置T0定时1ms  

  33.     configUART(9600);  //配置波特率为9600  

  34.     while (1) {   //将接收字节在数码管上以十六进制形式显示出来  

  35.         if (isNewInfo) {  

  36.             LEDBuf[0] = LEDChar[RXDByte & 0x0F];  

  37.             LEDBuf[1] = LEDChar[RXDByte >> 4];  

  38.             isNewInfo = 0;  

  39.         }  

  40.     }  

  41. }  

  42. /* 配置并启动T0,ms-T0定时时间 */  

  43. void configTmr0(uint ms) {  

  44.     ulong tmp;  //临时变量  

  45.   

  46.     tmp = 11059200 / 12;      //定时器计数频率  

  47.     tmp = (tmp * ms) / 1000;  //计算所需的计数值  

  48.     tmp = 65536 - tmp;        //计算定时器重载值  

  49.     tmp = tmp + 13;           //补偿中断响应延时造成的误差  

  50.     T0RH = (uchar)(tmp>>8);  //定时器重载值拆分为高低字节  

  51.     T0RL = (uchar)tmp;  

  52.     TMOD &= 0xF0;   //清零T0的控制位  

  53.     TMOD |= 0x01;   //配置T0为模式1  

  54.     TH0 = T0RH;     //加载T0重载值  

  55.     TL0 = T0RL;  

  56.     ET0 = 1;        //使能T0中断  

  57.     TR0 = 1;        //启动T0  

  58. }  

  59. /* 串口配置函数,baud-通信波特率 */  

  60. void configUART(uint baud) {  

  61.     SCON  = 0x50;  //配置串口为模式1  

  62.     TMOD &= 0x0F;  //清零T1的控制位  

  63.     TMOD |= 0x20;  //配置T1为模式2  

  64.     TH1 = 256 - (11059200/12/32)/baud;  //计算T1重载值  

  65.     TL1 = TH1;     //初值等于重载值  

  66.     ET1 = 0;       //禁止T1中断  

  67.     ES  = 1;       //使能串口中断  

  68.     TR1 = 1;       //启动T1  

  69. }  

  70. /* LED动态扫描刷新函数,需在定时中断中调用 */  

  71. void LEDScan() {  

  72.     static uchar i = 0;  //动态扫描索引  

  73.   

  74.     P0 = 0xFF;             //关闭所有段选位,显示消隐  

  75.     P1 = (P1 & 0xF8) | i;  //位选索引值赋值到P1口低3位  

  76.     P0 = LEDBuf[i];       //缓冲区中索引位置的数据送到P0口  

  77.     if (i < 6)             //索引递增循环,遍历整个缓冲区  

  78.         i++;  

  79.     else  

  80.         i = 0;  

  81. }  

  82. /* T0中断服务函数,完成LED扫描 */  

  83. void interruptTmr0() interrupt 1 {  

  84.     TH0 = T0RH;  //重新加载重载值  

  85.     TL0 = T0RL;  

  86.     LEDScan();   //LED扫描显示  

  87. }  

  88. /* UART中断服务函数 */  

  89. void interruptUART() interrupt 4 {  

  90.     if (RI) {   //接收到字节  

  91.         RI = 0;  //手动清零接收中断标志位  

  92.         RXDByte = SBUF;  //接收到的数据保存到接收字节变量中  

  93.         SBUF = RXDByte;  //接收到的数据又直接发回,叫作-"echo",  

  94.                          //用以提示用户输入的信息是否已正确接收  

  95.         isNewInfo = 1;  

  96.     }  

  97.     if (TI) {   //字节发送完毕  

  98.         TI = 0;  //手动清零发送中断标志位  

  99.     }  

  100. }  


关键字:51单片机  UART  串口通信 引用地址:51单片机 UART串口通信

上一篇:51单片机 1602液晶显示静态字符
下一篇:51单片机 漩涡流水点阵

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

提高51单片机TCP通信效率的软件方法
1 嵌入式TCP/IP通信系统 目前,工业控制领域典型的80C51嵌入式TCP/IP通信系统,主要有两种硬件方案,(1)采用80C51+网卡芯片,在单片机中实现TCP/IP协议并接入Internet;(2)采用固化TCP/IP协议的硬件芯片自动解析协议,实现Internet接入,后者程序已固化在硬件中,一般难以通过软件方法提高通信速率,因此,主要分析提高前一种方案的通信速率,其接口电路如图1所示。 图1 RTL8019AS与51单片机的接口电路 由于单片机中断资源有限,嵌人式系统与以太网通信主要采用的是软件查询方式,而不是中断响应方式,从以太网上传来的数据会先存至芯片上16 kB的数据缓存区,当单片机空闲
[单片机]
提高<font color='red'>51单片机</font>TCP通信效率的软件方法
51单片机模拟解码2272程序
以下是软件模拟PT2272解码程序,索性就放上来,大家参考一下。 软件解码程序(仿真PT2272) ; ;晶体频率为11.0592MHz ; 本程序中的时间定位关系只适用于接3.3M振荡电阻的PT2262解码 ; 使用其它阻值电阻时,应将定位时间按电阻比例缩放 ;下面的程序中 REM 为信号输入端 ; RECEIVE 检测到有效信号标志位 ; ENABLE_DETE 连续按键标志 ; 3AH,3BH用作定时器 ; ; PT2262共12根地址线 ; ;31H,32H:接收的前8 位地址编码 ; ;33H,30H:接收的后4 位地址编码(若最后4位用作数据端,则只须读第33H单元的内容即可) ; 当用作数据端时,P
[单片机]
实验八--uart
一。环境   系统:ubuntu12.04   开发板:jz2440   编译器:gcc 二。说明 有空补上 三。代码 head.S 1 @****************************************************************************** 2 @ File:head.S 3 @ 功能:设置SDRAM,将程序复制到SDRAM,然后跳到SDRAM继续执行 4 @****************************************************************************** 5
[单片机]
PC机与多MCS-51单片机间的串行通信设计
1 引 言   在测控系统和工程应用中,常遇到多项任务需同时执行的情况,因而主从式多机分布式系统成为现代工业广泛应用的模式。它们大多由IBM-PC微机和MCS-51单片机组成。单片机功能强、体积小、价格低廉、开发应用方便,尤其具有全双工串行通讯的特点,在工业控制、数据采集、智能仪器仪表、家用电器方面都有广泛的应用。同时,IBM-PC机正好补充单片机人机对话和外围设备薄弱的缺陷。各单片机独立完成数据采集处理和控制任务,同时通过通信接口将数据传给PC机,PC机将这些数据进行处理、显示或打印,把各种控制命令传给单片机,以实现集中管理和最优控制。   故IBM-PC机(上位机)与各MCS-51单片机(下位机)之间的通信显得尤其重要。本文主要
[单片机]
PC机与多MCS-<font color='red'>51单片机</font>间的串行通信设计
51单片机的启动文件内容
在我们使用kei c51创建一个 51单片机 项目时,会有如下图所示的提示: keil 创建新项目时,提示是否添加启动文件 一般情况下,需要选择“是”。当然,也可以选择不加。那么,这个启动文件的作用是什么?什么情况下需要加,什么情况下可以不加? 今天我们就来详细了解一下这个启动文件的内容,看明白这个内容后,我们就会有种恍然大悟的感觉:“哦,原来是这样啊!” 启动代码第一段 ▼以下是启动代码原文第一段: $NOMOD51 ;------------------------------------------------------------------------------ ; This file is
[单片机]
<font color='red'>51单片机</font>的启动文件内容
高速DSP与PC实现串口通信的方法
  数字信号处理器(Digital Signal Processor,DSP)在图形图像处理、高精度测量控制、高性能仪器仪表等众多领域得到越来越广泛的应用,实际运用中,通常须将DSP采集处理后的数据传送到PC机,然后进行存储和处理。   T1公司的TMS320VC33微处理器具有性价比高,同时,该芯片的I/O电平、字长、运行速度、串口功能具有大多数DSP的共同特点。本文针对TMS320VC33与PC RS-232的通讯,分析三种具体的接口电路和软件设计方法,实现高速DSP与低速设备的通讯:①通过TMS320VC33的通用I/O口实现通信;②通过TMS320VC33中可设置为通用I/O的串行引脚实现通信;③直接利用TMS320V
[网络通信]
基于8051单片机的中断控制
(1)由中断源提出中断请求,由中断控制允许控制决定是否响应中断,如果允许响应中断,则CPU按设定好的优先级的顺序响应中断。如果是同一优先级的中断,则按单片机内部的自然优先级顺序(外部中断0→定时器0中断→外部中断l→定时器1中断→串行接口中断)响应中断。 CPU响应中断请求后,就立即转入执行中断服务程序。保护断点、寻找中断源、中断处理、中断返回,程序返回断点处继续执行。 (2)由中断允许寄存器IE控制开放和禁止中断。欲开放某一中断,则应先开放总中断允许(EA置1),然后开放相应中断的中断允许(相应位置1);若要要禁止中断,则EA置O即可。 (3)由中断优先级控制寄存器IP控制中断优先级,相应位置1,则设为高级中断,置0
[单片机]
高速DSP与PC实现串口通信的方法
数字信号处理器(Digital Signal Processor,DSP)在图形图像处理、高精度测量控制、高性能仪器仪表等众多领域得到越来越广泛的应用,实际运用中,通常须将DSP采集处理后的数据传送到PC机,然后进行存储和处理。 T1公司的TMS320VC33微处理器具有性价比高,同时,该芯片的I/O电平、字长、运行速度、串口功能具有大多数DSP的共同特点。本文针对TMS320VC33与PC RS-232的通讯,分析三种具体的接口电路和软件设计方法,实现高速DSP与低速设备的通讯:①通过TMS320VC33的通用I/O口实现通信;②通过TMS320VC33中可设置为通用I/O的串行引脚实现通信;③直接利用TMS320VC33的串
[嵌入式]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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