51单片机串口通信试验汇编程序

51 单片机串口通信试验汇编程序
(今天是硬生生的把它给抠出来了):PC 通过串口助手向单片机系统传递命令和数据:以A5 开始,以5A 结束;中间是数据,长度不一,要求把数据部分用led 灯显示出来;并且要求循环显示;
//This is my x_Ed program code
//we use it as the pc communicated with the mcu
//At the same time,we want to see the result by LCD;
STFLAG BIT 00H // 收到起始码标志, 1 为收到起始码EDFLAG BIT 01H // 到结束码标志, 1 为收到结束码TMFLAG BIT 02H // 定时时间到标志, 1 为定时时间到ORG 0000H
SJMP Initialize// 主程序入口(初始化程序)
ORG 000BH // 定时器0 入口
LJMP TIMER0 // 定时器0 中断
ORG 0023H // 串口中断程序的入口地址
LJMP Transfer // 跳转到接受中断入口
///////////////////////////////////////////////////////////////
ORG 0050H
Initialize:
MOV SP,#70H // 设置堆栈
MOV TMOD,#21H //T1 工作方式 2 T0 工作MOV TH1,#0FDH // 波特率9600
MOV TL1,#0FDH //波特率9600 自动重装载MOV TH0,#3CH //定时50ms
MOV TL0,#0BH // 定时50ms
MOV SCON,#50H // 串口工作方式 1
MOV R6,#00H
// 定时次数计数器20 一秒
MOV R5,#00H //接收数据长度计数器
MOV R4,#00H //控制输出控制寄存器
MOV R0,#30H //数据存储地址
MOV R1,#30H //控制输出的数据缓存
CLR STFLAG //清起始标志位
CLR EDFLAG //清结束标志位
CLR TMFLAG //清时钟标志位
SETB PS //提高串口中断的优先级SETB TR1 // 打开定时器1;
SETB ES //打开串口中断允许位
SETB ET0 // 定时器0 中断允许位
SETB EA //打开全局中断允许位
///////////////// 等待接受命令//////////////////////// Main: JB STFLAG ,NODE3 //已经收到起始位
SJMP Main // 未起始继续等待
NODE3: JB EDFLAG,NODE4 // 已经收到结束位
SJMP Main // 未结束继续等待
NODE4: SETB TR0 // 打开定时器0;
NODE5: JB TMFLAG,OUTPUT
SJMP NODE5
/////////////////// 等待上位机传送数据并记录////////
Transfer: CLR ES
MOV A,SBUF
CJNE A,#0A5H,NODE0 // 检测到起始位
SETB STFLAG
SJMP JIEDIAN
NODE0: CJNE A,#05AH,NODE1 // 检测到结束位
SETB EDFLAG
MOV DPH,R5
MOV R4,DPH
clr ES //打开串口中断允许位
SJMP ret00
NODE1: MOV @R0,A // 既非起始码,又非结束码,则为数据INC R0
INC R5
MOV SBUF,#055H
JIEDIAN: CLR TI
CLR RI
SETB ES
ret00: RETI
TIMER0: CLR TR0
MOV TH0,#3CH
MOV TL0,#0B0H INC R6
CJNE R6,#20,RTN
SETB TMFLAG
MOV R6,#00H
RTN: SETB TR0
RETIOUTPUT: CLR TR0 clr TMFLAG MOV A,@R1 MOV P1,A INC R1 DJNZ R4,NODE4 MOV R1,#30H CLR TMFLAG
MOV DPH,R5
MOV R4,DPH
SJMP NODE4
RETI
END。

合集下载

单片机汇编 串口通信实验

单片机汇编  串口通信实验

一、实验项目名称串口通信实验二、实验内容现有两台单片机应用系统。

甲机发送内存中以TR_BUF为首地址的10个数据串,乙机把接收到的数据存入以RC_BUF为首地址的内存单元中。

设甲、乙两机的振荡频率为12MHz,串行口均工作在方式1下。

要求甲机用查询方式编程,乙机用中断方式编程。

三、实验原理图(纯软件部分实验报告可不要本部分)四、编程思路及算法分析流程图:五、程序清单甲机发送内存中以TR_BUF为首地址的10个数据串.org 0000hmov r2,#10mov r1,#tr_bufmov a,#0fehlp1: mov @r1,arl ainc r1djnz r2,lp1mov TMOD,#20Hmov th1,#0fdhmov tl1,#0fdhsetb tr1mov scon,#40hmov r0,#tr_bufmov r7,#100acall dy1slp: mov sbuf,@r0jnb ti,$clr tiinc r0djnz r7,lpsjmp $dy1s: mov r6,#200m1: mov r5,#0fahdjnz r5,$djnz R6,m1retEnd乙机把接收到的数据存入以RC_BUF为首地址的内存单元中org 0000hajmp mainorg 0023hajmp s20fworg 0030hmain: mov TMOD,#20Hmov th1,#0fdhmov tl1,#0fdhsetb tr1setb essetb eamov scon,#50hmov r0,#rc_bufmov r2,#10sjmp $s20fw: clr rimov @r0,sbufinc r0djnz r2,fanmov r3,#10mov r1,#rc_buflp1: mov a,@r1mov p1,aacall dy1sinc r1djnz r3,lp1fan: retidy1s: mov r6,#200m1: mov r5,#0fahdjnz r5,$djnz R6,m1retend六、实验仿真结果要有适当的图文解释。

51单片机的串口通信程序(C语言)

51单片机的串口通信程序(C语言)

51单片机的串口通信程序(C语言) 51单片机的串口通信程序(C语言)在嵌入式系统中,串口通信是一种常见的数据传输方式,也是单片机与外部设备进行通信的重要手段之一。

本文将介绍使用C语言编写51单片机的串口通信程序。

1. 硬件准备在开始编写串口通信程序之前,需要准备好相应的硬件设备。

首先,我们需要一块51单片机开发板,内置了串口通信功能。

另外,我们还需要连接一个与单片机通信的外部设备,例如计算机或其他单片机。

2. 引入头文件在C语言中,我们需要引入相应的头文件来使用串口通信相关的函数。

在51单片机中,我们需要引入reg51.h头文件,以便使用单片机的寄存器操作相关函数。

同时,我们还需要引入头文件来定义串口通信的相关寄存器。

3. 配置串口参数在使用串口通信之前,我们需要配置串口的参数,例如波特率、数据位、停止位等。

这些参数的配置需要根据实际需要进行调整。

在51单片机中,我们可以通过写入相应的寄存器来配置串口参数。

4. 初始化串口在配置完串口参数之后,我们需要初始化串口,以便开始进行数据的发送和接收。

初始化串口的过程包括打开串口、设置中断等。

5. 数据发送在串口通信中,数据的发送通常分为两种方式:阻塞发送和非阻塞发送。

阻塞发送是指程序在发送完数据之后才会继续执行下面的代码,而非阻塞发送是指程序在发送数据的同时可以继续执行其他代码。

6. 数据接收数据的接收与数据的发送类似,同样有阻塞接收和非阻塞接收两种方式。

在接收数据时,需要不断地检测是否有数据到达,并及时进行处理。

7. 中断处理在串口通信中,中断是一种常见的处理方式。

通过使用中断,可以及时地响应串口数据的到达或者发送完成等事件,提高程序的处理效率。

8. 串口通信实例下面是一个简单的串口通信实例,用于在51单片机与计算机之间进行数据的传输。

```c#include <reg51.h>#include <stdio.h>#define BAUDRATE 9600#define FOSC 11059200void UART_init(){TMOD = 0x20; // 设置定时器1为模式2SCON = 0x50; // 设置串口为模式1,允许接收TH1 = 256 - FOSC / 12 / 32 / BAUDRATE; // 计算波特率定时器重载值TR1 = 1; // 启动定时器1EA = 1; // 允许中断ES = 1; // 允许串口中断}void UART_send_byte(unsigned char byte){SBUF = byte;while (!TI); // 等待发送完成TI = 0; // 清除发送完成标志位}unsigned char UART_receive_byte(){while (!RI); // 等待接收完成RI = 0; // 清除接收完成标志位return SBUF;}void UART_send_string(char *s){while (*s){UART_send_byte(*s);s++;}}void main(){UART_init();UART_send_string("Hello, World!"); while (1){unsigned char data = UART_receive_byte();// 对接收到的数据进行处理}}```总结:通过以上步骤,我们可以编写出简单的51单片机串口通信程序。

51单片机串口通信程序。。含详细例子

51单片机串口通信程序。。含详细例子
while(RI == 0); RI = 0; c = SBUF; // 从缓冲区中把接收的字符放入 c 中 SBUF = c; // 要发送的字符放入缓冲区 while(TI == 0); TI = 0; } }
4.//////////////// /////////////////////////////////////////////////////////
pw.fpReadSign(); SendData();//通知上位机,送出读出器件特征字 }
void Erase()//擦除器件 {
pw.fpErase(); SendData();//通知上位机,擦除了器件 }
void Write()//写器件 {
BYTE n; pw.fpInitPro();//编程前的准备工作 SendData();//回应上位机表示进入写器件状态,
{
unsigned char c;
TMOD = 0x20; // 定时器 1 工作于 8 位自动重载模式, 用于产生波特率
TH1=(unsigned char)(256 - (XTAL / (32L * 12L * baudrate)));
TL1=(unsigned char)(256 - (XTAL / (32L * 12L * baudrate))); SCON = 0x50; PCON = 0x00; TR1 = 1; IE = 0x00; // 禁止任何中断 while(1) {
///////////////////////////////////////////////////////////////////////////////// //所支持的 FID,请在这里继续添加
///////////////////////////////////////////////////////////////////////////// extern void PreparePro00();//FID=00:AT89C51 编程器 extern void PreparePro01();//FID=01:AT89C2051 编程器 extern void PreparePro02();//FID=02:AT89S51 编程器

C51编写 串口通信程序

C51编写 串口通信程序

异步通信的数据格式 :
一个字符帧 空 闲 起 始 位 数据位 校 验 位 停 止 位 空 闲
下一字符 起始位
LSB
MSB
异步通信的特点:不要求收发双方时钟的 严格一致,实现容易,设备开销较小,但 每个字符要附加2~3位用于起止位,各帧 之间还有间隔,因此传输效率不高。
2、同步通信
同步通信时要建立发送方时钟对接收方时钟的直接控制, 使双方达到完全同步。此时,传输数据的位之间的距离均 为“位间隔”的整数倍,同时传送的字符间不留间隙,即 保持位同步关系,也保持字符同步关系。发送方对接收方 的同步可以通过两种方法实现。
串行通信是将数据字节分成一位一位的形 式在一条传输线上逐个地传送。
接 收 设 备
D0 D7
8位顺次传送
发 送 设 备
串行通信的特点:传输线少,长距离传送时 成本低,且可以利用电话网等现成的设备, 但数据的传送控制比并行通信复杂。
7.1.1 串行通信的基本概念
一、异步通信与同步通信
1、异步通信 异步通信是指通信的发送与接收设备使用各自的时钟 控制数据的发送和接收过程。为使双方的收发协调,要求 发送和接收设备的时钟尽可能一致。
面向位的同步格式 :
8位 01111110 8位 地址场 8位 控制场 ≥0位 信息场 16位 校验场 8位 01111110
此时,将数据块看作数据流,并用序列01111110作为开始 和结束标志。为了避免在数据流中出现序列01111110时引起 的混乱,发送方总是在其发送的数据流中每出现5个连续的1 就插入一个附加的0;接收方则每检测到5个连续的1并且其后 有一个0时,就删除该0。 典型的面向位的同步协议如ISO的高级数据链路控制规程 HDLC和IBM的同步数据链路控制规程SDLC。 同步通信的特点是以特定的位组合“01111110”作为帧的 开始和结束标志,所传输的一帧数据可以是任意位。所以传 输的效率较高,但实现的硬件设备比异步通信复杂。

80C51单片机串口通信(含原程序)

80C51单片机串口通信(含原程序)
transbyte(buf);
buf=NUMCODETAB[num];
transbyte(buf);
buf=NUMCODETAB[num];
transbyte(buf);
buf=NUMCODETAB[num];
transbyte(buf);
buf=NUMCODETAB[num];
transbyte(buf);
void send(uchar dat)
{
SBUF=dat;
while(TI==0);
TI=0;
}
void delay(void)
{
uchar x,y;
for(x=0;x<220;x++)
for(y=0;y<250;Leabharlann ++);}
void main(void)
{
uchar i;
TMOD=0x20;
SCON=0x40;
并将这些代码用发光二极管在发送端显示(流水灯效果)。
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code tab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
sbit DIPIN = P1^3;
uint num;
uchar receive (void)
{
uchar dat;
while(RI==0);
RI=0;
dat=SBUF;
SBUF=dat;
return dat;
}
unsigned char code NUMCODETAB[]={0xFC,0x60,0xDA,0xF2, //数字0,1,2,3

(完整word版)51单片机之间的通信程序

(完整word版)51单片机之间的通信程序

以下程序通过实践检测完全可以放心使用不过注意硬件电路的连接单片机的串口通信主要理解SCON的状态控制寄存器的用法波特率的设定1 两个单片机一个为主机一个为从机,又主机控制从机的LED灯得简单程序入手注意硬件的连线将单片机串口的第二引脚与另一单片机串口的第三引脚相连同时另一单片机的第二串口引脚也与前一个单片机的第三引脚相连主机部分的程序设计//主机程序发送控制信号的#include〈reg52。

h〉#define uchar unsigned char#define uint unsigned intsbit KEY=P3^0;//按键sbit ledA=P1^1;//定义了三个灯来指示发送的字符是什么sbit ledB=P1^3;sbit ledC=P1^5;sbit ledstop=P1^6;uchar KEY_number=0;//按键计数void delay(unsigned int z)//延时函数{unsigned int x,y;for(x=z;x〉0;x—-)for(y=240;y〉0;y-—);}void init(){SCON=0x40;//主机串口工作方式1 REN=0 之允许发送不能接收TMOD=0x20;PCON=0x00;TH1=0xfd;TL1=0xfd;T1=RI=0;//必须要做来保证可以顺利进入终端TR1=1;EA=1;ES=1;}void Put_charToSBUF(uchar c) //把一个字符写入SBUF{SBUF=c;while(TI==0); //巧妙的等待处理等带发送完毕TI=0;}void main(){init();while(1){if(KEY==0){delay(5);if(KEY==0){ P1=0xff;while(!KEY);KEY_number++;if(KEY_number==4) KEY_number=0;}}switch (KEY_number){case 0: ledstop=0; break;case 1: ledA=~ledA; Put_charToSBUF(’A’);break;case 2: ledB=~ledB; Put_charToSBUF('B'); break;case 3: ledC=~ledC; Put_charToSBUF('C'); break;}delay(100) ;}}从机部分的程序#include<reg52.h>#define uchar unsigned char#define uint unsigned intsbit d1=P1^0;sbit d2=P1^1;sbit d3=P1^2;void delay(unsigned int z)//延时函数{unsigned int x,y;for(x=z;x〉0;x—-)for(y=240;y〉0;y—-);}void init(){SCON=0x50;//允许串口接收 TMOD=0x20;PCON=0x00;TH1=0xfd;TL1=0xfd;RI=0;TR1=1;EA=1;ES=1;}void main(){init();while(1){if(RI){RI=0;switch(SBUF){case 'A’: d1=~d1;break;case 'B’: d1=1; d2=~d2;break;case ’C’: d2=1; d3=~d3; break;}}else d1=d2=d3=1;delay(100) ;}}上面的程序是一主一从单片机之间也可以建立一个双向的通信过程//甲机程序发送控制信号的同时接收乙机发来的串口信息并//且显示在数码管上#include〈reg52。

51单片机串口通信程序。。含详细例子


{ P3_4=0; P3_3=1;
} void RstPro()//编程器复位 {
pw.fpProOver();//直接编程结束 SendData();//通知上位机,表示编程器就绪,可以直接用此函数因为协议号(ComBuf[0])还没被修改,下同 }
void ReadSign()//读特征字 {
} void serial () interrupt 4 using 3 //串口接收中断函数 {
if (RI) { RI = 0 ; ch=SBUF; read_flag= 1 ; //就置位取数标志 }
} main()
{ init_serialcom(); //初始化串口 while ( 1 ) { if (read_flag) //如果取数标志已置位,就将读到的数从串口发出 { read_flag= 0 ; //取数标志清 0 send_char_com(ch); } }
while(RI == 0); RI = 0; c = SBUF; // 从缓冲区中把接收的字符放入 c 中 SBUF = c; // 要发送的字符放入缓冲区 while(TI == 0); TI = 0; } }
4.//////////////// /////////////////////////////////////////////////////////
SendData(); } else break;//等待回应失败 } pw.fpProOver();//操作结束设置为运行状态 ComBuf[0]=0;//通知上位机编程器进入就绪状态 SendData(); }
void Lock()//写锁定位
{
pw.fpLock();
SendData();

51单片机与PC串口通信程序及硬件电路图

51单片机与PC串口通信程序及硬件电路图#include <reg51.h>#define BUFFERLEGTH 10//----------------------------------------------------------------- void UART_init(); //串口初始化函数void COM_send(void); //串口发送函数char str[20];char j;//-------------------------------------------------------------------void main(void){unsigned char i;UART_init();j=0; //初始化串口for(i = 0;i < 10 ;i++){COM_send(); //首先发送一次数据作为测试用};while(1);}//-------------------------------------------------------------//--------------------------------------------------------------------------------------------------// 函数名称: UART_init()串口初始化函数// 函数功能:在系统时钟为11.059MHZ时,设定串口波特率为9600bit/s// 串口接收中断允许,发送中断禁止//--------------------------------------------------------------------------------------------------void UART_init(){//初始化串行口和波特率发生器SCON =0x50; //选择串口工作方式1,打开接收允许TMOD =0x20; //定时器1工作在方式2,定时器0工作在方式1 TH1 =0xfA; //实现波特率9600(系统时钟11.0592MHZ)PCON = 0x80;TR1 =1; //启动定时器T1ET1 =0;ES=1; //允许串行口中断PS=1; //设计串行口中断优先级EA =1; //单片机中断允许}//------------------------------------------------------------void COM_send(void){unsigned char point = 0;for(point=0;str[point]!='\0';point++) //连续发送二十位数据 //把缓存区的数据都发送到串口 {SBUF=str[point];while(!TI);TI=0;//str[point]='\0';}}//--------------------------------------------------------------//--------------------------------------------------------------------------------------------------// 函数名称: com_interrup()串口接收中断处理函数// 函数功能:接收包括起始位'S'在内的十位数据到数据缓冲区//--------------------------------------------------------------------------------------------------void com_interrupt(void) interrupt 4 using 3{unsigned char RECEIVR_buffer;bit flag=1;if(RI) //处理接收中断{RI=0; //清除中断标志位RECEIVR_buffer=SBUF; //接收串口数据str[j]=SBUF;if (RECEIVR_buffer == '$'){ ES=0;str[j]='\0';SCON =0x40; //接收不允许COM_send(); //发送数据ES=1;j=0;flag=0;SCON=0x50; //接收允许}if(flag)j++;}}。

[指南]51单片机串口通信程序(方式2)

51单片机串口通信程序(方式2)//应网要求而写//给89c2051单片机编程,用管脚控制其状态输出,即管脚1为高电平时单片机串行口输出十六进制“BBBB0000”的脉冲信号,如果是低电平时再由其他的管脚控制其输出“CCCC5555”和“AAAA1111”。

// 要求:1、单片机没隔40ms发送一组数据// 2、串行口工作是在模式2下进行输出的// 3、波特率是93.75k//此程序写2011年6月9日//特别声明,此程序还未在硬件上测试,请网友们帮忙测试,多提宝贵意见#include <reg51.h>sbit key1 = P1^0;sbit key2 = P1^1;sbit key3 = P1^2;code unsigned char senddata1[4 ]={0xBB,0xBB,0x00,0x00 };code unsigned char senddata2[4]={0xCC,0xCC,0x00,0x00 };code unsigned char senddata3[4 ]={0xAA,0xAA,0x00,0x00 };bit flagcomsend; //串口发送标志,void R_S_Byte(unsigned char R_Byte) //串发送程序{SBUF = R_Byte;while( TI == 0 );TI = 0;}void comsend(unsigned char *TxRxBuffer){unsigned char i;//ES=0;for(i=0;i<4;i++) // 只发送了实际的数据{R_S_Byte(TxRxBuffer[i]);}//ES=1;}void StartUARTT0( void ){ //波特率93.75晶振 6M 串口方式2TMOD = 0x01;SCON = 0x80; //串口方式2,不允许接收TH0 = 0xB1;// 定时器0,方式1,定时40MSTL0 = 0xE0;PCON = 0x00; //波特率不加倍ET0 = 1; PT0 = 1;TR0 = 1;EA = 1;ES = 0;}void intt0( void ) interrupt 1 using 1{ET0 = 0;TH0 = 0xB1;// 定时器0,方式1,定时40MS TL0 = 0xE0;flagcomsend=1; //串口发送标志ET0 = 1; TF0 = 0;}void main(){StartUARTT0( );TR0 = 0;while(1){key1 = 1; key2 = 1; key3 = 1;if( key1||key2||key3){TR0 = 1;}else{TR0 = 0;}if(flagcomsend){flagcomsend = 0;if( key1&&(!key2)&&(!key3)){comsend(senddata1 );}else if( key2&&(!key1)&&(!key3)) {comsend(senddata2 );}else if( key3&&(!key2)&&(!key1)) {comsend(senddata3 );}else{TR0 = 0;}}}}。

51单片机汇编语言教程:22课单片机串行口通信程序设计

51单片机汇编语言教程:第22课-单片机串行口通信程序设计.mov SCON,#50h;Standard UART settingsMOV R0,#0AAH;准备送出的数SETB REN;允许接收SETB TR1;T1开始工作WAIT:MOV A,R0CPL AMOV R0,AMOV SBUF,ALCALL DELAYJBC TI,WAIT1;如果TI等于1,则清TI并转WAIT1AJMP WAITWAIT1:JBC RI,READ;如果RI等于1,则清RI并转READAJMP WAIT1READ:MOV A,SBUF;将取得的数送P1口MOV P1,ALJMP WAITDELAY:;延时子程序MOV R7,#0ffHDJNZ R7,$RETEND将程序编译通过,写入芯片,插入实验板,用通读电缆将实验板与主机的串行口相连就能实验了。

上面的程序功能很简单,就是每隔一段时间向主机轮流送数55H和AAH,并把主机送去的数送到P1口。

能在PC端用串行口精灵来做实验。

串行口精灵在我主页上有下载。

运行串行口精灵后,按主界面上的“设置参数”按钮进入“设置参数”对话框,按下面的参数进行设置。

注意,我的机器上用的是串行口2,如果你不是串行口2,请自行更改串行口的设置。

设置完后,按确定返回主界面,注意右边有一个下拉列表,应当选中“按16进制”。

然后按“开始发送”、“开始接收”就能了。

按此设置,实验板上应当有两只灯亮,6只灯灭。

大家能自行更改设置参数中的发送字符如55,00,FF等等,观察灯的亮灭,并分析原因,也能在主界面上更改下拉列表中的“按16进制”为“按10进制”或“按ASCII字符”来观察现象,并仔细分析。

这对于大家理解16进制、10进制、ASCII字符也是很有好处的。

程序本身很简单,又有注释,这里就不详加说明了。

三、上述程序的中断版本org0000HAJMP STARTorg0023hAJMP SERIAL;ORG30HSTART:mov SP,#5fh;mov TMOD,#20h;T1:工作模式2mov PCON,#80h;SMOD=1mov TH1,#0FDH;初始化波特率(参见表)mov SCON,#50h;Standard UART settingsMOV R0,#0AAH;准备送出的数SETB REN;允许接收SETB TR1;T1开始工作SETB EA;开总中断SETB ES;开串行口中断SJMP$SERIAL:MOV A,SBUFMOV P1,ACLR RIRETIEND本程序没有写入发送程序,大家能自行添加。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档