单片机 初识UART
来源:互联网 发布:逆战最新源码 编辑:程序博客网 时间:2024/04/30 03:44
/*SCON 设置使用mode 0;设置TI的值为1 开始发送数据,发送完毕后,软件置0.
TI是指单片机SFR中SCON的一位,而且是被硬件置位的。当单片机发送完一帧数据后,该数据位由硬件置1
*/
#include<reg51.h>#include<intrins.h>
#define uchar unsigned char#define uint unsigned intsbit SPK=P3^7;uchar FRQ=0x00; //Time delay.void DelayMS(uint ms){ uchar i; while(ms--) for(i=0;i<120;i++);}//Main procedure.void main(){ uchar c=0x80; SCON=0x00; //Serial control register,Operating Mode:0; TI=1; //Transmit interrupt flag ,Set by hardware at the end of the 8th bit time in mode 0 while(1) { c=_crol_(c,1); //Left move 1 bit. SBUF=c; //Serial Buffer while(0 == TI); //Waiting for send over. TI=0; //Cleared by software. DelayMS(400); //Setting time delay. }}
为了数据接收不完整这个问题,纠结了好几天,一个小问题,却能让人奔溃。今天算解决了,总结如下:
1.程序流程的考虑。以前总是觉得实现了这个功能就行了,很少留意到程序的编写流程,例如总开关EA的打开关闭,ES的打开关闭。项目中用到的中断不止UART一个,如果每次都操作EA,可能会造成不可预料的后果。在中断初始化的时候,只需关注自己操作的中断,将中断关闭,然后再打开,完成初始化操作。总开关EA 的打开放在各个中断初始化后。
2.解决数据接收不完整:
a.单个字符是否可以正常接收完整
b.考虑数据接收的时候所需要的时间
在下面程序中, for(i = 1000; i > 0 ; i--) 其实是为了在1S内接收中断发过来的数据,在接收完成后再进行数据的发送。
void UART(){ u8 i = 0;
if (1 == ReadFlag) { ReadFlag = 0; for(i = 0;i < 50; i++) { if(0 != UARTBuf[i]) SendByte(UARTBuf[i]); } SBUFData = 0; while(SBUFData < 50) { UARTBuf[SBUFData] = 0; SBUFData++; } }
}
//serial interrupt function void serial () interrupt 4 { u16 i; inuartnum = 0; for(i = 1000; i > 0 ; i--) // Define 100ms delay time for reception. { if (1 == RI_0) //when receiving data, hardware automatic set 1 { RI_0 = 0 ; // SBUFData =SBUF0; UARTBuf[inuartnum] = SBUF0; inuartnum++; ReadFlag = 1; } }
}
- 单片机 初识UART
- 单片机--uart
- 初识单片机
- 初识单片机
- 51单片机 UART串口通信
- 51单片机——UART
- STM32单片机开发初识
- 单片机—UART接口知识简介(上)
- 单片机—UART接口知识简介(下)
- 51单片机UART串口通信开发总结
- AVR单片机ATMega16的UART通信总结
- 使用单片机的UART(COM口)进行传输 (单片机 LM3S811)
- 51单片机模块化编程初识
- 基于单片机通用引脚的软件UART设计
- 51 单片机UART 串口通信[ 方式1 ]实现
- 整理LPC2300系列单片机的UART配置相关
- 51单片机(二)—— GPIO&Uart
- 基于单片机通用引脚的软件UART设计
- 【线段树】 codeforces 444C DZY Loves Colors
- Java 查看运行程序线程数
- actionBar.setDisplayHomeAsUpEnabled(true);
- thinkphp 先create() 然后save() 但是数据库执行报错问题
- Android ActionBar完全解析,使用官方推荐的最佳导航栏(下)
- 单片机 初识UART
- Ansi,UTF8,Unicode,ASCII编码的区别
- 阿,作为一个伟大(苦比)的程序猿,怎么能没一个记录感悟(吐槽)的地方呢
- 虚拟机性能监控与故障处理工具
- Apache Storm0.92版本集群搭建
- HDU 1013 Digital Roots 题解
- Java 查看Windows下CPU利用率
- 利用NodeJS的子进程(child_process)调用系统命令
- phpcms上传文件出现乱码解决办法