⑴ 51单片机通过串口实现数据的发送与接收程序
串口收发,要有通信协议。也就是什么时候开始接收,接收到指令后,转发什么数据。这个要知道,才可以写。而且使用不同的51单片机,其内部寄存器配置是不同的。
一般来说,过程如下:
1,配置串口参数、波特率等,开启串口中断;
void Init_UART()
{
}
2,中断函数里写中断响应函数,根据接收的指令或者数据,执行相应的动作;
程序一般为:
void UART_ISR() interrupt x using y
{
;串口中断处理函数
}
x - 单片机的C51中断号
y - 指定使用的当前工作寄存器组号(0-3 PSW中的RS0,RS1组合)
3,主程序
int main(void)
{
Init_UART();
while(1)
{
;//数据发送函数
}
}
⑵ 单片机串行通信实验
1、实验:用单片机串行口,实现两个实验台之间的串行通讯。其中一个实验台作为发送方,
另一侧为接收方。发送方读入按键值,并发送给接收方,接收方收到数据后在LED上显示
2、原理:串行通信是指数据按位顺序传送的通信。串行数据传送的特点是:通信线路简单,最多只需一对传输线即可实现通信,成本低但速度慢,其通信线路既能传送数据信息,又能传送控制信息。它对信息的传送格式有固定要求,具体分为异步和同步两种信息格式.与此相应有异步通信和同步通信两种方式;在串行通信中,对信息的逻辑定义与TTL不兼容,需要进行逻辑电平转换:计算机与外界的数据传送大多是串行的,其传送的距离可以从几米到几千公里。单片机中使用的串行通信通常都是异步方式的
3、实验目的:1)掌握单片机串行口工作方式的程序设计,及简易三线式通讯的方法。 2)了解实现串行通讯的硬环境、数据格式的协议、数据交换的协议。 3)学习串口通讯的中断方式的程序编写方法
4、参考实现:
http://wenku..com/link?url=uyYKlkBQqwjGl-akFJ3xWa67R814ShF50uwd3
⑶ 您好请问一下,两个单片机互相传数据的程序怎么写
两个单片机互相传数据,其实很简单的 就是两个单片机的串口通信,当然需要一个串口通信的协议,如指令码、数据长度、数据等等,就是什么指令需要怎么操作、操作数据是什么。如这是两个单片机简单通信操作的仿真实例可以作为参考。
#include <reg52.h> // 单片机1
#define uchar unsigned char
#include <stdio.h>
unsigned char* c;
sbit k0=P3^2;
sbit k1=P3^3;
sbit led1=P3^5;
uchar k;
bit y0,y1;
bit t,s;
uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d};
void SendOneChar(char c) //发送字节到PC
{
TI=0;
SBUF = c;
while(!TI);
TI=0;
}
void SendString(char *st) //发送字符串到PC
{
while(*st)
{
SendOneChar(*st++);
}
}
void main()
{
SCON = 0x50; //SCON: mode 1, 8-bit UART, enable rcvr
TMOD = 0x20; //TMOD: timer 1, mode 2, 8-bit reload
PCON = 0x80; // 数据位8、停止位1。效验位无 (11.0592M)
TH1 = 0xF4; //TH1: reload value for [email protected]
TR1 = 1; //启动定时器1
ES = 1; //允许串口中断位
EA = 1; //允许总中断位
c=0;
s=1;
k=0;
P1 =~table[k];
while(1)
{
if(k0==0 && y0==0)
{
y0=1;
c = "az";
SendString(c); //发送字符串
}
if(k0==1 ) { y0=0; }
if(k1==0 && y1==0)
{
y1=1;
c = "as";
SendString(c); //发送字符串
}
if(k1==1 ) { y1=0; }
// for(i = 0; i < 4000; i++); //延迟一小段时间
}
}
void chuankou(void) interrupt 4
{
if(RI==1)
{
RI = 0;
if(t==1)
{
if(SBUF=='z') { k++;led1=~led1; }
s=1; t=0;
if(k==10) { k=0;}
P1 =~table[k];
}
if(SBUF=='a' && s==1) { t=1;s=0;}
}
}
------------------
#include <reg51.h> // 单片机2
#define uchar unsigned char
unsigned char* c;
sbit led1=P3^2; // 接收 az , P.2 输出低电平, P3.3 输出高电平。
sbit led2=P3^3; // 接收 aa , P.2 输出高电平, P3.3 输出低电平。
sbit k0=P3^5;
bit y0,t,s;
uchar k;
uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d};
void SendOneChar(char c) //发送字节到PC
{
TI=0;
SBUF = c;
while(!TI);
TI=0;
}
void SendString(char *st) //发送字符串到PC
{
while(*st)
{
SendOneChar(*st++);
}
}
void main (void)
{
SCON = 0x50; // REN=1允许串行接受状态,串口工作模式1
TMOD = 0x21; // 定时器工作方式2
PCON = 0x80; // 数据位8、停止位1。效验位无 (11.0592M)
TH1 = 0xF4; // TH1 = 0xFD; 波特率 2400
TH0=(65536-54253)/256; // 50 mS
TL0=(65536-54253)%256;
TR1 = 1;
ES = 1; // 开串口中断
EA = 1; // 开总中断
// ET0=1;
// TR0=1;
s=1;
k=0;
P1 =~table[k];
while(1)
{
if(k0==0 && y0==0)
{
y0=1;
c = "az";
SendString(c); //发送字符串
}
if(k0==1 ) { y0=0; }
}
}
void chuankou(void) interrupt 4
{
if(RI==1)
{
RI = 0;
if(t==1)
{
if(SBUF=='z') {led1=0;led2=1; k++; }
if(SBUF=='s') {led1=1;led2=0; k--; }
s=1; t=0;
if(k==10) { k=0;}
if(k==255) { k=9; }
P1 =~table[k];
}
if(SBUF=='a' && s==1) { t=1;s=0;}
}
}
void T0_time()interrupt 1
{
TH0=(65536-54253)/256; // 50 mS
TL0=(65536-54253)%256;
k++;
if(k==10) // 这里修改时间
{
k=0;
led1=1;
led2=1;
}
}
⑷ 89C51单片机到PC机数据传送实验
汇编语言:
ORG0000H
LJMPSt
ORG0020H
St:
CLRA
MOVR7,A
ANLPCON,#0x7F ;波特率不倍速
MOVSCON,#0x50 ;8位数据,可变波特率
ANLTMOD,#0x0F ;清除定时器1模式位
ORLTMOD,#0x20 ;设定定时器1为8位自动重装方式
MOVTL1,#0xE8 ;设定定时初值
MOVTH1,#0xE8 ;设定定时器重装值
CLRET1 ;禁止定时器1中断
SETBTR1 ;启动定时器1
LOOP1:
CLRTI
MOVSBUF,R7 ;串口发送
INCR7
SETBC
MOVA,R7
XRLA,#0x80
SUBBA,#0xE4
JCLOOP2
CLRA
MOVR7,A
LOOP2:
JBTI,LOOP1
SJMPLOOP2
end
调试结果:
⑸ 求单片机数据传送试验源程序
我来答
1.假定16个顷碧数放在20H为首的地址里,送到目的50H为首的地址里
LOOP:
MOV R0,#20H
MOV R1,#50H
MOV A,@R0
MOV @R1,A
INC R0
INC R1
CJNE R0,#30H,LOOP;当inc r0 前,R0=2FH,加1后R0+1=30H,不跳转
2.假定16个数放在内部RAM20H为首的地址里,送到外部RAM目的0010H为首的地址里
MOV R0,#20H
MOV DPTR,#0010H
MOV A,@R0
MOVX @DPTR,A
INC R0
INC DPTR
CJNE R0,#30H,LOOP;当R0=2FH时,R0+1=30H,不跳转
3.将外部RAM以1000H为首的16个数据放入,外部RAM以2000h为首的地址内
MOV R7,#0FH
MOV DPTR,#1000H;将源地址放入第一个DPTR
INC AUXR1;转换指针,指向圆隐第二个DPTR
MOV DPTR,#2000H;将目的地址放入第二个DPTR
INC AUXR1;指向源dptr
LOOP:
MOV A,@DPTR;将源地址数据放入A
INC DPTR;源地址加1
INC AUXR1;转换为目的橘乎厅地址
MOV @DPTR,A;将A内容放入目的地址
INC DPTR;目的地址加1
INC AURX1;指向源地址
DJNZ R7,LOOP;R7减1,循环,减15次