基于proteus的51单片机仿真实例六十二、串口发送和接收字符串实例
51单片机串口通信及通信实例

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 的单片机仿真(串行通信口)单片机串行口工作于方式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串⼝发送字符串刚开始也是⼀直乱码,直到昨天我才解决了乱码的问题,原来这⼀切都是晶振频率惹的祸,今天开始不会乱码了。
可以发送单个字符了。
但是⼜出现了⼀个新的问题,⼀个很长的字符串怎么办?很多⼈想,那好办啊,下⾯这个程序就可以:/*发送⼀个字符串*/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单片机仿真:串口发送和接收字符串

先上图:实验程序:/********************************************************************************* * 【编写时间】: 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单片机串口通信连续发送接收字节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串口仿真

利用“串口调试助手”等软件调试 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单片机应用-单片机串口通信设计

┊┊┊┊┊┊┊┊┊┊┊┊┊装┊┊┊┊┊订┊┊┊┊┊线┊┊┊┊┊┊┊┊┊┊┊┊┊1.绪论1.1课题背景及意义目前,单片机的发展速度大约每两、三年要更新一代,集成度增加一倍,功能翻一番。
其发展速度之快、应用范围之广已达到了惊人的地步,它已渗透到生产和生活的各个领域,应用非常广泛。
在汽车、通信、智能仪表、家用电器和军事设备的智能化以及实时过程控制等方面,单片机都扮演着非常重要的角色[1]。
因此单片机的设计开发具有广阔的前景。
所以,对于电气类学生而言,学习一种单片机的开发是十分必要的。
而51系列的单片机,随着半导体技术的发展,其处理速度更快,性能更优越,在工业控制领域上占据十分重要的地位,通过对51系列单片机的学习而掌握单片机开发的过程是一种不错的选择。
然而单片机是一门综合性、实践性都很强的学科,其学习涉及的实验环节比较多,硬件设备投入比较大,对于大多数人而言很难投入大笔资金去购买实验器件。
而且要进行硬件电路测试和调试,必须在电路板制作完成、元器件焊接完毕之后进行,但这些工作费时费力。
因此引入EDA软件仿真系统建立虚拟实验平台,不仅可以大大提高单片机的学习效率,而且大大减少硬件设备的资金投入,同时降低对硬件设备的维护工作。
EDA设计思路是:从元器件的选取到连接、直至电路的调试、分析和软件的编译,都是在计算机中完成,所用的工作都是虚拟的。
虽然现在的电路设计软件已经很多,诸如PROTEL、ORCAD、EWB 、Multisim等,不过这些软件之间的差别都不大:都有原理图和PCB制作功能,都能进行诸如频率响应,噪音分析等电路分析,主要用于模拟电路、数字电路、模数混合电路的性能仿真与分析,但对于单片机设计及软件编程,最重要的是两者的联调,这些软件都无法实现,所以造成了单片机系统设计周期长、设计费用高等缺点[2]。
新款的EDA软件Proteus解决了上述软件的不足,成为目前最好的一款单片机学习仿真软件。
Proteus 软件是由英国Lab Center Electronics 公司开发的EDA 工具软件。
Labview及Proteus软件环境下单片机串口通讯的仿真(全)

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虚拟仪器程序由前面板和框图程序组成,前面板是人机交互的界面,界面上有用户输入和显示输出两类控件;框图程序则是用户编制的程序源代码,以定义和控制在前面板上的控件输入和输出功能。
- 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 个评论。