51单片机与计算机进行通信的实现方法

发布者:光明2599最新更新时间:2023-08-21 来源: elecfans关键字:51单片机  计算机  通信 手机看文章 扫描二维码
随时随地手机看文章

51单片机与计算机通信

首先我们先来了解一下51单片机与计算机进行通信的实现方法。先来看一个实现这个功能的基本电路。

图片

图中的P1就是仿真用的一个串口接口,这个仿真电路要实现与计算机通信功能需要用到其他两个软件,一个是虚拟串口驱动软件,另外一个是串口助手软件,这两个软件在网上都很容易找到。我使用的是Virtual Serial Port Driver和丁丁串口助手,你也可以使用自己熟悉的软件,如果找不到或使用,安装这两个软件有问题可以私信。

虚拟串口驱动软件安装后配置两个成对的虚拟串口一个对应仿真电路中的串口接口,一个对应在串口助手软件上,这样就相当于将两个软件通过虚拟串口连接在一起了,将他们配置成相同的串口参数之后,这时就可以实现相互发送信息了。

这里需要注意的一个问题,上一篇文章中最后部分列举了一个关于使用12MHz和11.0592MHz两种晶振配置特定波特率对应定时器数据寄存器的数据对应的表格,里面还包含各配置值对应的波特率精度,从图中可以看出使用12MHz晶振时误差率普遍比较大,而使用11.0592MHz时几乎没有误差,所以现在知道为啥你手上的单片机使用的晶振都是11.0592MHz的了吧!虽然使用12MHz的晶振进行通信计算机也能捕获到数据,但为了保险起见,若日后你使用51单片机开发项目需要使用到串口时要注意晶振的选择,当然如果使用其他单片机就要另说了,最简单的比如STC生产的1T型的51单片机(即一个机器周期等于一个时钟周期,它的执行效率理论上是传统单片机的12倍,实际因程序复杂程度不一会低一点),就需要参考对应说明了。

图片

图片

图片

图片

接下来我们要怎么验证单片机与计算机进行通信了呢?我们现在就编程实现计算机串口助手发送数据,单片机收到数据就做出回应将数据回传给计算机。

现在我们先来看看程序的具体实现过程。

/*

*这是一个串口通信应用程序

*目的是将串口助手发送过来的数据回传

*/

#include

#include

typedef unsigned char u8;

typedef unsigned int u16;

u8 data_L,data_H;

u8 T0_cnt = 0;

u8 T0_s = 0;

u8 T1_cnt = 0;

u8 crol = 0xfe;

u8 temp = 0;

u8 code num_codelist[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

void delay(u8 ms);

void data_init(void);

//void Timer_init(void);

void display(void);

void uart_init(void);

void main(void)

{

// Timer_init();

uart_init();




while(1)


{


data_init();


display();


}

}


void delay(u8 ms)


{


u8 i,j;




for(i=0; i

}


void data_init(void)


{


data_L = T0_s%10;


data_H = T0_s/10;

}


void display(void)


{


P2 = 0xfe;


P0 = num_codelist[data_H];


delay(1);




P2 = 0xfd;


P0 = num_codelist[data_L];


delay(1);

}


void uart_init(void) //串口初始化


{


TMOD = 0x20;


SCON = 0x50;


TH1 = 0xFD; //9600


TL1 = TH1;


PCON = 0x00;


EA = 1;


ES = 1;


TR1 = 1;

}


void uart() interrupt 4 //串口中断


{


if(RI)


{


    RI = 0;


    temp=SBUF;


  SBUF=temp;


  while(TI==0);


  TI=0;


}

}

现在来看一下程序的仿真效果:

图片

可以看到串口助手发送的数据马上又被单片机传回来了。这个程序没有多少新的代码,主要就是void uart_init(void)和void uart() interrupt 4这两个函数,其中一个串口初始化函数,另一个是串口中断函数。void uart_init(void)这个函数里面设置串口模式,定时器计数值以及串口中断设置。void uart() interrupt 4串口中断函数里面非常简单,就是获取收到的数据然后将数据发送出去。

程序实现过程是非常简单吧,看到这里赶紧去试试看吧。

接下来

51单片机双机通信

在项目开发时我们用到串口更多是和其他芯片进行通信,所以这里我们再来实现一个单片机双机通信的例子,先来看看这个电路图

图片

现在来看看我们要实现双机通信的代码:

/*

*这是一个串口通信应用程序

*目的是实现单片机的双机通信

*/

#include

#include

typedef unsigned char u8;

typedef unsigned int u16;

sbit key1 = P3^0;

sbit key2 = P3^1;

sbit key3 = P3^2;

sbit key4 = P3^3;

u8 data_L,data_H;

u8 T0_cnt = 0;

u8 T0_s = 0;

u8 T1_cnt = 0;

u8 crol = 0xfe;

u8 temp = 0;

u8 temp_key = 0; //定义一个变量用来存放临时按键值

u8 key_num = 0;//定义一个数字,用来显示

u8 code num_codelist[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

void delay(u8 ms);

void data_init(void);

//void Timer_init(void);

void display(void);

void key_init(void);

void uart_init(void);

void main(void)

{

// Timer_init();

key_init();


uart_init();




while(1)


{


data_init();


display();


}

}


void delay(u8 ms)


{


u8 i,j;




for(i=0; i

}


void data_init(void)


{


data_L = key_num%10;


data_H = key_num/10;

}


void display(void)


{


P2 = 0xfe;


P0 = num_codelist[data_H];


delay(1);




P2 = 0xfd;


P0 = num_codelist[data_L];


delay(1);


  P1 = key_num;      //P1端口LED显示

}


void key_init(void) //按键初始化


{


IT0=1;                 //外部中断0为下降沿触发


IT1=1;                 //外部中断1为下降沿触发


EX0=1;                 //开EX0中断


EX1=1;                 //开EX1中断


EA=1;                  //开总中断

}


void uart_init(void) //串口初始化


{


TMOD = 0x20;


SCON = 0x50;


TH1 = 0xFD; //9600


TL1 = TH1;


PCON = 0x00;


EA = 1;


ES = 1;


TR1 = 1;

}


//外部中断0服务例程


void P3_2_key_func(void) interrupt 0


{


//将外部中断0对应的按键K3设置为按键加功能


if(0 == key3)


{


    delay(15);


    if(0 == key3)


    {


        if(key_num < 100)


        {


            key_num++;


        }


        else


        {


            key_num = 0;


        }


    }


  


  SBUF = key_num; //串口发送


  while(TI==0);


  TI=0;


}

}


//外部中断1服务例程


void P3_3_key_func(void) interrupt 2


{


//将外部中断0对应的按键K4设置为按键减功能


if(0 == key4)


{


    delay(15);


    if(0 == key4)


    {


        if(key_num > 0)


        {


            key_num--;


        }


        else


        {


            key_num = 100;


        }


    }



  SBUF=key_num; //串口发送


  while(TI==0);


  TI=0;


}

}


void uart() interrupt 4


{


if(RI)


{


    RI = 0;


    key_num = SBUF;   //串口接收


}

}

将这段代码同时下载到两个单片机中就实现两个单片机同步了,现在看看仿真结果:

图片

这个程序中的大多数代码都是前面的文章中类似的,只做简单修改就可以,接下来的时间自己看这代码理一理逻辑


关键字:51单片机  计算机  通信 引用地址:51单片机与计算机进行通信的实现方法

上一篇:一种基于51单片机利用74HC595驱动数码管的技术
下一篇:51单片计4种定时器应用场景详解

推荐阅读最新更新时间:2024-11-10 21:37

STM32与SD卡通信各层分析
最近做了一些STM32和SD卡通信的一些思考,一直以来SD的驱动和应用困扰了我很久,寒假的时候看到SD简化版物理层协议的时候就傻掉了,看到SD的驱动快3000行的代码也动摇了。这几天几种地看了一下SD卡的相关内容,总结了一些体会,感觉也没有那么恐怖了。我决定从分层上来讨论SD的驱动和应用,因为这样可以构建一个清晰的逻辑,且不知哪位计算机大师曾说过:一切计算机问题都可以用分层的方法来解决。 我自己把SD卡从驱动到应用共分为4层,从下至上依次为:驱动层、物理层、文件系统层、应用层。下面一一来介绍各层的一些重要的操作。 1)驱动层 驱动层,对应到ST的库,就是stm32f10x_sdio.c/.h这个两文件。其实使用任何一个ST
[单片机]
S7-200 SMART 通信端口以及连接方式
每个S7-200 SMART CPU都提供一个以太网端口和一个RS485端口(端口0),标准型CPU额外支持SB CM01信号板(端口1),信号板可通过STEP 7-Micro/WIN SMART软件组态为RS232通信端口或RS485通信端口。 CPU 通信端口引脚分配 1.S7-200 SMART CPU 集成的 RS485 通信端口(端口0)是与 RS485 兼容的9针 D 型连接器。CPU 集成的 RS485 通信端口的引脚分配如表1. S7-200 SMART CPU 集成 RS485 端口的引脚分配表所示。 表1. S7-200 SMART CPU 集成 RS485 端口的引脚分配 2.标准型 CPU 额外支持
[嵌入式]
S7-200 SMART <font color='red'>通信</font>端口以及连接方式
西电芜湖研究院5G通信芯片用氮化镓试制成功
集微网消息(文/小如)近日,国产化5G通信芯片用氮化镓材料日前在西电芜湖研究院试制成功,这标志着今后国内各大芯片企业生产5G通信芯片,有望用上国产材料。 该项目是芜湖大院大所合作的重点项目,西安电子科技大学芜湖研究院依托于西电宽带隙半导体技术国家重点学科实验室,研发出全国产的基于碳化硅衬底的氮化镓材料,目前在国际第三代半导体技术领域处于领先水平,将助力5G通信制造领域的国产化进程。 GaN是第三代半导体材料,在光电子、大功率器件和高频微波器件应用方面有着广阔的前景。 据大江晚报报道,西电芜湖研究院技术总监陈兴表示,研究院目前已经掌握了氮化镓材料的生产和5G通信芯片的核心设计与制造能力。下一步他们将尽快将这项技术商用,力
[手机便携]
是德5G UEE解决方案助力京信通信验证全套小基站产品的性能
是德科技公司(NYSE:KEYS)日前宣布,京信通信公司已选中是德科技 5G 用户设备仿真(UEE)解决方案,用于全方位验证 5G 无线接入网和核心网功能在众多小基站产品上的性能。是德科技是一家领先的技术公司,致力于帮助企业、服务提供商和政府客户加速创新,创造一个安全互联的世界。京信通信是一家无线通信系统提供商。 是德科技 5G UEE 平台能够协助京信通信在各种真实场景下、跨越整个协议栈高效验证其小基站解决方案、客户端设备(CPE)、无线远程单元(RRU)和分布式天线系统(DAS)的性能。因此,京信通信决定采用是德科技 5G UEE 解决方案,以应对通信行业向虚拟化无线接入网(vRAN)架构和开放式 RAN 标准接口过渡的趋
[测试测量]
51单片机温控风扇
1.本设计基于STC89C51/52(与AT89S51/52、AT89C51/52通用,可任选)单片机 2.采用DS18B20温度传感器测温,74HC573驱动数码管显示温度和风扇的档位。 3.共3个按键:设置、加、减。按一下设置可以设置上限,再按下设置下限,均可以按键加减调整。 4.利用PWM调速,当温度低于下限时,风扇不转动,当温度处于上、下限之间时1档转动(50%的转速),当温度超过上限时,全速转动。 使用说明: 一共3个按键:设置、加、减 按下设置键的时候才可以加减。 按一下设置键,是设置温度的上限,再按下设置键,是设置温度的下限,再按下设置键是退出并保存。 元件清单: 1)7*9万用板 2)风扇 3)STC89C
[单片机]
<font color='red'>51单片机</font>温控风扇
51单片机点亮一盏LED灯的原理解析
首先应该了解51单片机最小系统:51最小系统也称为51最小应用系统,是指用最少的元件组成的51单片机可以工作的系统。如图2.1.1所示,51最小系统一般应该包括:单片机、晶振电路、复位电路。 晶振电路的原理及组成,作用: 在单片机系统里晶振的作用非常大,他结合单片机内部的电路,产生单片机所必须的时钟频率,单片机的一切指令的执行都是建立在这个基础上的,晶振的提供的时钟频率越高,那单片机的运行速度也就越快。简单地说,没有晶振,就没有时钟周期,没有时钟周期,就无法执行程序代码,单片机就无法工作。单片机工作时,是一条一条地从RoM中取指令,然后一步一步地执行。单片机访问一次存储器的时间,称之为一个机器周期,这是一个时间基准。—个机器周
[单片机]
51单片机】0.96寸OLED取模教程
一、 文字取模 1.打开软件 2.选择模式 3.选项设置 点阵内的数字手动输入999,然后点击确定。 4.生成字模 以字宽字高16*16为例 复制到代码中调用即可。 如果需要改变字体大小可通过改变字宽字高比,进行重新取模 二、 图片取模 1.选择一张图片打开 打开方式选择画图 2.图片调整大小 0.96寸oled是128*64的,所以不能超出这个范围,否则就会乱码 我们这里选择的是68*64,可以自行修改,不要超出范围就行: (【水平x:0~127】;【垂直y:0~63】) 3.修改图片格式并且保存 4.打开软件,设置选项选择图形模式 5.打开选项设置进行调整
[单片机]
【<font color='red'>51单片机</font>】0.96寸OLED取模教程
80C51单片机指令的取指、执行时序
使用ALE信号作为低8位地址的锁存控制信号。ALE接到外部锁存器时,高电平期间,51的p0输出地址,低电平时锁存器将地址锁存,在ALE低电平时,(PSEN为低)p0口可以传输数据(指令),这样就可以地址/数据复用了。 以PSEN信号作为扩展程序存储器的读选通信号,在读外部ROM是PSEN是低电平有效,以实现对ROM 的读操作。 以EA信号作为内外程序存储器的选择 控制信号,当其为低电平时,对ROM的读操作限定在外部的程序存储器,当其为高电平时, 对ROM的读操作是从内部存储器开始的,并可延至外部程序存储器. 由RD和WR信号作为扩展数据存储器和I/O口的读选通、写选通信号。 EA信号是表示是当前指令是读内,还是外存储器
[单片机]
80C<font color='red'>51单片机</font>指令的取指、执行时序
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved