




已阅读5页,还剩9页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
单片机串口通信编程实例通信的基相方式可分为并行通信和中行通信:并行通信是数据的每位同时发送或同时接收;串行通信是数据的各位依次逐位发送或接收。位数据并行传送,至少需要8条数据线和一条公共线,有时还需要状态、应答等控制线。长距离传送时,价格较贵且不方便,优点是传送速度快。串行通信只需要一到两根数据线,长距离传送时,比较经济,但由于每次只能传送一位,传送速度较慢,随着通信信号频率的提高,传送速度较慢的矛盾已逐渐缓解。 51单片机串行缓冲寄存器SBUF有两个:一个是串行发送缓冲寄存器,另一个是串行接收缓冲寄存器,用同一特殊功能寄存器名SBUF和同一单元地址99H.接收缓冲寄存器还具有双缓冲结构,以避免在数据接收过程中出现帧重叠错误。在完成串行初始化后,发送时只需将发送数据输入SBUF,CPU将自动启动和完成串行数据的发送;接收时CPU将自动把接收到的数据存入SBUF,用户只需从SBUF中读取接收数据。 发送: CPUD7 D6 D5 D4 D3 D2 D1 D0 发送数据寄存器 SBUF(99H)1 D7 D6 D5 D4 D3 D2 D1 D0 0 发送数据发送时钟 接收: 接收时钟0 D0 D1 D2 D3 D4 D5 D6 D7 1 接收数据 D0 D1 D2 D3 D4 D5 D6 D7 接收数据寄存器 SBUF(99H)CPU 从编程角度讲来看51单片机串口主要由以下寄存器组成。 PCON SMOD SCON SM0 SM1 SM2 REN TB8 RB8 TI RI SBUF D7 D6 D5 D4 D3 D2 D1 D0 SBUF发 SBUF收SM0、SM1:工作方式选择位(后面再讲)SM2:多机通信控制位,常与RB8配合,决定是否激活RIREN:允许接收TB8:发送的第九位数RB8:接收的第九位数TI :中断标志RI SMOD:波特系数选择位,0 20 = 1 1 21 = 251单片机串行通信共有4种工作方式,由串行控制寄存器SCON中SM0SM1决定。方式1、2、3的区别方要表现在帧格式及波特率两个方面。方式1与方式2帧格式相同波特率不同:方式1波特率可变与T1溢出率有关;方式2波特率固定。方式1与方式3波特率相同帧格式不同:方式1帧格式10位;方式3帧格式11位。方式1、2、3通信过程完全相同,均为异步通信方式。(1)方式0:同步移位寄存器方式,波特率固定为fosc / 12 RXD 接收发送数据 TXD 产生同步移位脉冲接收/发送完,置位RI / TI ,(要求SM2 = 0)方式0 D7 D6 D5 D4 D3 D2 D1 D0 发送 D0 D1 D2 D3 D4 D5 D6 D7 接收无起始位,无停止位(2)方式1:8位UART,波特率为(2SMODT1的溢出率)/ 32停止位 D7 D6 D5 D4 D3 D2 D1 D0 起始位 发送位起始位 D0 D1 D2 D3 D4 D5 D6 D7 停止位 接收位1帧信息,10位。 送RB8位波特率可变: 2SMOD / 32 (T1的溢出率)发送完置位TI。接收完数据置位RI。置位RI是有条件的。即:REN = 1,RI = 0 且SM2 = 0或SM2 = 1但是接收到的停止位为1。此时,数据装载SBUF,停止位进入RB8,RI置1。(3)方式2、方式3 :9位UART,多机通信。停止位 TB8 D7 D6 D5 D4 D3 D2 D1 D0 起始位 发送起始位 D0 D1 D2 D3 D4 D5 D6 D7 TB8 停止位 接收 送RB8方式2波特率:(固定)2SMOD / 64 fosc方式3波特率: 2SMOD / 32 (T1溢出率)发送完数据置位TI。接收到有效数据完毕,置位RI。有效数据条件:REN = 1,RI = 0 且SM2 = 0或接收到第9位数据为1。此时,数据装载SBUF,第9位数据(TB8) RB8,RI置1。波特率是串行通信传输数据的速率.定义为每秒传输的数据位数,即:1波特=1位/秒(1bit/s)。串行通信对波特率的基本要求是互相通信的甲乙双方必须具有相同的波特率。举例:设有一帧信息,1个起始位、8个数据位、1个停止位,传输速率为240个字符。求波特率。 解:(181)240 = 2400 b/s = 2400波特。 T1溢出率 = 单位时间内溢出次数 = 1 /(T1的定时时间) 定时器T1用作串行口波特率发生器时,常选用工作方式2。T1方式2时,因定时初值能自动恢复,不需要用指令重装,不占用T1运行时间,因而波特率精确。而且由于80C51定时/计数器结构上的原因,T1方式2用作串行波特率发生器更为合适.T1方式2通常在T0方式3情况下,此时T0被拆成两个独立的8位计数器TH0、TL0:TL0使用T0原有的控制寄存器资源:TF0、TR0、GATE、C/T、INT0,组成一个8位的定时/计数器;TH0借用T1的中断溢出标志TF1、运行控制开关TR1,只能对片内机周脉冲计数,组成另一个位定时器。T1由于其TF1、TR1被T0的TH0占用,计数器溢出时,只能将输出送至串行口,即用作串行口波特率发生器。这种设计方式能最大限度地充分发挥80C51的资源功能。 N = 28 t / T, t = (28N)T =(28N)12 / fosc 所以,T1溢出率 = 1/t = fosc / 12(28N), 故, 波特率 = 2SMOD / 32 fosc / 12(256N)。 若已知波特率,则可求出T1的计数初值: y = 2562SMODfosc / (波特率3212) 例:若fosc = 6MHz,波特率为2400波特,设SMOD = 1,则定时/计数器T1的计数初值为多少?并进行初始化编程。 解:y = 2562SMODfosc / (24003212)= 242.98243 = F3H 同理,fosc = 11.0592MHz,波特率为2400,设SMOD = 0,则y = F4H 单片机串口通信编程主要包括两步:串口的设置和数据的收发。 汇篇语言进行串口设置的代码如下: MOV SCON,#01010000B ;(50H) Mode 1/Rec en ; bit 4 = REN receive enable ; bit 6 = mode 1. - 8 bit uart variable baud rateMOV TH1,#0FDH ; Reload value for 9600 Bd 11.0592 MHzMOV TMOD,#00100000B; (21H) Gate1/Timer/Mode 2 / Gate0/Timer/Mode 1 ; bit 5 = 8 bit auto reload for timer 1 (Mode2)movPCON,#0 ; DONT double the baud ratesetbTR1 ; start timer 1 C语言进行串口设置的代码如下:void init(void)TMOD|=0x20;SCON=0x50;PCON|=0x80;TH1=0xfa;TL1=0xfa;TR1=1;ET1=1; 汇篇语言收发串口数据的代码如下:MOV A,SBUF CLR RI MOV SBUF,A CLR TIC语言收发串口数据的代码如下:void uart(void) interrupt 4char i; if(RI) RI=0; i=SBUF; if(TI) TI=0; SBUF=i; 例一:按上图所示连接电路,通过DB9与电脑相连,将下面代码编译,下载,用串口助手进行测试,单片机将电脑串口发送的字符返回电脑串口。ORG 0000HLJMP STARTORG 0100HSTART: MOV SCON,#01010000B ;(50H) Mode 1/Rec en; bit 4 = REN receive enable; bit 6 = mode 1. - 8 bit uart variable baud rateMOV TH1,#0FDH ; Reload value for 9600 Bd 11.0592 MHzMOV TMOD,#00100000B; (21H) Gate1/Timer/Mode 2 / Gate0/Timer/Mode 1; bit 5 = 8 bit auto reload for timer 1 (Mode2)movPCON,#0; DONT double the baud ratesetbTR1; start timer 1 LCALL DELAY ;延时COMM: JNB RI,$ MOV A,SBUF CLR RI MOV SBUF,A ; CLR TI LJMP COMM; DELAY: MOV R5,#10 ;延时子程序,改变R5,R6,R7 的值,可以改变延时的时间 D1: MOV R6,#20 D2: MOV R7,#248 DJNZ R7,$ DJNZ R6,D2 DJNZ R5,D1 RET例二:按上图所示连接电路,通过DB9与电脑相连,将下面代码编译,下载,用串口助手进行测试,单片机向电脑串口发送字符串。ORG 0000HLJMP STARTORG 0100HSTART: MOV SCON,#01010000B ;(50H) Mode 1/Rec en; bit 4 = REN receive enable; bit 6 = mode 1. - 8 bit uart variable baud rateMOV TH1,#0FDH ; Reload value for 9600 Bd 11.0592 MHzMOV TMOD,#00100000B; (21H) Gate1/Timer/Mode 2 / Gate0/Timer/Mode 1; bit 5 = 8 bit auto reload for timer 1 (Mode2)movPCON,#0; DONT double the baud ratesetbTR1; start timer 1START1:MOV DPTR,#TABLE ;给DPTR 的地址,即表格的起始地址LOOP:CLR A ;对A 清零MOVC A,A+DPTR ;查表CJNE A,#01H,LOOP1 ;判断是否到了表格的结尾处,当A 等于01 时程序往下执行,否则跳到LOOP1LJMP START1 ;跳到程序的开头循环执行LOOP1:MOV SBUF,A ;把取得的表格数据送到SBUFLCALL DELAY ;延时INC DPTR ;DPTR 加一,即把DPTR 指向下一个表格单元LJMP LOOPDELAY: MOV R5,#10 ;延时子程序,改变R5,R6,R7 的值,可以改变延时的时间D1: MOV R6,#20D2: MOV R7,#248DJNZ R7,$DJNZ R6,D2DJNZ R5,D1RET;TABLE 的数据最后会被编译器安排到单片机的FLASH 程序存储区里,CPU 运行时只能读取,不能修改。TABLE:DB 0FEH,0FDH,0FBH,0F7HDB 0EFH,0DFH,0BFH,07FHDB 0FEH,0FDH,0FBH,0F7HDB 0EFH,0DFH,0BFH,07FHDB 07FH,0BFH,0DFH,0EFHDB 0F7H,0FBH,0FDH,0FEHDB 07FH,0BFH,0DFH,0EFHDB 0F7H,0FBH,0FDH,0FEHDB 00H, 0FFH,00H, 0FFHDB 01HEND例三:按上图所示连接电路,通过DB9与电脑相连,将下面代码编译,下载,用串口助手进行测试,单片机将电脑串口发送字符串返回电脑的串口。/* * Uart Program * Donald, DONG ELECT. LAB. * 2008.5.13 complete * - * 在PC上通过超级终端或者其它串口调试工具,将键盘按下的值显示 * 在终端上,并将输入的字符串再次输出到终端上。 * * P30: RXD * P31: TXD */#include#ifndef _DG_TYPE_#define _DG_TYPE_typedef unsigned char uchar;typedef unsigned int uint;#endif#define CMD_LEN 75 / 命令长度#define CMD_TAG 1 / 提示符长度void UartInit();void UartSendChar(unsigned char ch);void UartSendStr(uchar *pStr);void UartCharPro(uchar ch);void UartCmdPro();uchar g_ucCmdCMD_LEN + 1 = 0;uchar g_ucLen = 0; / 命令长度uchar g_ucCur = 1; / 光标位置void main() UartInit(); UartSendStr(rn); UartSendStr( DDDDDDD DDDDDDDDDDDDDDrn); UartSendStr( DDDDDD DDDDDDDDDDDDDrn); UartSendStr( DDDDDD DDDDDDDDDDDrn); UartSendStr( DDDDD DDDDDDDDDDrn); UartSendStr( DDDDD DDDDDDDDrn); UartSendStr( DDDD DDDDDDDDDDDrn); UartSendStr( DDD DDDDDDDDDDDDDDDrnrn); UartSendStr( - DG100 UART TEST PROGRAM - rn); UartSendStr( by Donaldrnrn); while(1);/* * Name: UartInit * Func: * 串行通信初始化 * Para: * uchar ch: 发送的字符 * Return: None */void UartInit() SCON = 0x50; / SCON: serail mode 1, 8-bit UART TMOD |= 0x20; / TMOD: timer 1, mode 2, 8-bit reload PCON |= 0x80; / SMOD=1; TH1 = 0xFA; / Baud:9600 fosc=11.0592MHz TL1 = 0xFA; IE |= 0x90; / 使能串行中断 TR1 = 1; / 启动TIMER1 EA = 1;/* * Name: UartSendChar * Func: * 向串口发送一个字符 * Para: * uchar ch: 发送的字符 * Return: None */void UartSendChar(unsigned char ch) SBUF = ch; while(TI=0); TI=0;/* * Name: UartSendStr * Func: * 向串口发送以0结尾的字符串 * Para: * uchar *pStr: 发送的字符指针 * Return: None */void UartSendStr(uchar *pStr) while(*pStr != 0) SBUF = *pStr+; while(TI=0); TI=0; void UartSrv() interrupt 4 unsigned char ch; ch = SBUF; if(RI) RI = 0; /UartSendChar(ch); /P0 = ch; UartCharPro(ch); /* * Name: UartCharPro * Func: * 字符处理过程函数。根据输入的普通字符或控制字符判断回显。 * Para: * uchar ch: 判断的字符 * Return: None */void UartCharPro(uchar ch) P0 = ch; switch(ch) case b: / 退格键 if(g_ucCur CMD_TAG) UartSendChar(b); UartSendChar( ); UartSendChar(b);if(g_ucLen) g_ucLen-; g_ucCur-; break; case r: / 回车键 UartSendChar(r); UartSendChar(n); g_ucCmdg_ucLen = 0; UartSendStr(g_ucCmd); UartSendChar(r); UartSendChar(n); UartSendChar(); g_ucLen = 0; g_ucCur = 1; break; default: / 其它字符 UartSendChar(ch); g_ucCur+; if(g_ucLen CMD_LEN) g_ucCmdg_ucLen+ = ch; else g_ucCmdg_ucLen = 0; 例四:两个单片机进行双机全双工通信主程序(甲机)ORG 0000H SJMP MAIN ;跳至主程序入口地址ORG 0023H ;串行口中断服务程序入口 LJMP INTS MAIN: MOV PCON,#80H ;波特率加倍 MOV SCON,#90H ;置工作方式2,并允许接收 MOV DPTR,#7000H ;设置数据块首址之地址指针 MOV R0,#R0 ;设置发送字节数初值 SETB EA ;CPU开中断 SETB ES ;允许串行口中断 MOVX A,DPTR ;取第一个发送数据 ADD A, #0 ;数据补偶 MOV C , P ; MOV TB8, C MOV SBUF, A ;启动串行口,发送数据 SJMP $中断服务子程序:INTS: JB SCON.0,LOOP ;检测是否是接收口中断?; 若SCON.0=1,转入接收乙机;发送的应答信息 CLR SCON.1 ;因SCON.0=0,表明是甲机;发送数据的中断请求,;CPU响应中断后,在中断;服务程序中应清中断标志 SJMP ENDT ;甲机发送一数据完毕跳至中;断返回程序LOOP: CLR SCON.0 ;清接收中断标志 MOV A, SBUF ;取乙机的应答数据 SUBB A, #01H ;若乙机应答信息为00H,;数据传送正确,则转;LOP3程序 JC LOP3 MOVX A,DPTR ;若乙机应答信息为FFH,数;据传送不正确,则再发送;一次原来数据,并补偶后发送ADD A,#0MOV C, PMOV TB8, CMOV SBUF, A ;启动串行口,重发一次数据SJMP ENDT ;跳至中断返回程序LOP3: INC DPTR ;修改中断指针INC R0 ;修改发送字节数计数值MOVX A,DPTR ;下一个发送数据补偶ADD A, #0MOV C, PMOV TB8,CMOV SBUF ,A ;启动串行口,发送新的数据CJNE R0,#80H,ENDT ;判别128个字节数据都发;送完没有,如没有发送;完则跳至
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 福建公园排椅工程方案(3篇)
- 方案设计墙体工程(3篇)
- 牵引车司机安全教育培训课件
- 林业相关面试题库及答案
- 拉萨会计面试题及答案
- 科研基础面试题库及答案
- 新能源行业绿色制造2025年技术创新与新能源政策导向报告
- 人工智能在医疗器械诊断设备中的伦理问题与法规挑战报告
- 2025年新能源汽车电池包结构创新空间利用率提升的全球市场洞察报告
- 2025年中医药现代化国际市场拓展:法国市场前景报告
- (完整版)贵州三年级地方课程教案
- 临床基本检查方法和检查程序课件
- 新疆五彩湾温泉二期建设项目可行性研究报告
- 红金消结片对“乳腺增生”的疗效观察
- 基于Java的网上蛋糕预订销售系统的设计与实现
- 青海2023届高校毕业生就业报告出炉:医学和法学就业率最高
- 生理学 第九章 感觉器官的功能
- 急救车必备药品和物品 急救车物品药品管理
- 静脉血栓栓塞症预防与护理课件
- 西门子低压电器快速选型手册
- 养羊与羊病防治技术课件
评论
0/150
提交评论