单片机串口通信
来源:互联网 发布:2016家具淘宝数据 编辑:程序博客网 时间:2024/05/17 02:21
1、并口通信与串口通信
对于8位单片机并口通信一般是使用8条数据线将字节的数据分为8位从8条数据线同时发送出去或接收进来,当然所需要的线并不止8条,一般还需要一些控制线,控制线的功能可以自己定义控制协议;而串口通信一般需要两条数据线(发送和接收数据线),发送和接收字节时,将数据从高位到低位或者从低位到高位一次发送一个位,将数据连续发送出去,对于同步串口通信一般还需要一个同步时钟线,异步串口通信不需要同步时钟线,但需要设置上位机和下位机为相同的波特率,波特率和同步时钟的功能是一样,就是确定数据发送和接收的抽样频率,如果抽样的频率不同,那么提取出来的数据肯定是不同的。
2、51单片机串口结构
第一步先了解51单片机的配置寄存器,主要涉及串口控制寄存器SCON(serial control)、工作方式控制寄存器TMOD(timer mode)、定时器控制寄存器TCON和特殊功能寄存器PCON。SCON主要是控制串口的工作方式以及保存串口状态;TMOD和TCON主要是用来设置波特率,我们一般是利用定时器T1来产生波特率,在一些增强51单片机上有独立的波特率发生器;PCON中的SMOD是控制串口的波特率选择,SMOD=1波特率加倍。
可位寻址
(1)
(2)SM2一般不进行设置,默认值位0
(3)REN串口接收允许位
1:允许串口接收数据
0:禁止串口接收数据
(4)TB8发送的第9位数据,一般用来校验
(5) RB8接收的第9位数据,一般用来校验
(6)TI发送中断标志位,但一帧数据发送完毕,TI由硬件置一,并申请中断,但不一定需要响应中断,可以通过软件查询方式来读取数据,如果通过软件查询,需要在发送数据前将串口中断关闭,另外需要软件清零
(7)RI接收中断标志位,但一帧数据接收完毕,RI由硬件置一,并申请中断,虽然也可以软件查询,但是不推荐,实时太差,很容易丢失数据,另外需要软件清零。
具体实现代码如下
主要实现功能是复位先发送一串字符(偶校验),在主函数中,将接收到的数据进行偶校验,校验成功发送回PC,同时在没有接收到数据时进入空闲模式。
;时钟频率:11.0592MHz;串口波特率:9600;运行芯片:stc12c5a60s2(兼容stc89c52)BUSY BIT 20H.0FLAG BIT 20H.1EVENFLAG BIT 20H.2TXDATA EQU 21HRXDATA EQU 22HORG 0000HLJMP STARTORG 0003H; 外部中断0ORG 000BH; T0中断ORG 0013H; 外部中断1ORG 001BH; T1中断ORG 0023H; 串口中断LJMP SERIALSTART: CLR FLAG CLR BUSY MOV SP,#60H MOV SCON,#0D0H;9位异步发送,波特率可变,允许串口接收数据 MOV TMOD,#20H;定时器T1,方式1 MOV TH1,#0FDH;波特率9600 MOV TL1,#0FDH SETB TR1;启动定时器T1 SETB ES;允许串口中断 SETB EA;允许总中断 SETB P2^4 MOV DPTR,#STR SENDSTR: CLR A MOVC A,@A+DPTR JZ SENDEND MOV TXDATA,A LCALL SEND_DATA INC DPTR SJMP SENDSTR SENDEND: MainLoop: JNB FLAG,LOOP1;判断是否接收到数据 MOV TXDATA,RXDATA LCALL EVENPARITY;调用偶检验子程序 JNB EVENFLAG,LOOP1;判断偶检验是否成功 CLR FLAG;清除标志 CLR EVENFLAG LCALL SEND_DATA;发送R3的数据 LOOP1: MOV PCON,#01H;进入空闲模式 LCALL DELAY;调用延时子程序 CPL P2^4 SJMP MainLoop EVENPARITY: MOV A,TXDATA MOV C,P ;偶校验 ;C=0则运行JNB RB8,L2 ;RB8=0校验正确则跳转到L2发送数据 ;RB8=1顺序运行JNC LOOP1 ;C=0校验出错跳转到LOOP1不发送数据 ;C=1跳转到L1 ;c=1不跳转 ;RB=1跳转到L2 ;RB=0顺序运行 ;RB=0跳转到LOOP1不发送数据 JC L1;C为1跳转 JNB RB8,L2;RB8为0跳转 L1: JNC L3;C为零跳出 JB RB8,L2 JNB RB8,L3 L2: SETB EVENFLAG RET L3: CLR EVENFLAG RETDELAY:;@11.0592MHz PUSH 30H PUSH 31H PUSH 32H MOV 30H,#17 MOV 31H,#28 MOV 32H,#23 NEXT: DJNZ 32H,NEXT DJNZ 31H,NEXT DJNZ 30H,NEXT ;延时时间(32H)*(31H)*(30H)+(31H)*(30H)+(30H)次 POP 32H POP 31H POP 30H RETSEND_DATA: PUSH ACC PUSH PSW JB BUSY,$ SETB BUSY MOV A,TXDATA MOV C,P MOV TB8,C MOV SBUF,TXDATA POP ACC POP PSW RETSERIAL: PUSH ACC PUSH PSW JNB RI,NRX CLR RI SETB FLAG MOV RXDATA,SBUF CLR P2^7 NRX: JNB TI,NTX CLR TI CLR BUSY SETB P2^7 NTX: POP PSW POP ACC RETISTR:DB "HELLO WORD",0DH,0AH,0END
波特率计算
9600=(1/32) * (11.0592M/ (12* (0xff-0xfd) ) )
- 单片机串口通信(2)
- 单片机串口通信(1)
- 单片机串口通信实验
- 单片机之串口通信
- 单片机串口通信
- C# 串口通信、单片机
- C#串口通信、单片机
- 单片机串口通信不正确
- 单片机串口通信小结
- 单片机串口通信技术
- 51单片机串口通信
- 51单片机串口通信
- 单片机控制串口通信
- C#串口通信、单片机
- 单片机串口通信实例
- 51单片机 串口通信
- 单片机串口通信
- 单片机串口通信中断
- Can not find the tag library descriptor for "http://java.sun.com/jsp/jstl/
- Linux ALSA声卡驱动:ALSA架构简介
- jvm系列(十):如何优化Java GC「译」
- 冒泡排序
- ps aux|grep xxx
- 单片机串口通信
- (11)oracle新人笔记------集合运算
- 单例模式
- h5新增文件图片上传
- 保护装置信息访问功能
- 工厂三兄弟之简单工厂模式(三)
- LaTeX新人教程,30分钟从完全陌生到基本入门
- Linux ALSA声卡驱动之一:ALSA系统架构
- Python--常用字符串操作方法