串口编程.doc_第1页
串口编程.doc_第2页
串口编程.doc_第3页
串口编程.doc_第4页
串口编程.doc_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

串口编程1、串行口方式1应用编程补充例1 本例采用方式1进行双机通信,收发双方均采用6MHz晶振,波特率为2400,每一帧信息为10位,第0位为起始位,18位为数据位,最后1位为停止位。发送方将78H、77H单元的内容为首地址,以76H、75H单元内容减1为末地址的数据块内容通过串行口发送给接收方。发送方要发送的数据块的地址为2000H201FH。发送时先发送地址帧,再发送数据帧;接收方在接收时,使用一个标志位来区分接收的数据是地址还是数据,然后将其分别存放在指定的单元中。发送方可采用查询方式或中断方式发送数据,接收方采用中断或查询方式接收。本例子仅给出中断方式的发送和接收的程序。1)甲机发送程序中断方式的发送程序如下:ORG 0000HLJMP MAINORG 0023HLJMP COM_INTORG 1000HMAIN:MOV SP,#53H ;set stock top pointer MOV 78H,#20H ;set sending data first-bottom address MOV 77H,#00H MOV 76H,#20H MOV 75H,#40H ACALL TRANS ;call send prog SJMP $TRANS:MOV TMOD,#20H ;set timer/counter working model MOV TH1,#0F3H ;set counter initial value MOV TL1,#0F3H MOV PCON,#80H ;set baud rate double SETB TR1 ;open counter MOV SCON,#40H ;set serial working model MOV IE,#00H ;First close interrupt,use query model sending address CLR F0 MOV SBUF,78H ;send first-address high 8bitWAIT1:JNB TI,WAIT1 CLR TI MOV SBUF,77H ;send first-address low 8bitWAIT2:JNB TI,WAIT2 CLR TI MOV SBUF,76H ;send end-address high 8bitWAIT3:JNB TI,WAIT3 CLR TI MOV SBUF,75H ;send end-address low 8bitWAIT4:JNB TI,WAIT4 CLR TI MOV IE,#90H ;open interrupt,interrupt model send data MOV DPH,78H MOV DPL,77H MOVX A,DPTR MOV SBUF,A ;send first dataWAIT: JNB F0,WAIT ;wait sending RETCOM_INT: CLR TI ;close sending-interrupt flag bit TI INC DPTR ;data pointer add 1,intend sending next data MOV A,DPH ;determine current sending data address wether or not bottom address CJNE A,76H,END1 ;no bottom address,jump MOV A,DPL CJNE A,75H,END1 SETB F0 ;data sending end,set F0 equ 1 CLR ES ;close serial interrupt CLR EA ;close interrupt RETEND1: MOVX A,DPTR ;wait sending data give A,intend to send MOV SBUF,A ;send data RETI END2)乙机接收程序中断方式的接收程序如下:ORG 0000HLJMP MAINORG 0023HLJMP COM_INTORG 1000HMAIN:MOV SP,#53H ;set stock top pointer ACALL RECEI SJMP $RECEI: MOV R0,#78H MOV TMOD,#20H MOV TH1,#0F3H ;set counter initial value MOV TL1,#0F3H MOV PCON,#80H ;set baud rate double SETB TR1 ;open counter MOV SCON,#50H ;set serial working model MOV IE,#90H ;open interrupt CLR F0 ;clear flag F0 CLR 7FHWAIT: JNB 7F,WAIT ;query flag-bit,wait receive data RETCOM_INT:PUSH DPL ;保护现场 PUSH DPH PUSH ACC CLR RI ;清接收中断RI JB F0,R_DATA ;判断接收的是数据还是地址,F00为地址 MOV A,SBUF ;接收数据 MOV R0,A ;将地址帧送指定的寄存器 DEC R0 CJNE R0,#74H,RETN SETB F0 ;置标志位,地址接收完毕RETN: POP ACC ;出栈 POP DPH POP DPL RETIR_DATA: MOV DPH,78H ;数据接收程序区 MOV DPL,77H MOV A,SBUF ;接收数据 MOVX DPTR,A ;送指定的数据存储单元中 INC 77H ;地址加1 MOV A,77H ;判断接收的数据的地址是否应向高8位进位 JNZ END2 INC 78HEND2: MOV A,76H CJNE A,78H,RETN ;判断是否为最后一帧数据,不是则继续 MOV A,75H CJNE A,77H,RETN ;是最后一帧数据则清各种标志位 CLR ES CLR EA SETB 7FH SJMP RETN END2、串行口方式2应用编程方式2和方式1有两点不同之处:一是传输信息格式不同,即方式2接收/发送11bit,第0位为起始位,第18位为数据位,第9位为控制位(该位由TB8决定),第10位为停止位;二是波特率变化范围不同,方式2的波特率振荡器频率/n,其中当SMOD0时,n64;当SMOD1时,n32。由于方式2的使用和方式3基本一样(只是波特率不同,方式3的波特率要由用户决定),所以方式2的具体编程使用,可参照方式3的应用编程。3、串行口方式3应用编程补充例2 MCS-51串行通讯方式3进行发送和接收的应用实例。发送方采用查询方式发送地址帧,采用中断或查询方式发送数据;接收方采用中断或查询方式接收数据。发送和接收双方均采用6MHz的晶振,波特率为4800。发送方首先将存放在78H和77H单元中的地址发送给接收方,然后发送数据00HFFH,共256个数据。1)甲机发送程序中断方式的发送程序如下:ORG 0000HLJMP MAINORG 0023HLJMP COM_INTORG 1000HMAIN: MOV SP,#53H MOV 78H,#20H ;设置要存放数据的单元的首地址 MOV 77H,#00H ACALL TRAN ;调用发送子程序 SJMP $TRAN:MOV TMOD,#20H ;设置定时器/计数器工作方式 MOV TH1,#0FDH ;设置波特率为4800 MOV TL1,#0FDH SETB TR1 ;开定时器 MOV SCON,#0E0H ;设置串口工作方式为3 SETB TB8 ;设置第9位数据位 MOV IE,#00H ;关中断 MOV SBUF,78H ;查询方式发送首地址高8位WAIT: JNB TI,WAIT CLR TI MOV SBUF,77H ;发送首地址低8位WAIT2:JNB TI,WAIT2 CLR TI MOV IE,#90H ;开中断 CLR TB8 MOV A,#00H MOV SBUF,A ;开始发送数据WAIT1:CJNE A,#0FFH,WAIT1 ;判断数据是否发送完毕 CLR ES ;发送完,关中断 RETCOM_INT:CLR TI ;中断服务子程序 INC A ;要发送数据值1 MOV SBUF,A ;发送数据 RETI END2)乙机接收程序接收方把先接收到的数据送给数据指针,将其作为数据存放的首地址,然后将接下来接收到的数据存放在以首地址开始的单元中。采用中断方式的接收程序如下:ORG 0000HLJMP MAINORG 0023HLJMP COM_INTORG 1000HMAIN: MOV SP,#53H MOV R0,#0FEH ;设置地址帧接收计数寄存器初值 ACALL RECEI ;调用接收子程序 SJMP $RECEI: MOV TMOD,#20H ;设置C/T工作方式 MOV TH1,#0FDH ;设置波特率4800 MOV TL1,#0FDH SETB TR1 ;开定时器 MOV IE,#90H ;开中断 MOV SCON,#0F0H ;设置串口工作方式,允许接收 SETB F0 ;设置标志位WAIT: JB F0,WAIT ;等待接收 RETCOM_INT:CLR RI ;清接收中断标志位 MOV C,RB8 ;对第9位数据进行判断,是数据还是地址 JNC PD2 ;是地址,则送给数据指针指示器DPTR INC R0 MOV A,R0 JZ PD MOV DPH,SBUF SJMP PD1PD: MOV DPL,SBUF CLR SM2 ;清地址标志位PD1: RETIPD2: MOV A,SBUF ;接收数据 MOVX DPTR,A INC DPTR CJNE A,#0FFH,PD1 ;判断是否是最后一帧数据 SETB SM2 ;是,则清相关的标志位 CLR F0 CLR ES RETI END一般来说,定时器方式2用来确定波特率是比较理想的,它不需要在中断服务程序中设置初值,且计算的波特率比较准确。在用户使用波特率不是很低的情况下,建议使用定时器T1的方式2来确定波特率。补充例3 某单片机频率位11.0592MHz,选用T1方式2作为波特率发生器,波特率为2400b/s,求初值。(T1方式2,选SMOD0)解:由公式:波特率(其中x为初值)。将已知条件代入公式,有得到x244F4H,将F4H装入TH1、TL1,即可得到2400的波特率。单片机电子琴设计1 实验任务 (1 由4X4组成16个按钮矩阵,设计成16个音。(2 可随意弹奏想要表达的音乐。2电路原理图 3系统板硬件连线 (1 把“单片机系统”区域中的P1.0端口用导线连接到“音频放大模块”区域中的SPK IN端口上;(2 把“单片机系统“区域中的P3.0P3.7端口用8芯排线连接到“4X4行列式键盘”区域中的C1C4R1R4端口上;4 相关程序内容 (1 4X4行列式键盘识别;(2 音乐产生的方法;一首音乐是许多不同的音阶组成的,而每个音阶对应着不同的频率,这样我们就可以利用不同的频率的组合,即可构成我们所想要的音乐了,当然对于单片机来产生不同的频率非常方便,我们可以利用单片机的定时/计数器T0来产生这样方波频率信号,因此,我们只要把一首歌曲的音阶对应频率关系弄正确即可。现在以单片机12MHZ晶振为例,例出高中低音符与单片机计数T0相关的计数值如下表所示音符频率(HZ)简谱码(T值) 音符频率(HZ)简谱码(T值)低1DO26263628# 4 FA#74064860#1DO#27763731中 5 SO78464898低2RE29463835# 5 SO#83164934#2 RE#31163928中 6 LA88064968低 3 M33064021# 693264994低 4 FA34964103中 7 SI98865030# 4 FA#37064185高 1 DO104665058低 5 SO39264260# 1 DO#110965085# 5 SO#41564331高 2 RE117565110低 6 LA44064400 # 2 RE#124565134# 646664463高 3 M131865157低 7 SI49464524高 4 FA139765178中 1 DO52364580# 4 FA#148065198# 1 DO#55464633高 5 SO156865217中 2 RE58764684# 5 SO#166165235# 2 RE#62264732高 6 LA176065252中 3 M65964777# 6186565268中 4 FA69864820高 7 SI196765283下面我们要为这个音符建立一个表格,有助于单片机通过查表的方式来获得相应的数据低音019之间,中音在2039之间,高音在4059之间TABLE: DW 0,63628,63835,64021,64103,64260,64400,64524,0,0 DW 0,63731,63928,0,64185,64331,64463,0,0,0 DW 0,64580,64684,64777,64820,64898,64968,65030,0,0 DW 0,64633,64732,0,64860,64934,64994,0,0,0 DW 0,65058,65110,65157,65178,65217,65252,65283,0,0 DW 0,65085,65134,0,65198,65235,65268,0,0,0 DW 02、音乐的音拍,一个节拍为单位(C调)曲调值DELAY 曲调值DELAY调4/4125ms 调4/462ms调3/4187ms 调3/494ms调2/4250ms 调2/4125ms对于不同的曲调我们也可以用单片机的另外一个定时/计数器来完成。下面就用AT89S51单片机产生一首“生日快乐”歌曲来说明单片机如何产生的。在这个程序中用到了两个定时/计数器来完成的。其中T0用来产生音符频率,T1用来产生音拍。5程序框图6汇编源程序KEYBUF EQU 30H ;定义变量STH0 EQU 31H STL0 EQU 32H TEMP EQU 33H ORG 0000H ;初始化 LJMP START ORG 0BH LJMP INT_T0 START: MOV TMOD,#01H ;设置T0工作方式1 SETB EA ;开中断 SETB ET0 WAIT: MOV P3,#0FFH ;设置P3,判断第一行是否有键被按下 CLR P3.4 MOV A,P3 ANL A,#0FH XRL A,#0FH JZ NOKEY1 ;若无,判断第二行是否有键被按下 LCALL DELY10MS ;调用延时子程序 MOV A,P3 ;再次判断第一行是否有键被按下 ANL A,#0FH XRL A,#0FH JZ NOKEY1 ;判断按键值 MOV A,P3 ;识别按键 ANL A,#0FH CJNE A,#0EH,NK1 MOV KEYBUF,#0 LJMP DK1 NK1: CJNE A,#0DH,NK2 MOV KEYBUF,#1 LJMP DK1 NK2: CJNE A,#0BH,NK3 MOV KEYBUF,#2 LJMP DK1 NK3: CJNE A,#07H,NK4 MOV KEYBUF,#3 LJMP DK1 NK4: NOP DK1: MOV A,KEYBUF MOV DPTR,#TABLE MOVC A,A+DPTR MOV P0,A MOV A,KEYBUF MOV B,#2 MUL AB MOV TEMP,A MOV DPTR,#TABLE1 MOVC A,A+DPTR MOV STH0,A MOV TH0,A INC TEMP MOV A,TEMP MOVC A,A+DPTR MOV STL0,A MOV TL0,A SETB TR0 DK1A: MOV A,P3 ANL A,#0FH XRL A,#0FH JNZ DK1A CLR TR0 NOKEY1: MOV P3,#0FFH ;判断第二行是否有键被按下,若有,则进行识别 CLR P3.5 ;若无,则判断第三行是否有键被按下 MOV A,P3 ANL A,#0FH XRL A,#0FH JZ NOKEY2 LCALL DELY10MS MOV A,P3 ANL A,#0FH XRL A,#0FH JZ NOKEY2 MOV A,P3 ANL A,#0FH CJNE A,#0EH,NK5 MOV KEYBUF,#4 LJMP DK2 NK5: CJNE A,#0DH,NK6 MOV KEYBUF,#5 LJMP DK2 NK6: CJNE A,#0BH,NK7 MOV KEYBUF,#6 LJMP DK2 NK7: CJNE A,#07H,NK8 MOV KEYBUF,#7 LJMP DK2 NK8: NOP DK2: MOV A,KEYBUF MOV DPTR,#TABLE MOVC A,A+DPTR MOV P0,A MOV A,KEYBUF MOV B,#2 MUL AB MOV TEMP,A MOV DPTR,#TABLE1 MOVC A,A+DPTR MOV STH0,A MOV TH0,A INC TEMP MOV A,TEMP MOVC A,A+DPTR MOV STL0,A MOV TL0,A SETB TR0 DK2A: MOV A,P3 ANL A,#0FH XRL A,#0FH JNZ DK2A CLR TR0 NOKEY2: MOV P3,#0FFH ;判断第三行是否有键被按下,若有,则进行识别 CLR P3.6 ;若无,则判断第四行是否有键被按下 MOV A,P3 ANL A,#0FH XRL A,#0FH JZ NOKEY3 LCALL DELY10MS MOV A,P3 ANL A,#0FH XRL A,#0FH JZ NOKEY3 MOV A,P3 ANL A,#0FH CJNE A,#0EH,NK9 MOV KEYBUF,#8 LJMP DK3 NK9: CJNE A,#0DH,NK10 MOV KEYBUF,#9 LJMP DK3 NK10: CJNE A,#0BH,NK11 MOV KEYBUF,#10 LJMP DK3 NK11: CJNE A,#07H,NK12 MOV KEYBUF,#11 LJMP DK3 NK12: NOP DK3: MOV A,KEYBUF MOV DPTR,#TABLE MOVC A,A+DPTR MOV P0,A MOV A,KEYBUF MOV B,#2 MUL AB MOV TEMP,A MOV DPTR,#TABLE1 MOVC A,A+DPTR MOV STH0,A MOV TH0,A INC TEMP MOV A,TEMP MOVC A,A+DPTR MOV STL0,A MOV TL0,A SETB TR0 DK3A: MOV A,P3 ANL A,#0FH XRL A,#0FH JNZ DK3A CLR TR0 NOKEY3: MOV P3,#0FFH ;判断第四行是否有键被按下,若有,则进行识别; CLR P3.7 ;若无,则等待 MOV A,P3 ANL A,#0FH XRL A,#0FH JZ NOKEY4 LCALL DELY10MS MOV A,P3 ANL A,#0FH XRL A,#0FH JZ NOKEY4 MOV A,P3 ANL A,#0FH CJNE A,#0EH,NK13 MOV KEYBUF,#12 LJMP DK4 NK13: CJNE A,#0DH,NK14 MOV KEYBUF,#13 LJMP DK4 NK14: CJNE A,#0BH,NK15 MOV KEYBUF,#14 LJMP DK4 NK15: CJNE A,#07H,NK16 MOV KEYBUF,#15 LJMP DK4 NK16: NOP DK4: MOV A,KEYBUF MOV DPTR,#TABLE MOVC A,A+DPTR MOV P0,A MOV A,KEYBUF MOV B,#2 MUL AB MOV TEMP,A MOV DPTR,#TABLE1 MOVC A,A+DPTR MOV STH0,A MOV TH0,A INC TEMP MOV A,TEMP MOVC A,A+DPTR MOV STL0,A MOV TL0,A SETB TR0 DK4A: MOV A,P3 ANL A,#0FH XRL A,#0FH JNZ DK4A CLR TR0 NOKEY4: LJMP WAIT DELY10MS: MOV R6,#10 ;延时子程序D1: MOV R7,#248 DJNZ R7,$ DJNZ R6,D1 RET INT_T0: MOV TH0,STH0 MOV TL0,STL0 CPL P1.0 RETI TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H TABLE1: DW 64021,64103,64260,64400 DW 64524,64580,64684,64777 DW 64820,64898,64968,65030 DW 65058,65110,65157,65178 END 7 C语言源程序 #include unsigned char code table=0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71; unsigned char temp; unsigned char key; unsigned char i,j; unsigned char STH0; unsigned char STL0; unsigned int code tab=64021,64103,64260,64400, 64524,64580,64684,64777, 64820,64898,64968,65030, 65058,65110,65157,65178; void main(void) TMOD=0x01; /初始化中断寄存器,开中断 ET0=1; EA=1; while(1) P3=0xff; /判断第一行是否有键被按下,若有,则进行识别 P3_4=0; temp=P3; temp=temp & 0x0f; if (temp!=0x0f) for(i=50;i0;i-) for(j=200;j0;j-); temp=P3; temp=temp & 0x0f; if (temp!=0x0f) temp=P3; temp=temp & 0x0f; switch(temp) case 0x0e: key=0; break; case 0x0d: key=1; break; case 0x0b: key=2; break; case 0x07: key=3; break; temp=P3; P1_0=P1_0; P0=tablekey; STH0=tabkey/256; STL0=tabkey%6; TR0=1; temp=temp & 0x0f; while(temp!=0x0f) temp=P3; temp=temp & 0x0f; TR0=0; P3=0xff; /判断第二行

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论