基于proteus的51单片机仿真实例六十二、串口发送和接收字符串实例
51单片机串口通信及通信实例
![51单片机串口通信及通信实例](https://img.taocdn.com/s3/m/7afbb69d195f312b3069a537.png)
51单片机串口通信及通信实例串口通信(SerialCommunicaTIons)的概念非常简单,串口按位(bit)发送和接收字节。
尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。
它很简单并且能够实现远距离通信。
比如IEEE488定义并行通行状态时,规定设备线总长不得超过20米,并且任意两个设备间的长度不得超过2米;而对于串口而言,长度可达1200米。
典型地,串口用于ASCII 码字符的传输。
通信使用3根线完成,分别是地线、发送、接收。
由于串口通信是异步的,端口能够在一根线上发送数据同时在另一根线上接收数据。
其他线用于握手,但不是必须的。
串口通信最重要的参数是波特率、数据位、停止位和奇偶校验。
对于两个进行通信的端口,这些参数必须匹配。
a,波特率:这是一个衡量符号传输速率的参数。
指的是信号被调制以后在单位时间内的变化,即单位时间内载波参数变化的次数,如每秒钟传送240个字符,而每个字符格式包含10位(1个起始位,1个停止位,8个数据位),这时的波特率为240Bd,比特率为10位*240个/秒=2400bps。
一般调制速率大于波特率,比如曼彻斯特编码)。
通常电话线的波特率为14400,28800和36600。
波特率可以远远大于这些值,但是波特率和距离成反比。
高波特率常常用于放置的很近的仪器间的通信,典型的例子就是GPIB设备的通信。
b,数据位:这是衡量通信中实际数据位的参数。
当计算机发送一个信息包,实际的数据往往不会是8位的,标准的值是6、7和8位。
如何设置取决于你想传送的信息。
比如,标准的ASCII码是0~127(7位)。
扩展的ASCII码是0~255(8位)。
如果数据使用简单的文本(标准ASCII码),那么每个数据包使用7位数据。
每个包是指一个字节,包括开始/停止位,数据位和奇偶校验位。
由于实际数据位取决于通信协议的选取,术语“包”指任何通信的情况。
proteus与keil Cx51的单片机仿真(串行通信口)
![proteus与keil Cx51的单片机仿真(串行通信口)](https://img.taocdn.com/s3/m/1e205c01e45c3b3567ec8b9e.png)
proteus 与keil Cx51 的单片机仿真(串行通信口)单片机串行口工作于方式0,通过74LS164 实现串并转换,来控制共阳极数码管的显示,当按下K01 按钮显示2010,按下K02 键显示1987,按下K03键显示0606,按下K04 键显示1988,按下K05 键显示1224。
其中数字显示可由自己设定.电路图:C 程序:#include#include#include#define uchar unsigned char//宏定义sbit P1_1=P1;sb it P1_2=P1 ;sbit P1_3=P1;sb it P1_4=P1;sb it P1_5=P1 ;sbit P2_0=P2;uchar code discode[]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09};//串行方式下共阳极数码管段码表0~9unsigned char leddis[4]={0,1,2,3};//显存,有几个数码管进行定义void display(void)//数码管显示函数{unsigned char count;//数码管个数P2_0=0;//P2.0 引脚输出清零信号,对74LS164 清零_nop_();_nop_();//延时,保证清零完成P2_0=1;//结束对74LS164 清零for(count=4;count>0;count--){SBUF=discode[leddis[count-1]];while(TI==0);TI=0;}}void main(){SCON=0x00;//设定UART 的工作方式为方式0leddis[0]=0;leddis[1]=1;leddis[2]=2;leddis[3]=3;//显示内容初始化display();//显示函数while(1){if(P1_1==0)//K01 按下,即P1_1被按下,显示2010{leddis[0]=2;leddis[1]=0;leddis[2]=1;leddis[3]=0;display();P1_1=1;}if(P1_2==0)//K02 按下,即P1_2 被按下,显示1987{leddis[0]=1;leddis[1]=9;leddis[2]=8;leddis[3]=7;display();P1_2=1;}if(P1_3==0)//K03 按下,即P1_3 被按下,显示0606{leddis[0]=0;leddis[1]=6;leddis[2]=0;leddis[3]=6;display();P1_3=1;}if(P1_4==0)//K04 按下,即P1_4 被按下,显示1988{leddis[0]=1;leddis[1]=9;leddis[2]=8;leddis[3]=8;display();P1_4=1;}if(P1_5==0)/ /K05 按下,即P1_5 被按下,显示1224{leddis[0]=1;leddis[1]=2;leddis[2]。
51串口发送字符串
![51串口发送字符串](https://img.taocdn.com/s3/m/94395809974bcf84b9d528ea81c758f5f61f29d7.png)
51串⼝发送字符串刚开始也是⼀直乱码,直到昨天我才解决了乱码的问题,原来这⼀切都是晶振频率惹的祸,今天开始不会乱码了。
可以发送单个字符了。
但是⼜出现了⼀个新的问题,⼀个很长的字符串怎么办?很多⼈想,那好办啊,下⾯这个程序就可以:/*发送⼀个字符串*/void send_string(uchar *p){while(*p!= '\0'){send_byte(*p);p++;}}这样不就可以实现字符串的发送了吗?是的,没错,但是在send_byte()这个函数⾥⾯该怎么写?其实这个函数写不好很容易和中断函数冲突。
当然,你可以这样写:/*发送⼀个字符*/void send_byte(uchar by){SBUF = by;while(!TI);//等待发送完毕TI = 0;}如果你这样写了,那么你要么不要打开串⼝中断,要么就在串⼝中断⾥⾯什么都不写(如果你只是发送,不接收的话),这⾥只是讲发送,接收是⼀个道理的。
如果你在中断函数⾥⾯写了下⾯这样的程序:void uart_interrupt() interrupt 4{if(RI==1)RI = 0;if(TI==1)TI = 0;}那么,恭喜你,你不会在电脑端收到任何数据的(不对,你能收到字符串的第⼀个字符)。
原因很简单:当⼀个字符发送/接收完毕的时候,发送/接收标志位TI/RI会⾃动置1,如果你在初始化⾥⾯打开了串⼝中断的话,程序⼀定进⼊中断函数⾥⾯去执⾏:if(TI==1)TI = 0;⽽不是先执⾏while(!TI);//等待发送完毕,所以,在中断⾥⾯TI⼜置了0,然后回到while(!TI);这样,就陷⼊了⼀个死循环。
你的程序就卡在这⾥了。
总结:当你发现⽆法发送字符串的时候,⾸先检查⾃⼰的⽐特率是否对,就是检查能不能发送单个字符,如果单个字符发送没有问题,那么⼀定能发送字符串。
接下来检查你的初始化程序中有没有打开串⼝中断。
如果打开,看中断函数有没有和单个字符发送函数冲突。
基于Proteus虚拟终端51单片机仿真:串口发送和接收字符串
![基于Proteus虚拟终端51单片机仿真:串口发送和接收字符串](https://img.taocdn.com/s3/m/833e1468ccbff121dd3683e0.png)
先上图:实验程序:/********************************************************************************* * 【编写时间】: 2016年6月12日* 【作者】:小瓶子* 【实验平台】: Proteus 7* 【内部晶振】: 11.0592mhz* 【主控芯片】: STC89C51* 【编译环境】: Keil μVisio4* 【程序功能】:利用虚拟中断实现串口数据的发送和接收**********************************************************************************/#include <reg51.h>#define uint unsigned int#define uchar unsigned char//毫秒级延时函数void delay(uint x){uchar i;while(x--){for(i = 0;i < 120;i++);}}//字符发送函数void putchar(uchar data1){SBUF = data1; //将待发送的字符送入发送缓冲器while(!TI); //等待发送完成TI = 0; //发送中断标志请0}//字符串发送函数void putstring(uchar *dat){while(*dat != '\0') //判断字符串是否发送完毕{putchar(*dat); //发送单个字符dat++; //字符地址加1,指向先下一个字符 delay(5);}}//串口初始化函数void serial_init(){uchar c = 0;SCON = 0x50; //串口方式1 ,允许接收TMOD = 0x20; //T1工作于方式2PCON = 0x00; //波特率不倍增TL1 = 0xfd;TH1 = 0xfd; // 波特率设置为9600EA = 1; //开总中断ES = 1; //开串口接收中断}//主函数void main(){serial_init(); //串口初始化TR1 = 1; //定时器开启delay(200);putstring("Receiving from 8051...\r\n"); //串口向终端发送字符串,结尾处回车换行putstring("----------------------\r\n");delay(50);while(1);}//串口中断void revdata() interrupt 4{uchar temp;if(RI == 0) return; //如果没有接收中断标志,退出中断ES = 0; //关闭串口中断RI = 0; //清串行中断标志位temp = SBUF; //接收缓冲器中的字符putchar(temp); //将接收的字符发送出去ES = 1; //开启串口中断}仿真:。
51单片机串口通信连续发送接收字节
![51单片机串口通信连续发送接收字节](https://img.taocdn.com/s3/m/4199656b326c1eb91a37f111f18583d048640f42.png)
51单片机串口通信连续发送接收字节51单片机串口通信连续发送接收字节当使用单片机串口通信,连续发送字节时,如何处理呢?使用串口中断接收发送字节,中断内的程序尽可能简单,因为考虑到占用时间。
本文以连续发送4个字节为例,给出例程如下所示:本例程使用的单片机型号为:IAP15W4K58S//工作频率为11.0592MHz#include "reg51.h"#include "intrins.h"typedef unsigned char BYTE;typedef unsigned int WORD;#define FOSC 11059200L //系统频率//#define BAUD 115200 //#define BAUD 9600 //定义串口波特率#define Num_byte 4 //接收数据4个字节BYTE Data_temp[Num_byte]={0,0,0,0};sfr P0M1 = 0x93;sfr P0M0 = 0x94;sfr P1M1 = 0x91;sfr P1M0 = 0x92;sfr P2M1 = 0x95;sfr P2M0 = 0x96;sfr P3M1 = 0xb1;sfr P3M0 = 0xb2;sfr P4M1 = 0xb3;sfr P4M0 = 0xb4;sfr P5M1 = 0xC9;sfr P5M0 = 0xCA;sfr P6M1 = 0xCB;sfr P6M0 = 0xCC;sfr P7M0 = 0xE2;sfr AUXR = 0x8e; //辅助寄存器sfr T2H = 0xd6; //定时器2高8位sfr T2L = 0xd7; //定时器2低8位sfr P_SW1 = 0xA2; //外设功能切换寄存器1sbit LED1=P1^1;sbit LED2=P1^2;bit busy=0; //定义是否接收完4个字节BYTE num=0; //记录4个字节的数据void SendData(BYTE dat);void SendString(char *s);BYTE read_Byte();void delay();void main(){P0M0 = 0x00;P0M1 = 0x00;P1M0 = 0x00;P1M1 = 0x00;P2M0 = 0x00;P2M1 = 0x00;P3M0 = 0x00;P3M1 = 0x00;P4M0 = 0x00;P4M1 = 0x00;P5M0 = 0x00;P5M1 = 0x00;P6M0 = 0x00;P7M0 = 0x00;P7M1 = 0x00;P_SW1 &= 0x3F; //(P3.0/RxD, P3.1/TxD)SCON = 0x50; //8位可变波特率,允许接收T2L = (65536 - (FOSC/4/BAUD)); //设置波特率重装值T2H = (65536 - (FOSC/4/BAUD))>>8;AUXR = 0x15; //T2为1T模式, 并启动定时器2,选择定时器2为串口1的波特率发生器ES = 1; //使能串口1中断EA = 1;//SendString("STC15F2K60S2\r\nUart Test !\r\n");while(1){if(busy){ES=0;for(num=0;num<num_byte;num++)< p="">{SBUF= Data_temp[num]+0x05;while(!TI);TI=0;}num=0;ES=1;busy=0;}//SendData(3);//delay();//delay();;}/*----------------------------UART 中断服务程序-----------------------------*/void Uart() interrupt 4 using 1{ES=0;RI = 0; //清除RI位Data_temp[num++]= SBUF;if(num==Num_byte)busy=1;ES=1;}/*----------------------------发送串口数据----------------------------*/void SendData(BYTE dat){while (busy); //等待前面的数据发送完成SBUF = dat; //写数据到SBUF寄存器busy = 1;}/*----------------------------发送字符串----------------------------*/void SendString(char *s){while (*s) //检测字符串结束标志{SendData(*s); //发送当前字符s++;}//接收1个字节BYTE read_Byte(){ BYTE character; character = SBUF; return character;}void delay(){ BYTE i,j;for(i=220;i--;i>0)for(j=220;j--;j>0); }</num_byte;num++)<>。
(完整word版)proteus串口仿真
![(完整word版)proteus串口仿真](https://img.taocdn.com/s3/m/544d4a32cf84b9d528ea7aca.png)
利用“串口调试助手”等软件调试 PROTEUS 环境中 51单片机的串行通信在前面的博文“利用 PROTEUS 软件调试串口通信最简单实用的方法”中,做而论道介绍了利用 Virtual Terminal(虚拟终端)调试串口通信的方法。
但是 Virtual Terminal 有一定的局限性,只是适合于调试使用键盘输入少量数据的情况。
如果是需要利用 PC 机器的串行口,和其它的软件进行串行通信,Virtual Terminal 就办不到了。
下面,做而论道将介绍两种另外两种仿真调试串口通信的方法。
1、利用 COMPIM 组件在 PROTEUS 软件中,可以找到一个 COMPIM 组件,它的图形、以及默认属性可见下图:把 COMPIM 放在仿真电路图中,当仿真运行起来之后,送到 COMPIM 3 号引脚的串行数据,将会通过 PC 机的 COM1 串行口输出,如果在 PC 机的 COM1 串行口外接一条电缆,可将串行数据送到其它的硬件设备上。
同样道理,其它的硬件设备送到 PC 机的 COM1 的串行数据,也会在 COMPIM 的2号引脚出现,送到仿真电路里面。
COMPIM 组件内部,自带 RS-232 和 TTL 的电平转换功能,因此不需要再使用电平转换芯片。
利用 COMPIM,就可以用一台 PC 机,仿真带有串行口的单片机系统,通过外接的电缆,和另外一台 PC 机进行全双工的串行通信。
十分轻松的就实现了对远程测量、控制系统进行仿真调试。
2、利用 Virtual Serial Port Driver 软件上述的调试方法,可以说是很完备的了,但是还是必须在两个串行口之间连接一条串行通信电缆。
为了省去这条电缆,就应该看看虚拟串口软件。
Virtual Serial Port Driver 软件可以为 PC 机增加一些两两连接的虚拟串行口。
该软件运行起来如下图所示:在图中可以看到,COM1、COM2 就是“一对连接好虚拟串行口”;PC 机原来就有的实际的串行口,称为物理串行口,为 COM3。
基于Proteus的51单片机应用-单片机串口通信设计
![基于Proteus的51单片机应用-单片机串口通信设计](https://img.taocdn.com/s3/m/a08c1b016c175f0e7cd13714.png)
┊┊┊┊┊┊┊┊┊┊┊┊┊装┊┊┊┊┊订┊┊┊┊┊线┊┊┊┊┊┊┊┊┊┊┊┊┊1.绪论1.1课题背景及意义目前,单片机的发展速度大约每两、三年要更新一代,集成度增加一倍,功能翻一番。
其发展速度之快、应用范围之广已达到了惊人的地步,它已渗透到生产和生活的各个领域,应用非常广泛。
在汽车、通信、智能仪表、家用电器和军事设备的智能化以及实时过程控制等方面,单片机都扮演着非常重要的角色[1]。
因此单片机的设计开发具有广阔的前景。
所以,对于电气类学生而言,学习一种单片机的开发是十分必要的。
而51系列的单片机,随着半导体技术的发展,其处理速度更快,性能更优越,在工业控制领域上占据十分重要的地位,通过对51系列单片机的学习而掌握单片机开发的过程是一种不错的选择。
然而单片机是一门综合性、实践性都很强的学科,其学习涉及的实验环节比较多,硬件设备投入比较大,对于大多数人而言很难投入大笔资金去购买实验器件。
而且要进行硬件电路测试和调试,必须在电路板制作完成、元器件焊接完毕之后进行,但这些工作费时费力。
因此引入EDA软件仿真系统建立虚拟实验平台,不仅可以大大提高单片机的学习效率,而且大大减少硬件设备的资金投入,同时降低对硬件设备的维护工作。
EDA设计思路是:从元器件的选取到连接、直至电路的调试、分析和软件的编译,都是在计算机中完成,所用的工作都是虚拟的。
虽然现在的电路设计软件已经很多,诸如PROTEL、ORCAD、EWB 、Multisim等,不过这些软件之间的差别都不大:都有原理图和PCB制作功能,都能进行诸如频率响应,噪音分析等电路分析,主要用于模拟电路、数字电路、模数混合电路的性能仿真与分析,但对于单片机设计及软件编程,最重要的是两者的联调,这些软件都无法实现,所以造成了单片机系统设计周期长、设计费用高等缺点[2]。
新款的EDA软件Proteus解决了上述软件的不足,成为目前最好的一款单片机学习仿真软件。
Proteus 软件是由英国Lab Center Electronics 公司开发的EDA 工具软件。
Labview及Proteus软件环境下单片机串口通讯的仿真(全)
![Labview及Proteus软件环境下单片机串口通讯的仿真(全)](https://img.taocdn.com/s3/m/6927fb6f7e21af45b307a86d.png)
0 引言Labview是美国国家仪器公司(NI公司)推出的专为数据采集、仪器控制、数据分析与数据表达的图形化编程环境,它是一个开放的开发环境,具有PCI,GPIB,PXI,VXI,RS-232/485,USB等各种仪器通讯总线标准的所有功能函数,开发者可以利用这些函数与不同总线标准接口的数据采集硬件交互工作。
但现实中的数据采集卡很多是利用美国NI 公司提供的专用数据采集卡,价格较贵,不利于普及Labview软件测控的学习和应用。
Proteus软件支持51单片机,集程序编辑,原理图绘制和程序仿真于一体,它不仅能仿真单片机CPU的工作情况,也能仿真单片机外围电路,具有电路互动仿真功能,通过动态外设模型,如键盘、开关,发光二极管,数码管,液晶和传感器、电机等,可实时显示单片机系统输入、输出结果;另外还配置了多种虚拟仪器如示波器、逻辑分析仪等,方便对实验图形和数据的测量。
基于Labview和Proteus的特性,本文利用Proteus仿真下位机运行,而Labview 实现上位机对下位机运行的监控,两软件采用虚拟串口进行RS-232串口通讯,在纯软件环境下,完成基于Labview软件数据采集系统的组建。
这种方法成本低,效率高,可以方便地应用到测控技术的学习和设计中。
要实现上述方法,当然要正确安装Labview和Proteus软件,另外还必须安装NI_VISA串口通讯协议驱动和虚拟串口软件VSPD XP。
本文通过虚拟串口软件VSPD XP 模拟出一对互联的虚拟串口,分别为COM3和COM4,并且把COM3配置给Proteus环境下的单片机串口终端,把COM4配置给Labview 作为串口资源[1]。
本文通过一个上位机监控下位机走马灯电路的实验,来介绍这种Labview及Proteus 软件环境下单片机串口通讯的仿真方法。
1 基于Labview的上位机信号处理和显示软件设计Labview虚拟仪器程序由前面板和框图程序组成,前面板是人机交互的界面,界面上有用户输入和显示输出两类控件;框图程序则是用户编制的程序源代码,以定义和控制在前面板上的控件输入和输出功能。
用proteus里的单片机跟pc的串口调试工具进行串口仿真使用说明
![用proteus里的单片机跟pc的串口调试工具进行串口仿真使用说明](https://img.taocdn.com/s3/m/c457ac200722192e4536f64d.png)
用proteus里的单片机跟pc的串口调试工具进行串口仿真
虚拟串口是用说明
安装后你会看到如下画面:
上面为你实际的物理串行口,下面是虚拟的物理串行口。
下面我们来增加一对虚拟串行口。
因为一般的电脑最多为两个串行口,在这个画面上,我们设置first为com3,second为com4,点击add pair就可以增加一对虚拟串口(如下图所示)。
这两对端口是通过这个软件物理连接的,并且是rs232电平连接。
这样我们就完成里串口的设置,可以把此软件关闭,这两个端口将会一直存在于你的电脑中,下次直接使用就可以了。
Protus中的串口设置
仿真电气原理图请打开本例的仿真文件:
下面我们对串口进行设置和邦定:
在proteus右键单击上面的图选定,然后左键单击此元件打开它
的属性对话框。
如下图所示:
设置蓝色框内的参数,为你实际的参数,其中红色圈内设置为你要邦定的串口,本例邦定为com4,必须为com3和com4中的一个。
下面就是对串口调试工具的设置了,设置如下:
因本例proteus用了com3,那么串口调试工具这里就要邦定为com4了,并且设置为16进制发送和显示,那么这样一切ok,开始吧。
点击proteus的播放键,切换到串口调试工具,哈哈受到数据了。
然后你再发送一些数据给单片机看看,哈哈,是不是很棒呢。
MCS51单片机串行口及其应用(基于Proteus仿真)
![MCS51单片机串行口及其应用(基于Proteus仿真)](https://img.taocdn.com/s3/m/582df8f4cfc789eb162dc809.png)
MCS-51单片机串行口及其应用基于Proteus仿真前言:本文详细介绍了MCS-51单片机串行口的工作原理、工作方式,并在后面通过两个例子(结合74LS164和74LS165芯片)来说明串行口的应用,所举例子包含proteus仿真电路图,源程序,程序注释详细清楚。
这有助于更好地理解与掌握串行口。
1、计算机通信概念:计算机通信是指将计算机技术与通信技术相结合,完成计算机与外部设备或计算机与计算机之间的信息交换。
可以分为两大类:并行通信与串行通信。
在多微机系统以及现代测控系统中信息的交换多采用串行通信方式。
2、并行通信:并行通信通常是将数据字节的各位用多条数据线同时进行传送。
并行通信控制简单、传输速度快;由于传输线较多,长距离传送时成本高且接收方的各位同时接收存在困难。
如下图所示:3、串行通信:串行通信是将数据字节分成一位一位的形式在一条传输线上逐个地传送,每一位数据占据一个固定的时间长度。
串行通信的特点是传输线少,长距离传送时成本低,且可以利用电话网等现成的设备,但数据的传送控制比并行通信复杂。
串行通信又可以分同步通信和异步通信。
如下图所示:4、异步通信:异步通信是指通信的发送设备与接收设备使用各自的时钟控制数据的发送和接收过程。
为使双方的收发协调,要求发送和接收设备的时钟尽可能一致。
异步通信是以字符(构成的帧)为单位进行传输,字符与字符之间的间隙(时间间隔)是任意的,但每个字符中的各位是以固定的时间传送的,即字符之间不一定有“位间隔”的整数倍的关系,但同一字符内的各位之间的距离均为“位间隔”的整数倍。
异步通信的数据格式:异步通信的特点:不要求收发双方时钟的严格一致,实现容易,设备开销较小,但每个字符要附加2~3位用于起止位,各帧之间还有间隔,因此传输效率不高。
5、同步通信:同步通信时要建立发送方时钟对接收方时钟的直接控制,使双方达到完全同步。
此时,传输数据的位之间的距离均为“位间隔”的整数倍,同时传送的字符间不留间隙,即保持位同步关系,也保持字符同步关系。
关于proteus仿真的串口问题
![关于proteus仿真的串口问题](https://img.taocdn.com/s3/m/a1793ca4dc3383c4bb4cf7ec4afe04a1b071b077.png)
关于proteus仿真的串⼝问题以下四幅图都是关于串⼝中断的问题,串⼝中断需要⼀个接收或者发送数据的触发。
图⼀:因为由串⼝⼩助⼿发送的数据达到了单⽚机串⼝,所以引起了串⼝的中断。
图⼆:图⼀的⼤图。
图三:因为由串⼝⼩助⼿发送的数据达到了virtual terminal,没有到达串⼝,所以没有引起串⼝的中断。
图四:图⼀和图三的综合,也不⾏main.c#include "os_cfg.h"#include "task0.h"#include "task1.h"#include "task2.h"#include "task3.h"void (* code task[])() = {task0,task1,task2,task3};void main(void){uchar i;os_timer0_init();os_timer1_init();EA = 1; //开总中断while(1){for(i=0;i<MAX_TASK;i++)if (task_delay[i]==0) {run(task[i]); break;} //任务优先级调度}}os_cfg.h#include "reg52.h"#include "macroandconst.h"#define TIME_PER_SEC 200 //定义任务时钟频率,200Hz#define CLOCK 22118400 //定义时钟晶振,单位Hz#define MAX_TASK 4 //定义任务数量extern unsigned char task_delay[MAX_TASK];extern void run(void (*ptask)());extern void os_timer0_init(void);extern void os_timer1_init(void);macroandconst.h#ifndef _MACRO_AND_CONST_H_#define _MACRO_AND_CONST_H_typedef unsigned int uint16;typedef unsigned int UINT;typedef unsigned int uint;typedef unsigned int UINT16; typedef unsigned int WORD; typedef unsigned int word; typedef int int16;typedef int INT16;typedef unsigned long uint32; typedef unsigned long UINT32; typedef unsigned long DWORD; typedef unsigned long dword; typedef long int32;typedef long INT32;typedef signed char int8; typedef signed char INT8; typedef unsigned char byte; typedef unsigned char BYTE; typedef unsigned char uchar; typedef unsigned char UINT8; typedef unsigned char uint8; typedef unsigned char BOOL;#endiftask0.h#ifndef _TASK0_H_#define _TASK0_H_extern void task0(unsigned int db); #endiftask1.h#ifndef _TASK1_H_#define _TASK1_H_#define ADC0804_DB P1 extern void task1(void);#endiftask2.h#ifndef _TASK2_H_#define _TASK2_H_extern void task2(void);#endiftask3.h#ifndef _TASK3_H_#define _TASK3_H_extern void task3(void);#endifos_c.c#include "os_cfg.h"#include "task1.h"uchar task_delay[MAX_TASK];uchar data_buffer;//定时器0初始化void os_timer0_init(void){uchar i;for(i=0;i<MAX_TASK;i++) task_delay[i]=0; //赋初值task_delay[0]=0,task_delay[1]=0,task_delay[2]=0,task_delay[3]=0 TMOD = (TMOD & 0XF0) | 0X01; //定时器0⼯作在模式1,16Bit定时器模式TH0 = (65536-CLOCK/TIME_PER_SEC/12) / 256; //CRY_OSC,TIME_PER_SEC在easycfg.h中配置TL0 = (65536-CLOCK/TIME_PER_SEC/12) % 256;TR0 =1;ET0 =1; //开启定时器和中断}//定时器1初始化void os_timer1_init(void){SCON = 0x50;//串⾏⼝⼯作⽅式1,REN=1允许接受串⾏数据PCON = 0; //电源控制寄存器 SMOD=0,波特率保持不变TMOD = 0x20; //定时器T1初始化,⼯作⽅式2TH1 = 0xFD; //产⽣波特率为9600bit/s的计数初值TL1 = 0xFD;TR1 = 1;ES = 1; //允许串⼝中断}// 系统OS定时中断服务void os_timer0(void) interrupt 1{uchar i;TH0 = (65536-CLOCK/TIME_PER_SEC/12) / 256; //CRY_OSC,TIME_PER_SEC在easycfg.h中配置TL0 = (65536-CLOCK/TIME_PER_SEC/12) % 256;for(i=0;i<MAX_TASK;i++) if(task_delay[i]) task_delay[i]--; //每节拍对任务延时变量减1 ,减⾄ 0 后,任务就绪。
基于51单片机的串口通信proteus仿真电路及代码
![基于51单片机的串口通信proteus仿真电路及代码](https://img.taocdn.com/s3/m/4eb64ec86137ee06eff918c2.png)
1};
void delay(uchar n) {
uchar x,y; for(x=n;x>0;x--) for(y=110;y>0;y--); }
uchar key_putdown() {
P1=0xf0; if(P1!=0xf0) {
delay(5); if(P1!=0xf0) {
return 1; } } else return 0; }
基于 51 单片机的串口通信 proteus 仿真电路 及代码(2014.10.27)
本电路采用晶振为 11.0592MHz,采用串口工作方式 1,波特 率为 9600Bps,双机通信,U1 将 4*4 矩阵键盘送来的 0~f 字 符先用一位共阴数码管显示出来,再通过 P3.0 和 P3.1 两个 引脚送到 U2,U2 再用一位共阴数码管显示出来。
P0=0x00; P0=table[n]; }
void main() {
SCON = 0x50; TMOD = 0x20; TH1 = 0xFD; TL1 = 0xFD; TR1 = 1; ES = 1; EA = 1;
//串口方式 1, 8-n-1, 允许接收. //T1 方式 2
//开中断.
P0=0x3f; while(1) {
if(key_putdown()) {
key_scan(); led_disp(key); send();
} } }
这是从机 U2 接收使用的代码:
#include<reg51.h> #define uchar unsigned #define uint unsigned
uchar
code
table[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x7 1};//7 段共阴数码管 0~f
51单片机串口通信连续发送接收字节
![51单片机串口通信连续发送接收字节](https://img.taocdn.com/s3/m/36a02f1428ea81c758f578e3.png)
51单片机串口通信连续发送接收字节当使用单片机串口通信,连续发送字节时,如何处理呢?使用串口中断接收发送字节,中断内的程序尽可能简单,因为考虑到占用时间。
本文以连续发送4个字节为例,给出例程如下所示:本例程使用的单片机型号为:IAP15W4K58S//工作频率为11.0592MHz#include "reg51.h"#include "intrins.h"typedef unsigned char BYTE;typedef unsigned int WORD;#define FOSC 11059200L //系统频率//#define BAUD 115200 //#define BAUD 9600 //定义串口波特率#define Num_byte 4 //接收数据4个字节BYTE Data_temp[Num_byte]={0,0,0,0};sfr P0M1 = 0x93;sfr P0M0 = 0x94;sfr P1M1 = 0x91;sfr P1M0 = 0x92;sfr P2M1 = 0x95;sfr P2M0 = 0x96;sfr P3M1 = 0xb1;sfr P3M0 = 0xb2;sfr P4M1 = 0xb3;sfr P4M0 = 0xb4;sfr P5M1 = 0xC9;sfr P5M0 = 0xCA;sfr P6M1 = 0xCB;sfr P6M0 = 0xCC;sfr P7M0 = 0xE2;sfr AUXR = 0x8e; //辅助寄存器sfr T2H = 0xd6; //定时器2高8位sfr T2L = 0xd7; //定时器2低8位sfr P_SW1 = 0xA2; //外设功能切换寄存器1sbit LED1=P1^1;sbit LED2=P1^2;bit busy=0; //定义是否接收完4个字节BYTE num=0; //记录4个字节的数据void SendData(BYTE dat);void SendString(char *s);BYTE read_Byte();void delay();void main(){P0M0 = 0x00;P0M1 = 0x00;P1M0 = 0x00;P1M1 = 0x00;P2M0 = 0x00;P2M1 = 0x00;P3M0 = 0x00;P3M1 = 0x00;P4M0 = 0x00;P4M1 = 0x00;P5M0 = 0x00;P5M1 = 0x00;P6M0 = 0x00;P7M0 = 0x00;P7M1 = 0x00;P_SW1 &= 0x3F; //(P3.0/RxD, P3.1/TxD)SCON = 0x50; //8位可变波特率,允许接收T2L = (65536 - (FOSC/4/BAUD)); //设置波特率重装值T2H = (65536 - (FOSC/4/BAUD))>>8;AUXR = 0x15; //T2为1T模式, 并启动定时器2,选择定时器2为串口1的波特率发生器ES = 1; //使能串口1中断EA = 1;//SendString("STC15F2K60S2\r\nUart Test !\r\n");while(1){if(busy){ES=0;for(num=0;num<Num_byte;num++){SBUF= Data_temp[num]+0x05;while(!TI);TI=0;}num=0;ES=1;busy=0;}//SendData(3);//delay();//delay();;}/*----------------------------UART 中断服务程序-----------------------------*/void Uart() interrupt 4 using 1{ES=0;RI = 0; //清除RI位Data_temp[num++]= SBUF;if(num==Num_byte)busy=1;ES=1;}/*----------------------------发送串口数据----------------------------*/void SendData(BYTE dat){while (busy); //等待前面的数据发送完成SBUF = dat; //写数据到SBUF寄存器busy = 1;}/*----------------------------发送字符串----------------------------*/void SendString(char *s){while (*s) //检测字符串结束标志{SendData(*s); //发送当前字符s++;}//接收1个字节BYTE read_Byte(){ BYTE character;character = SBUF;return character;}void delay(){ BYTE i,j;for(i=220;i--;i>0)for(j=220;j--;j>0); }。
重要51单片机和Proteus+虚拟串口调试
![重要51单片机和Proteus+虚拟串口调试](https://img.taocdn.com/s3/m/2207dc6248d7c1c708a14562.png)
51单片机和Proteus 虚拟串口调试(原创)解释下什么是51单片机和Proteus 虚拟串口调试,就是我们不需要实际的串口进行调试,只需要用protues加串口,在加串口调试助手就行了。
写好单片机串口程序加载到protuse 仿真里,这边串口调试助手就有反应。
比如我们的程序是单片机通过串口发送数据C到电脑,然后串口调试助手就回接收到C。
也可以有单片机接收数据串口调试助手发送数据。
这样不需要实际的串口也可以进行串口调试。
下面就让我们开始吧。
1.首先,需要一个虚拟串口软件Virtual Serial Ports Driver XP 5.0没有的就自己百度下吧。
2.其次是需要虚拟串口调试软件(串口调试小助手)文件和串口调试的例子。
3、设置虚拟串口(如图)开始界面(图1)图(1)然后按add pair 添加串口,添加了COM3和COM4,执行后如下图4、我们启动虚拟串口调试软件5、打开自己的仿真图。
这里要特别说明下单片机的RXD连接COMPIN的RXD,单片机的TXD连接COMPIM的RXD。
以我们的经验是RXD接TXD,TXD接RXD。
这里我就遇到麻烦了很调试了好久。
大家注意。
终端串口VTERM还是RXD接TXD,TXD接RXD。
6设置COMPIM的属性我们需要关心的是Physical port、Physical Baud Rate、Virtual Baud Rate 这三个栏目,请切记住它们的设定值,特别是波特率的值一定要与源文件(C程序)规定的值一定,比如我们这里是9600则就是因为源文件中设置的就是9600,在这里我们一定要选择好COM3,默认是COM1,一定要注意呀。
设置完成这个界面如上图。
7、现在我们又要返回到串口调试小助手。
我们需要把串口号和波特率设置,串口号一定记住在COMPIM中我们设置成了COM3,在这里要设置成COM4 才行,我试了COM3 是不出现的。
波特率一定要与COMPIM的波特率设置成一样的。
proteus仿真51单片机串口双机通讯
![proteus仿真51单片机串口双机通讯](https://img.taocdn.com/s3/m/356b5ef0f8c75fbfc77db290.png)
51单片机的串口双机通讯一、什么是串口串口是串行发送数据的接口,是相对于并口来说的,是一个广泛的定义。
本期我们说的串口指的是指UART或是RS232。
二、什么是波特率波特率是指串行端口每秒内可以传输的波特位数。
这里所指的波特率,如标准9600不是每秒种可以传送9600个字节,而是指每秒可以传送9600个二进位。
一个字节需要8个二进位,如用串口模式1来传输,那么加上起始位和停止位,每个数据字节就要占用10个二进位。
9600bps用模式1传输时,每秒传输的字节数是9600÷10=960个字节,发送一个字节大概需要1ms时间。
三、51单片机串口相关寄存器1、SCON串口控制寄存器(1)SM0和SM1:方式选择寄存器SM0 SM1 工作方式功能波特率0 0 方式0 8位同步移位寄存器晶振频率/ 120 1 方式1 10位UART 可变1 0 方式2 11位UART 晶振频率/32或晶振频率/64 1 1 方式3 11位UART 可变多机通信是工作在方式2和方式3的,所以SM2主要用于方式2和方式3,多级通信时,SM2=1,当SM2=1时,只有当接收到的数据帧第9位(RB8)为1时,单片机才把前八位数据放入自己的SBUF中,否则,将丢弃数据帧。
当SM2=0时,不论RB8的值是什么,都会把串口收到的数据放到SBUF中。
(3)REN:允许接收位REN用于控制是否允许接收数据,REN=1时,允许接收数据,REN=0时,拒绝接收数据。
(4)TB8:要发送的第9位数据位在方式2和方式3中,TB8是要作为数据帧第9位被发送出去的,在多机通信中,可用于判断当前数据帧的数据是地址还是数据,TB8=0为数据,TB8=1为地址。
(5)RB8:接收到的第9位数据位当单片机已经接收一帧数据帧时,会把数据帧中的第9位放到RB8中。
方式0不使用RB8,在方式2和方式3中,RB8为接收到的数据帧的第9位数据位。
(6)TI:发送中断标志位方式0中,不用管他。
51单片机串口收发设计
![51单片机串口收发设计](https://img.taocdn.com/s3/m/f1778b72b80d6c85ec3a87c24028915f804d84fb.png)
51单片机串口收发设计单片机(Microcontroller)是一种包含微处理器、存储器和输入/输出电路等功能于一个单个的集成电路芯片中的计算机系统。
它广泛应用于各种电子设备和嵌入式系统中。
串口(Serial Port)是一种通过串行通信方式传输数据的接口,通过向串口发送数据,可以与其他设备进行通信。
本文将介绍如何在51单片机中设计串口收发功能。
该设计可以实现单片机与其他设备之间的通信,包括发送数据和接收数据。
一、硬件设计1.串口芯片选择:首先,我们需要选择一个合适的串口芯片。
常见的串口芯片有MAX232、MAX485等。
这些芯片可以将单片机的电平转换为标准的串口电平,以便与其他设备进行通信。
2.连接方式:将串口芯片的发送端(Tx)连接到单片机的接收端(RX),将串口芯片的接收端(Rx)连接到单片机的发送端(TX)。
此外,还需要将单片机的地线(GND)连接到串口芯片的地线(GND)。
二、软件设计1.初始化串口:在程序开始时,需要初始化单片机的串口功能。
这可以通过配置相关的寄存器来实现。
具体的步骤包括设置波特率、数据位数、停止位数、校验位等。
2.发送数据:要发送数据,可以通过将数据写入单片机的发送缓冲区来实现。
当发送缓冲区为空时,可以将数据发送出去。
3.接收数据:要接收数据,可以通过读取单片机的接收缓冲区来实现。
当接收缓冲区非空时,可以读取数据。
4.中断服务程序:为了实现串口接收的实时性,可以使用中断机制。
当接收缓冲区非空时,触发中断,并执行中断服务程序。
在中断服务程序中,可以读取接收缓冲区的数据,并进行相应的处理。
三、代码示例下面是一个51单片机串口收发的简单示例代码:```#include <reg51.h>void UART_Init// 设置波特率为9600bpsTMOD=0x20;SCON=0x50;TH1=0xFD;TL1=0xFD;TR1=1;void UART_Send(unsigned char data)SBUF = data;while (!TI); //等待发送完成TI=0;unsigned char UART_Receivewhile (!RI); //等待接收完成RI=0;return SBUF;void mainUART_Init(;//发送数据UART_Send('H');UART_Send('e');UART_Send('l');UART_Send('l');UART_Send('o');//接收数据unsigned char data = UART_Receive(;```以上是一个简单的51单片机串口收发的设计。
基于Proteus的单片机串口通信仿真
![基于Proteus的单片机串口通信仿真](https://img.taocdn.com/s3/m/ac87dac6804d2b160a4ec04c.png)
Proteus班级:电信13-2姓名:段学亮邓成智崔俊杰邓石磊陈亮高金玉成绩:电子与信息工程学院信息与通信工程系1.设计要求1.1甲单片机向乙单片机机发送控制命令字符,甲单片机同时接收乙单片机机发送的数字,并显示在数码管上。
1.2乙机程序接收甲机发送字符并完成相应动作乙机接收到甲机发送的信号后,根据相应信号控制LED完成不同闪烁动作。
2. 仿真电路图串口通信仿真电路图如图一图1:串口通信仿真电路图3.串口通信C51程序/* 名称:甲机串口程序说明:甲机向乙机发送控制命令字符,甲机同时接收乙机发送的数字,并显示在数码管上。
*/#include<reg51.h>#define uchar unsigned char#define uint unsigned intsbit LED1=P1^0;sbit LED2=P1^3;sbit K1=P1^7;uchar Operation_No=0; //操作代码//数码管代码uchar code DSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//延时void DelayMS(uint ms){uchar i;while(ms--) for(i=0;i<120;i++);}//向串口发送字符void Putc_to_SerialPort(uchar c){SBUF=c;while(TI==0);TI=0;}//主程序void main(){LED1=LED2=1;P0=0x00;SCON=0x50; //串口模式1,允许接收TMOD=0x20; //T1工作模式2PCON=0x00; //波特率不倍增TH1=0xfd;TL1=0xfd;TI=RI=0;TR1=1;IE=0x90; //允许串口中断while(1){DelayMS(100);if(K1==0) //按下K1时选择操作代码0,1,2,3{while(K1==0);Operation_No=(Operation_No+1)%4;switch(Operation_No) //根据操作代码发送A/B/C或停止发送{case 0: Putc_to_SerialPort('X');LED1=LED2=1;break;case 1: Putc_to_SerialPort('A');LED1=~LED1;LED2=1;break;case 2: Putc_to_SerialPort('B');LED2=~LED2;LED1=1;break;case 3: Putc_to_SerialPort('C');LED1=~LED1;LED2=LED1;break;}}}}//甲机串口接收中断函数void Serial_INT() interrupt 4{if(RI){RI=0;if(SBUF>=0&&SBUF<=9) P0=DSY_CODE[SBUF];else P0=0x00;}}/* 名称:乙机程序接收甲机发送字符并完成相应动作说明:乙机接收到甲机发送的信号后,根据相应信号控制LED完成不同闪烁动作。
用Proteus学习51单片机之串口
![用Proteus学习51单片机之串口](https://img.taocdn.com/s3/m/f1bdb56df01dc281e53af0a4.png)
用Proteus学习51单片机之串口
串口的理论知识我就不记了,网上多的是。
51单片机的串口,有4种方式,分别为方式0,方式1,方式2,方式3.由于我的目的,使用串口主要是为了和电脑进行通信,所以主要使用方式1(事实上我也只学了方式1,其他方式等用到的时候再学吧)。
串口的方式1,其波特率与定时器T1相关,公式如下:
方式1波特率=(2SMOD×32)/(T1溢出率)
SMOD是一个寄存器,一般我们就取0了
T1的溢出率,即每秒T1计数满几次(相关知识可以看看前面笔记的记录) 正是因为如上的公式,所以设置TH1和TL1的初值,就能控制方式1
的波特率了。
不过一般波特率是固定的那么几种,像2400,4800和9600等,要用的时候查一下初值就成了。
由于用的是Proteus来模拟串口(我的笔记本电脑根本没串口),所以需要一个虚拟串口的软件。
推荐使用的是VisualSerialPortDriver,用起来非常的简单,直接点击AddPair就成了,会自动增加一对串口,模拟的时候,分别连接这两个端口就成。
添加好后,可以把这个程序关闭,端口仍旧可以使用。
要说一下的是,这软件是一个收费软件(能免费使用14天),所以,如果只想学习一下串口的话,我们就自私一下吧,不购买了,直接使用一个控制软件时间的软件(比如RunAsDate),让程序以为时间一直没变,就能一直试用了……
要试验一下Proteus是否可以进行串口连接,可以直接打开安装目录下
的\SAMPLES\InteractiveSimulation\COMPIMDemo,设置好波特率等参数后,
使用“串口调试助手”,向Proteus发送数据,看看能否接收到。
单片机C51串口接收(中断)和发送例程
![单片机C51串口接收(中断)和发送例程](https://img.taocdn.com/s3/m/6fa92a55178884868762caaedd3383c4bb4cb48d.png)
单片机C51串口接收(中断)和发送例程/gszhy/article/details/82088282012//这是一个单片机C51串口接收(中断)和发送例程,可以用来测试51单片机的中断接收//和查询发送,另外我觉得发送没有必要用中断,因为程序的开销是一样的#include <reg51.h>#include <string.h>#define INBUF_LEN 4//数据长度unsigned char inbuf1[INBUF_LEN];unsigned char checksum,count3;bit read_flag=0;void init_serialcomm(void){SCON = 0x50; //SCON: serail mode 1, 8-bit UART, enable ucvrTMOD |= 0x20; //TMOD: timer 1, mode 2, 8-bit reloadPCON |= 0x80; //SMOD=1;TH1 = 0xF4; //Baud:4800 fosc=11.0592MHzIE |= 0x90; //Enable Serial InterruptTR1 = 1; // timer 1 run// TI=1;}//向串口发送一个字符void send_char_com(unsigned char ch){SBUF=ch;while(TI==0);TI=0;}//向串口发送一个字符串,strlen为该字符串长度void send_string_com(unsigned char *str,unsigned int strlen) {unsigned int k=0;do{send_char_com(*(str + k));k++;} while(k < strlen);}//串口接收中断函数void serial () interrupt 4 using 3{if(RI){unsigned char ch;RI = 0;ch=SBUF;if(ch>127){count3=0;inbuf1[count3]=ch;checksum= ch-128;}else{count3++;inbuf1[count3]=ch;checksum ^= ch;if( (count3==(INBUF_LEN-1)) && (!checksum) ){read_flag=1; //如果串口接收的数据达到INBUF_LEN个,且校验没错,//就置位取数标志}}}}main(){init_serialcomm(); //初始化串口while(1){if(read_flag) //如果取数标志已置位,就将读到的数从串口发出{read_flag=0; //取数标志清0send_string_com(inbuf1,INBUF_LEN);}}//-------------------------------------------------------------------//crc:校验子程序//开始地址指针ADRS,需校验字节数量SUM//校验结果:高位CRCH,低位CRCL//-------------------------------------------------------------------void CCRC(unsigned char *ADRS,unsigned char SUM){unsigned int data CRC; //校验码unsigned char data i;unsigned char data j;CRC=0xFFFF;for (i=0;i<SUM;i++){CRC^=*ADRS;for (j=0;j<8;j++){if ((CRC & 1)==1){CRC>>=1;CRC^=0xA001;}else{CRC>>=1;}ADRS++;}CRCH=CRC&0xFF;CRCL=CRC>>8;}//-------------------------------------------------------------------//其他程序调用例子//校验数组前6位//-------------------------------------------------------------------//。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于proteus的51单片机仿真实例六十二、串口发送和接收字符串实例
标签: proteus单片机串口实例字符2010-02-19 23:30
1、在上一实例中,我们利用proteus中自带的虚拟终端实现了单片机通过串口向主机发送字符串的功能。
本例中我们加入串口接收字符的功能
2、为了实现单片机通过终端接收字符的功能,我们需要在电路中再加入一路虚拟终端,新加入的这一路虚拟终端连接到单片机的串行接收端口RXD上,在仿真运行后,在该终端输入字符,然后将字符发送到单片机的串行接收端,
3、在keil c51中新建工程ex50,编写如下程序代码,编译并生成ex50.hex文件
// 实例50:利用虚拟中断实现串口数据的发送和接收
//
#include <reg51.h> //包含头文件
//毫秒级延时函数
void delay(unsigned int x)
{
unsigned char i;
while(x--)
{
for(i = 0;i < 120;i++);
}
}
//字符发送函数
void putchar(unsigned char data1)
{
SBUF = data1; //将待发送的字符送入发送缓冲器
while(TI == 0); //等待发送完成
TI = 0; //发送中断标志请0
}
//字符串发送函数
void putstring(unsigned char *dat)
{
while(*dat != '\0') //判断字符串是否发送完毕
{
putchar(*dat); //发送单个字符
dat++; //字符地址加1,指向先下一个字符
delay(5);
}
}
//主函数
void main(void)
{
unsigned char c = 0;
SCON = 0x50; //串口方式1 ,允许接收
TMOD = 0x20; //T1工作于方式2
PCON = 0x00; //波特率不倍增
TL1 = 0xfd; //波特率设置
TH1 = 0xfd; //
EA = 1; //开总中断
ES = 1; //开串口接收中断
//TI = 0;
TR1 = 1; //定时器开启
delay(200);
putstring("Receiving from 8051...\r\n"); //串口向终端发送字符串,结尾处回车换行 putstring("----------------------\r\n");
delay(50);
while(1)
{
}
}
//
void revdata(void) interrupt 4
{
unsigned char temp;
if(RI == 0) return; //如果没有接收中断标志,返回
ES = 0; //关闭串口中断
RI = 0; //清串行中断标志位
temp = SBUF; //接收缓冲器中的字符
putchar(temp); //将接收的字符发送出去
ES = 1; //开启串口中断
}
4、在proteus中新建仿真文件ex50.dsn,电路原理图如下所示
5、将ex50.hex文件载入at89c51中,启动仿真,在vertual terminal1中输入字符,vertual terminal 中会即时显示出输入的字符。
下图是程序运行结果。
举报|
23 次阅读| 0 个评论。