1. 单片机双机串口通信程序设计
初始化程序:
BTLEQU2FH;波特率放在内部RAM的2FH单元
MOVTMOD,#21H;T0方式1,16位计数器,T1方式2,串口用
SETBTR0;启动T0
MOVBTL,#0F3H;波特率设定为1200
MOVSCON,#0C0H;串口方式3,9位数据,禁止接收
接收及验证程序:
NUMEQU2BH;同步符个数值存放在内部RAM的2BH单元
TEMPEQU2CH
ROM-CH:DB55H,55H,55H,55H,55H,55H,55H,55H,55H,55H
DB55H,55H,55H,55H,55H,55H,55H,55H,55H,55H;20字节同步符
MIMDB'WSC':3字节密码“WSC”
SETBP3.5;置电台收状态
SETBREN;允许串口接收
A1:MOVNUM,#0;记录连续到同步符55H的个数
A2:JBRI,A2;串口有数据转A3
A3:CLRRI;清接收中断标志
MOVA,SBUF;读串口数据
CJNEA,#55H,A1;不是同步符转A1
INCNUM;收到的同步符个数加1
MOVA,NUM;取收到的同步符个数
CJNEA,#5,A2;未收够连续5个55H转A2
A4:MOVNUM,#0;密码验证,记录收到密码字节数
A5:MOVDPTR,#MIM;密码字符首址
MOVA,NUM
MOVCA,@A+DPTR;查表取密码
MOVTEMP,A;保存密码
JBRI,A6;串口收完一个字节转A6
…
A6:CLRRI;清接收中断标志
MOVA,SBUF;读串口数据
CJNEA,TEMP,A4;与密码不符转A4
INCNUM;收到的密码个数加1
MOVA,NUM;取已收到的密码字节数
CJNEA,#3,A5;密码未收完转A5
发送程序:
CLRP3.5;置电台发状态
MOVB,#23
MOVDPTR,#ROM-CH
B1:CLRA
MOVCA,@A+DPTR;查表发送同步符和密码共24字节
INCDPTR
LCALLSEND-CH;调发送单字节子程序
DJNZB,B1
…
CLRA
MOVDPTR,#7000H;外部RAM数据首址,发送外部RAM中的数据到电台
B2:CJNER4,#0,B3
CJNER3,#0,B3;R4R3=发送字节数
B3:MOVXA,@DPTR;取数据
INCDPTR
LCALLSEND-CH
CJNER3,#0,B4
CJNER4,#0,B5
B4:DECR3
LJMPB2
DECR3
DECR4
LJMPB2
…
SEND-CH:SETBTB8
MOVSBUF,A
DB0,0,0,0,0,0,0,0
JNBTI,$;延时4μs
CLRTI
RET
结语
2. 单片机串行通信实验
1、实验:用单片机串行口,实现两个实验台之间的串行通讯。其中一个实验台作为发送方,
另一侧为接收方。发送方读入按键值,并发送给接收方,接收方收到数据后在LED上显示
2、原理:串行通信是指数据按位顺序传送的通信。串行数据传送的特点是:通信线路简单,最多只需一对传输线即可实现通信,成本低但速度慢,其通信线路既能传送数据信息,又能传送控制信息。它对信息的传送格式有固定要求,具体分为异步和同步两种信息格式.与此相应有异步通信和同步通信两种方式;在串行通信中,对信息的逻辑定义与TTL不兼容,需要进行逻辑电平转换:计算机与外界的数据传送大多是串行的,其传送的距离可以从几米到几千公里。单片机中使用的串行通信通常都是异步方式的
3、实验目的:1)掌握单片机串行口工作方式的程序设计,及简易三线式通讯的方法。 2)了解实现串行通讯的硬环境、数据格式的协议、数据交换的协议。 3)学习串口通讯的中断方式的程序编写方法
4、参考实现:
http://wenku..com/link?url=uyYKlkBQqwjGl-akFJ3xWa67R814ShF50uwd3
3. 51单片机 串口设计c语言程序简单设计
第一题,已经测试成功:
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar flag, a;
sbit d = P0^0;
void init()
{
TMOD = 0x20; //设置定时器1为工作方式2
TH1 = 0xfd;
TL1 = 0xfd;
TR1 = 1; //开定时器1
REN = 1; //开串口通信.
SM0 = 0; //设置串口通信方式1
SM1 = 1;
EA = 1; //开总中断.
ES = 1; //开串口中断.
}
void delay(uint z)
{
uint x, y;
for(x = z; x > 0; x--) for(y = 110; y > 0; y--);
}
void main()
{
init();
a = '4';
while(1) {
if(a == '1') {
d = 0; delay(400);
d = 1; delay(400);
}
else if(a == '2') {
d = 0; delay(200);
d = 1; delay(200);
}
else if(a == '3') {
d = 0; delay(100);
d = 1; delay(100);
}
else if(a == '4') {
d = 1;
}
}
}
void ser() interrupt 4
{
if (TI == 1) {
TI = 0;
}
else if (RI == 1) {
RI = 0;
a = SBUF; //中间变量.
flag = 1;
}
}
4. 单片机串口实验
;;用单片机口串口通信工作于方式0,串行输出,
;;再接CD4094或74HC164寄存器实现并出,8个发光管从左到右交替地亮灭
;;P1.0接CD4094的STR作并出允许控制,RXD接DATA,TXD接CLK作时钟
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ORG 000H
JMP MAIN
ORG 30H
MAIN:
MOV SP,#5FH
MOV SCON,#00H;设串口方式0
MOV A,#80H;最左位先亮
CLR P1.0;关并行输出
OUT0:
MOV SBUF,A;串出
OUT1:JBC T1,NEXT
JMP OUT1
NEXT:SETB P1.0;并出
CALL DELAY ;延时一会
RR A
CLR P1.0
AJMP OUT0
DELAY: MOV R7,#250
D1: MOV R6,#250
D2: DJNZ R6,D2
DJNZ R7,D1
RET
END
5. 8031双机串行通信实验设计
哎直接给我算咯, 串行通信
一、实验目的
1、掌握串行口工作方式2的程序设计,掌握单片机通信程序编制方法。
2、了解实现串行通信的硬环境,数据格式的协议,数据交换的协议。
3、掌握双机通信的原理和方法。
二、实验设备
DVCC仿真系统二套。
三、实验内容
1、 利用8031单片机串行口,实现双机通信。将1号实验机键盘上键入的数字显示到2号实验机的数码管上。
四、实验步骤
1、按图接线
2、两台DVCC实验系统处于“P.”状态下。
3、在1号机上选择“双机通信”发送程序,编译并连接,输入0D00后,按EXEC键。
4、在2号机上选择“双机通信”接收程序,编译并连接,输入0E30后,按EXEC键。
5、从1号机的键盘上输入数字键,会显示在3号机的显示器上。
五、实验线路
六、程序框图
一 工作方式
1)方式 0
当设定SM1、SM0为00时,串行口工作于方式0,在方式0下,RXD为数据输入/输出端,TXD为同步脉冲输出端,发送或接收的数据为8位,低位在前,高位在后,方式0的波特率固定为ƒ /12,也就是每一机器周期传送一位数据。方式0可以外接移位寄存器,将串行口扩展为并行口,也可以外接同步输入/输出设备。
2)方式 1
当设定SM1、SM0为01时,串行口工作方式1。方式1为波特率可变的8位异步通信方式,由TXD发送RXD接收,一帧数据为10位,1位起始位(低电平),8位数据位(低位在前)和1位停止位(高电平),波特率取决于定时器 的T 溢出率(1/溢出周期)和波特率的选择位SMOD。
波特率 = *(定时器T 溢出率)
3)方式2和方式3
当设定SM0、SM1为10或11时,串行口工作于方式2或方式3,这两种方式都是9位异步通信,仅波特率不同,适用于多机通信。在方式2或方式3下,数据由TXD发送RXD接收,1帧数据为11位,1位起始位(低电平),8位数据位(低位在前),1位可编程位(第9位数据,用作奇偶校验或地址/数据选择),1位停止位(高电平)。与方式1相比,多了一位可编程位,发送时,第9位数据为TB8,接收时,第9位数据送入RB8。
方式(2)波特率 = *ƒ
方式(3)波特率 = *(定时器T 溢出率)
二 波特率的设置
Mcs-51系列单片机串行通信的波特率取决于串行口的工作方式。方式0的波特率固定等于ƒ /12,方式2的波特率有两种:当SMOD=0时,波特率=ƒ /64;当SMOD=1时,波特率=ƒ /32。 SMOD是PCON寄存器的最高位,通过软件可设置SMOD=0或1,但注意PCON无位寻址功能。
当串行口工作于方式1和方式3时,波特率= *定时器T 溢出率/32,其中T 溢出率=1/T 溢出周期。因此,影响波特率的因素除了设定的SMOD值以外,还有T 溢出率,使波特率的设置更灵活,范围更广。下面说明溢出率计算和波特率设方法。
1) T 溢出率的计算
串行通信方式1和3 下,使用定时器T 作为波特率发生器。T 可以工作于方式0、方式1和方式2。其中方式2为自动装入时间常数的8位定时器使用时只需进行初始化,不需要安排中断服务程序重装时间常数,因此是一种常用方式。
Mcs-51系列单片机定时器时间计算式为:
T = (2 -N)*12/ƒ
式中:T ——定时器溢出周期
n ——定时器位数
N——时间常数即定时器初值
ƒ ——振荡频率(2 -N)*12/ƒ
当定时器T 工作于方式2,则有
溢出周期=(2 -N)*12/ƒ
溢出率=1/溢出周期= ƒ /12*(2 -N)
2)波特率的设置:由上述可得当串行口工作于方式1或方式3,定时器T 工作于方式2时。 波特率 = 2 * T 溢出率/32
=2 * ƒ /[32*12(2 -N)
;系统晶振是 6.0 MHz
ORG 0E30H
START:
MOV SP,#60H
mov A,#02H
MOV R0,#79H
MOV @R0,A
INC R0
MOV A,#10H
MOV @R0,A
INC R0
MOV A,#01H
MOV @R0,A
INC R0
MOV A,#03H
MOV @R0,A
INC R0
MOV A,#00H
MOV @R0,A
INC R0
MOV A,#08H
MOV @R0,A
MOV A,#7EH
MOV DPTR,#1FFFH
MOVX @DPTR,A
MOV SCON,#50H ;串口 方式 1
MOV TMOD,#20H ;T1 方式 1
MOV TL1,#0CCH ;波特率 9600 的常数
MOV TH1,#0CCH
SETB TR1 ;开中断
CLR ET1
CLR ES
WAIT:
JBC RI,DIS_REC ;是否接收到数据
LCALL DISP ;
SJMP WAIT ;
DIS_REC:
MOV A,SBUF ;读串口接收到的数据
LCALL DATAKEY ;显示输入的数字(0-F)
DB 79H,7EH
AJMP WAIT
DATAKEY:MOV R4,A
MOV DPTR,#1FFFH
MOVX A,@DPTR
MOV R1,A
MOV A,R4
MOV @R1,A
CLR A
POP 83H
POP 82H
MOVC A,@A+DPTR
INC DPTR
CJNE A,01H,DATAKEY2
DEC R1
CLR A
MOVC A,@A+DPTR
DATAKEY1:PUSH 82H
PUSH 83H
MOV DPTR,#1FFFH
MOVX @DPTR,A
POP 83H
POP 82H
INC DPTR
PUSH 82H
PUSH 83H
RET
DATAKEY2:DEC R1
MOV A,R1
SJMP DATAKEY1
DISP: SETB 0D4H
MOV R1,#7EH
MOV R2,#20H
MOV R3,#00H
DISP1:
MOV DPTR,#DATACO
MOV A,@R1
MOVC A,@A+DPTR
MOV DPTR,#0FF22H
MOVX @DPTR,A
MOV DPTR,#0FF21H
MOV A,R2
MOVX @DPTR,A
LCALL DELAY
DEC R1
CLR C
MOV A,R2
RRC A
MOV R2,A
JNZ DISP1
CLR 0D4H
RET
DELAY: MOV R7,#03H
DELAY0: MOV R6,#0FFH
DELAY1: DJNZ R6,DELAY1
DJNZ R7,DELAY0
RET
DATACO: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
DB 88H,83H,0C6H,0A1H,86H,8EH,0BFH,0CH,89H,0DEH
END
6. 怎么配置单片机串口
最近测试涉及到底层串口代码的修改。经过这次修改,突然发现其实自己对于串口的一些特性以前并不是十分清楚。
首先遇到的一些问题:
1)在使用IO的数据位的时候,没有考虑校验位所占的位数。
2)在设置串口输入的时候,使用悬空输入。
关于1),在一次使用STM32串口参数9600,N,8,1与另一个 8051MCU通信的时候发现偶校验没有问题,但是无校验通信就出现异常。但是,当将STM32与电脑通信的时候,偶校验与无校验通信又完全都是正确的。8051MCU单独与电脑通信也都是完全正确的。查看代码,还真不知道有什么不对劲的。因为这段代码,用了很长时间了。后来一个同事看代码后,提醒说对于数据位的设置,偶校验和无校验是一致的,既然没有数据位,有可能会少一位。从这点看,这段代码可以修改看看。于是在这个地方,将偶校验的时候数据位长度设置为9bit,无校验的时候设置为8bit。重新测试,发现通信正常了。
7. 51单片机串行口实验virtualterminal窗口在哪里
1. virtual terminal 默认显示字符,如果单片机发送的是非显示字符,裤亩和则虚拟终端不会显示,会导致用户认为通讯未通。 运行程序,在虚拟终端窗口里面点击右键,在弹出菜单里面: 选HEX DISPLAY MODE,则显示按十六耐举进制胡盯显示,能显示所有字符。
2.virtual terminal 默认情况下不显示回显字符, 运行程序,在虚拟终端窗口里面点击右键,在弹出菜单里面: 选Echo Typed Characters 显示回显字符
3.virtual terminal 和模拟物理串口COMPIM不能同时使用,同时使用会发生相互影响。