基于Proteus虚拟终端51单片机仿真:串口发送和接收字符串
单片机用proteus仿真双机串口通信总结体会
单片机用 Proteus 仿真双机串口通信总结体会本文介绍了使用 Proteus 仿真软件进行单片机双机串口通信的实验过程及总结体会。
下面是本店铺为大家精心编写的5篇《单片机用 Proteus 仿真双机串口通信总结体会》,供大家借鉴与参考,希望对大家有所帮助。
《单片机用 Proteus 仿真双机串口通信总结体会》篇1引言在单片机应用中,串口通信是一种重要的通信方式,它具有传输速率快、传输距离远、抗干扰能力强等优点。
Proteus 仿真软件是一种功能强大的电子电路仿真工具,可以用来模拟单片机串口通信的整个过程,为学习和实践提供方便。
本文将详细介绍使用Proteus 仿真软件进行单片机双机串口通信的实验过程及总结体会。
实验过程1. 硬件电路设计首先,我们需要设计一个简单的单片机硬件电路,包括电源电路、串口通信电路和 LED 显示电路。
电源电路可以使用电池或者稳压器来提供稳定的电压,串口通信电路可以使用 Proteus 提供的串口助手软件进行设计和调试,LED 显示电路可以使用 Proteus 提供的 LED 助手软件进行设计和调试。
2. 软件程序设计在软件程序设计中,我们需要编写两个程序:主程序和串口通信程序。
主程序主要负责初始化串口通信电路和 LED 显示电路,并将控制权转移到串口通信程序。
串口通信程序主要负责接收和发送数据,通过串口助手软件可以方便地进行调试和测试。
3. 仿真测试在仿真测试中,我们可以使用 Proteus 提供的仿真工具进行测试。
首先,我们需要将硬件电路和软件程序导入 Proteus 仿真软件中,并进行电路连接和程序编译。
然后,我们可以通过串口助手软件进行数据发送和接收,并通过 LED 显示电路进行数据展示。
总结体会通过使用 Proteus 仿真软件进行单片机双机串口通信实验,我们可以得出以下总结体会:1. Proteus 仿真软件是一种非常强大的电子电路仿真工具,可以用来模拟各种电路和通信方式。
基于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; //开启串口中断}仿真:。
MCS_51单片机串行口及其应用(基于Proteus仿真)
(6)TI(Transmit Interrupt发送中断):发送中断标志位。发送数据前必须用软件清零,发送过程中TI保持低电平0,发送完一帧数据后,由硬件自动置1。如果再发送,必须由软件再次清零。(在方式0时,当串行发送第8位数据结束时,或在其它方式,串行发送停止位的开始时,由内部硬件使TI置1,向CPU发中断申请。在中断服务程序中,必须用软件将其清0,取消此中断申请。)
9、MCS-51串行口结构:
如下图所示,它主要由数据缓冲寄存器SBUF(serial buffer)、移位寄存器、控制寄存器TCON和波特率发生器等组成。其中,接收与发送缓冲寄存器SBUF占用同一个地址99H,虽然二者地址相同,但由于发送数据采用的是写指令,接收数据采用的是读指令,因此不会产生混淆。
T1工作在方式2时的溢出周期(溢出周期其实就是T1的定时时间)为:
T1溢出周期=(256–T1初值)×(1/fosc)×12
则T1溢出率= =
方式0的波特率= fosc/12
方式2的波特率=(2SMOD/64)×fosc
方式1的波特率=(2SMOD/32)×(T1溢出率)
方式3的波特率=(2SMOD/32)×(T1溢出率)
10、串行口控制寄存器SCON
MCS-51单片机串行通信方式的选择、接收和发送控制以及串行口的标志都由SCON特殊功能寄存器控制和指示。SCON可位寻址,其格式如下:
SCON各位的含义:
(1) SM0、SM1:串行口工作方式选择位,可选择四种工作方式,如下图所示.
关于proteus仿真的串口问题
关于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仿真电路及代码
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
proteus仿真51单片机串口双机通讯
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中,不用管他。
基于Proteus的单片机串口通信仿真
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完成不同闪烁动作。
单片机IO口模拟串口程序(发送+接收)
单片机IO口模拟串口程序(发送+接收)前一阵一直在做单片机的程序,由于串口不够,需要用IO口来模拟出一个串口。
经过若干曲折并参考了一些现有的资料,基本上完成了。
现在将完整的测试程序,以及其中一些需要总结的部分贴出来。
程序硬件平台:11.0592M晶振,STC单片机(兼容51)/************************************** ************************** 在单片机上模拟了一个串口,使用P2.1作为发送端* 把单片机中存放的数据通过P2.1作为串口TXD发送出去*************************************** ************************/#include <reg51.h>#include <stdio.h>#include <string.h>typedef unsigned char uchar;int i;uchar code info[] ={0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x5 5,0x55,0x55,0x55,0x55,0x55,0x55,0x55 };sbit newTXD = P2^1;//模拟串口的发送端设为P2.1void UartInit(){SCON = 0x50; // SCON: serail mode 1, 8-bit UARTTMOD |= 0x21; // T0工作在方式1,十六位定时PCON |= 0x80; // SMOD=1;TH0 = 0xFE; // 定时器0初始值,延时417us,目的是令模拟串口的波特率为2400bps fosc=11.0592MHzTL0 = 0x7F; // 定时器0初始值,延时417us,目的是令模拟串口的波特率为2400bps fosc=11.0592MHz// TH0 = 0xFD; // 定时器0初始值,延时417us,目的是令模拟串口的波特率为2400bps fosc=18.432MHz// TL0 = 0x7F; // 定时器0初始值,延时417us,目的是令模拟串口的波特率为2400bps fosc=18.432MHz}void WaitTF0(void){while(!TF0);TF0=0;TH0=0xFE; // 定时器重装初值fosc=11.0592MHzTL0=0x7F; // 定时器重装初值fosc=11.0592MHz// TH0 = 0xFD; // 定时器重装初值 fosc=18.432MHz// TL0 = 0x7F; // 定时器重装初值 fosc=18.432MHz}void WByte(uchar input){//发送启始位uchar j=8;TR0=1;newTXD=(bit)0;WaitTF0();//发送8位数据位while(j--){newTXD=(bit)(input&0x01); //先传低位WaitTF0();input=input>>1;}//发送校验位(无)//发送结束位newTXD=(bit)1;WaitTF0();TR0=0;}void Sendata(){for(i=0;i<sizeof(info);i++)//外层循环,遍历数组{WByte(info[i]);}}void main(){UartInit();while(1){Sendata();}}########################################## ####################################/************************************** ************************** 模拟接收程序,这个程序的作用从模拟串口接收数据,然后将这些数据发送到实际串口* 在单片机上模拟了一个串口,使用P3.2作为发送和接收端* 以P3.2模拟串口接收端,从模拟串口接收数据发至串口*************************************** ************************/#include<reg51.h>#include<stdio.h>#include<string.h>typedef unsigned char uchar ;//这里用来切换晶振频率,支持11.0592MHz 和18.432MHz//#define F18_432#define F11_0592uchar tmpbuf2[64]={0};//用来作为模拟串口接收数据的缓存struct{uchar recv :6 ;//tmpbuf2数组下标,用来将模拟串口接收到的数据存放到tmpbuf2中uchar send :6 ;//tmpbuf2数组下标,用来将tmpbuf2中的数据发送到串口}tmpbuf2_point={0,0};sbit newRXD=P3^2 ;//模拟串口的接收端设为P3.2void UartInit(){SCON=0x50 ;// SCON: serail mode 1, 8-bit UARTTMOD|=0x21 ;// TMOD: timer 1, mode 2, 8-bit reload,自动装载预置数(自动将TH1送到TL1);T0工作在方式1,十六位定时PCON|=0x80 ;// SMOD=1;#ifdef F11_0592TH1=0xE8 ;// Baud:2400 fosc=11.0592MHz 2400bps为从串口接收数据的速率TL1=0xE8 ;// 计数器初始值,fosc=11.0592MHz 因为TH1一直往TL1送,所以这个初值的意义不大TH0=0xFF ;// 定时器0初始值,延时208us,目的是令模拟串口的波特率为9600bps fosc=11.0592MHzTL0=0xA0 ;// 定时器0初始值,延时208us,目的是令模拟串口的波特率为9600bps fosc=11.0592MHz#endif#ifdef F18_432TH1=0xD8 ;// Baud:2400fosc=18.432MHz 2400bps为从串口接收数据的速率TL1=0xD8 ;// 计数器初始值,fosc=18.432MHz 因为TH1一直往TL1送,所以这个初值的意义不大TH0=0xFF ;// 定时器0初始值,延时104us,目的是令模拟串口的波特率为9600bps fosc=18.432MHzTL0=0x60 ;// 定时器0初始值,延时104us,目的是令模拟串口的波特率为9600bps fosc=18.432MHz#endifIE|=0x81 ;// 中断允许总控制位EA=1;使能外部中断0TF0=0 ;IT0=1 ;// 设置外部中断0为边沿触发方式TR1=1 ;// 启动TIMER1,用于产生波特率}void WaitTF0(void){while(!TF0);TF0=0 ;#ifdef F11_0592TH0=0xFF ;// 定时器重装初值模拟串口的波特率为9600bps fosc=11.0592MHz TL0=0xA0 ;// 定时器重装初值模拟串口的波特率为9600bps fosc=11.0592MHz #endif#ifdef F18_432TH0=0xFF ;// 定时器重装初值 fosc=18.432MHzTL0=0x60 ;// 定时器重装初值 fosc=18.432MHz#endif}//接收一个字符uchar RByte(){uchar Output=0 ;uchar i=8 ;TR0=1 ;//启动Timer0#ifdef F11_0592TH0=0xFF ;// 定时器重装初值模拟串口的波特率为9600bps fosc=11.0592MHz TL0=0xA0 ;// 定时器重装初值模拟串口的波特率为9600bps fosc=11.0592MHz #endif#ifdef F18_432TH0=0xFF ;// 定时器重装初值fosc=18.432MHzTL0=0x60 ;// 定时器重装初值fosc=18.432MHz#endifTF0=0 ;WaitTF0();//等过起始位//接收8位数据位while(i--){Output>>=1 ;if(newRXD)Output|=0x80 ;//先收低位WaitTF0();//位间延时}TR0=0 ;//停止Timer0return Output ;}//向COM1发送一个字符void SendChar(uchar byteToSend){SBUF=byteToSend ;while(!TI);TI=0 ;}void main(){UartInit();while(1){if(tmpbuf2_point.recv!=tmpbuf2_point.send)//差值表示模拟串口接收数据缓存中还有多少个字节的数据未被处理(发送至串口){SendChar(tmpbuf2[tmpbuf2_point.send++]);}}}//外部中断0,说明模拟串口的起始位到来了void Simulated_Serial_Start()interrupt 0{EX0=0 ;//屏蔽外部中断0tmpbuf2[tmpbuf2_point.recv++]=RByte(); //从模拟串口读取数据,存放到tmpbuf2数组中IE0=0 ;//防止外部中断响应2次,防止外部中断函数执行2次EX0=1 ;//打开外部中断0}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~以上是两个独立的测试程序,分别是模拟串口发送的测试程序和接收的测试程序上面两个程序在编写过程中参考了这篇文章《51单片机模拟串口的三种方法》(在后文中简称《51》),但在它的基础上做了一些补充,下面是若干总结的内容:1、《51》在接收数据的程序中,采用的是循环等待的方法来检测起始位(见《51》的“附:51 IO 口模拟串口通讯C源程序(定时器计数法)”部分),这种方法在较大程序中,可能会错过起始位(比如起始位到来的时候程序正好在干别的,而没有处于判断起始位到来的状态),或者一直在检测起始位,而没有办法完成其他工作。
proteus与keil Cx51的单片机仿真(串行口单工通信2)
proteus 与keil Cx51 的单片机仿真(串行口单工通信2)单片机U1 和U2 串行口均工作于方式3,其中U1 作为接收机,U2 作为发送机,波特率为9600,U1 接收U2 发送数据后,依次送P1、P0 和P2 口进行流水灯显示,编写程序,并用Proteus 仿真。
电路图:U1 程序:#include//包含单片机寄存器的头文件sbit p=PSW;unsigned char receive(void)// 接收一个字节数据{unsigned char dat;while(RI==0);RI=0;//只要接收中断标志位RI 没有被置1,等待,直至接收完(RI1)ACC=SBUF;//将接收缓冲器中的数据存于datif(RB8==P)//奇校验{dat=ACC;return dat;}}void main(void){unsigned char i;TMOD=0x20;//定时器T1 工作于方式2SCON=0xd0;//SCON=1101 0000B,串行口工作方式1,允许接收(REN=1)PCON=0x00;//PCON=0000 0000B,波特率9600TH1=0xfd;TL1=0xfd;//根据规定给定时器T1 赋初值TR1=1;//启动定时器T1REN=1;//允许接收while(1){for(i=0;iU2 程序:#include//包含单片机寄存器的头文件sbit p=PSW;unsigned char code Tab[] ={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf, 0x7f,0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xff};//流水灯灯控制码,该数据被定义为全局变量void send(unsigned char dat)//向PC 发一个字节数据{ACC=dat;TB8=p;SBUF=dat;while(TI==0);//发送等待TI=0;}void delay(void)//延时约150ms{unsigned char m,n;for(m=0;mtips:感谢大家的阅读,本文由我司收集整编。
基于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; //开启串口中断}仿真:。
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单片机之串口
用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发送数据,看看能否接收到。
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]。
基于Proteus的51单片机应用-单片机串口通信设计
┊┊┊┊┊┊┊┊┊┊┊┊┊装┊┊┊┊┊订┊┊┊┊┊线┊┊┊┊┊┊┊┊┊┊┊┊┊1.绪论1.1课题背景及意义目前,单片机的发展速度大约每两、三年要更新一代,集成度增加一倍,功能翻一番。
其发展速度之快、应用范围之广已达到了惊人的地步,它已渗透到生产和生活的各个领域,应用非常广泛。
在汽车、通信、智能仪表、家用电器和军事设备的智能化以及实时过程控制等方面,单片机都扮演着非常重要的角色[1]。
因此单片机的设计开发具有广阔的前景。
所以,对于电气类学生而言,学习一种单片机的开发是十分必要的。
而51系列的单片机,随着半导体技术的发展,其处理速度更快,性能更优越,在工业控制领域上占据十分重要的地位,通过对51系列单片机的学习而掌握单片机开发的过程是一种不错的选择。
然而单片机是一门综合性、实践性都很强的学科,其学习涉及的实验环节比较多,硬件设备投入比较大,对于大多数人而言很难投入大笔资金去购买实验器件。
而且要进行硬件电路测试和调试,必须在电路板制作完成、元器件焊接完毕之后进行,但这些工作费时费力。
因此引入EDA软件仿真系统建立虚拟实验平台,不仅可以大大提高单片机的学习效率,而且大大减少硬件设备的资金投入,同时降低对硬件设备的维护工作。
EDA设计思路是:从元器件的选取到连接、直至电路的调试、分析和软件的编译,都是在计算机中完成,所用的工作都是虚拟的。
虽然现在的电路设计软件已经很多,诸如PROTEL、ORCAD、EWB 、Multisim等,不过这些软件之间的差别都不大:都有原理图和PCB制作功能,都能进行诸如频率响应,噪音分析等电路分析,主要用于模拟电路、数字电路、模数混合电路的性能仿真与分析,但对于单片机设计及软件编程,最重要的是两者的联调,这些软件都无法实现,所以造成了单片机系统设计周期长、设计费用高等缺点[2]。
新款的EDA软件Proteus解决了上述软件的不足,成为目前最好的一款单片机学习仿真软件。
Proteus 软件是由英国Lab Center Electronics 公司开发的EDA 工具软件。
(完整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。
51单片机发送字符串
要求:往串口发送一字节数据(可通过超级终端或者串口调试助手显示出来,超级终端波特率选为9600)。
超级终端设置好后,每按下一次S2键,松开后均会在超级终端上显示一串字母"abcdefg哈哈"。
入口参数:d: 要发送的字节数据。
晶振:11.0592MHZ程序如下:#include <reg52.h>#define jingzhen 11059200UL#define botelv 9600UL/*波特率定义为9600*/unsigned char zifuchuan[]="abcdefg哈哈";//待显示字符。
volatile unsigned char sending;sbit s2=P3^4;void delay(unsigned char i){unsigned char j,k;for(j=i;j>0;j--)for(k=90;k>0;k--);}void init(void)//串口初始化{EA=0; //暂时关闭中断TMOD&=0x0F; //定时器1模式控制在高4位TMOD|=0x20; //定时器1工作在模式2,自动重装模式SCON=0x50; //串口工作在模式1TH1=256-jingzhen/(botelv*12*16); //计算定时器重装值TL1=256-jingzhen/(botelv*12*16);PCON|=0x80; //串口波特率加倍ES=1; //串行中断允许TR1=1; //启动定时器1REN=1; //允许接收EA=1; //允许中断}void send(unsigned char d)//发送一个字节的数据,形参d即为待发送数据。
{SBUF=d; //将数据写入到串口缓冲sending=1;//设置发送标志while(sending); //等待发送完毕}void sendc(unsigned char * pd){while((*pd)!='\0') //发送字符串,直到遇到0才结束{send(*pd); //发送一个字符pd++; //移动到下一个字符}}void main(){init();while(1){if(s2==0){delay(20);if(!s2){while(!s2);sendc(zifuchuan);}}}}void uart(void) interrupt 4//串口发送中断{if(RI) //收到数据{RI=0; //清中断请求}else //发送完一字节数据{TI=0;sending=0; //清正在发送标志}}。
重要51单片机和Proteus+虚拟串口调试
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的波特率设置成一样的。
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虚拟仪器程序由前面板和框图程序组成,前面板是人机交互的界面,界面上有用户输入和显示输出两类控件;框图程序则是用户编制的程序源代码,以定义和控制在前面板上的控件输入和输出功能。
proteus,51单片机,串行通信
用51单片机对Com口串行通讯的探索对于com串口通信,自己设想的模型是在一个线上发送一定规律的高电平(1)和低电平,现在实验验证了这种想法是正确的。
利用51单片机的串行通信功能,配置寄存器pcon,scon等,并用vitual serial port driver软件和串口调试助手打开接通虚拟串口,实现单片机向pc发数据的功能,项目名为com。
Vitual serial port driver软件网上很容易下到,它的设置如下。
Com2和com3口是相互连通的。
Proteus电路图单片机晶振为11.0592MHz,P1设置如下:Keil程序#include <reg52.h>#include<stdio.h>void delay1ms(){unsigned int i;for(i=500000;i>0;i--); //延时}Initial_com(){TMOD=0x20; //定时器T1 PCON &= 0xef;SCON=0x50;TH1=0xfd; //波特率设置为9600TL1=0xfd;TR1=1; //开定时器T1运行控制位}main(){Initial_com();while(1){SBUF=0x41;while(!TI);delay1ms();delay1ms();TI=0;}}仿真结果如下。
虚拟终端:示波器:串口调试助手:效果。
结合该模式下51单片机数据帧的格式:可见,示波器显示的数据是0 1000 0101 1,即0 (0x)95 1,其中的(0x)95是‘A’的ascii码。
注意每个位的持续时间是100us多一点点,这与9600的波特率有关。
对于串行通信来说,波特率就等于比特率。
严格说来,每一位的持续时间应该是1/9600s = 1000/9.6 us=100*10/9.6us=100*5/4.8 us=100*25/24 us。
下面来验证我们想法的正确性,不使用51单片机的串口通讯寄存器,直接控制引脚产生形如示波器显示的波形。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
先上图:
实验程序:
/******************************************************************** *************
* 【编写时间】: 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工作于方式2
PCON = 0x00; //波特率不倍增
TL1 = 0xfd;
TH1 = 0xfd; // 波特率设置为9600
EA = 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; //开启串口中断
}
仿真:。