基于51单片机的串口通信(PC发字符)

最新更新时间:2022-01-12来源: eefocus关键字:51单片机  串口通信 手机看文章 扫描二维码
随时随地手机看文章

串口通信

选用芯片:AT89S52

函数功能:见如下代码。


/*******************************************************************

函数功能:PC机发送数据给单片机,每次发送3个字节(每字节为8位)的数据,

每个字节的内容为0~99无符号整数中的一个;单片机接收PC机串口发送过来的

这3个字节数据,并将它们依次以十进制方式显示在6位数码管中(每两个数码管

显示一个字节数据,例如发送数据为11,9,70,则数码管上显示11 09 70);

显示采用共阳极数码管,采用动态扫描显示方式。

作者:Crazy Wind      

日期:2020.10.22

version:1.0.0

********************************************************************/

#include"reg52.h"

#define uchar unsigned char

#define uint unsigned int

uchar code smgduan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff}; //段码:0~9

uchar code smgwei[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //位码

uchar b;

uchar k=0;

uchar y[9]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};   //给数组y[]一组初始值

/*****************************************************

函数功能:ms延时

******************************************************/

void delayms(uint ms)             //毫秒延时

{

uint i,j;

    for(i=0;i    {

        for(j=115;j>0;j--);

    }

}

/*****************************************************

函数功能:发送数据x

******************************************************/

void send_char(uchar x)

{

SBUF=x;   //SBUF是数据缓冲寄存器(暂存数据),把数据x输入到SBUF

while(!TI); //等待数据发送

TI=0;    //每发送8位数据TI就自动置1,需软件清零

}

/*****************************************************

函数功能:串口初始化、T1作波特率发生器初始化、打开串口中断

******************************************************/

void init()

{

TMOD=0x20;   //定时器1工作于8位自动重载模式, 用于产生波特率

TH1=0xFD;   //波特率9600

TL1=0xFD;

SCON=0x50;   //串口工作方式1 允许接收

PCON=0x00;   //波特率不倍增

TR1=1;   //启动定时器1

EA=1;   //打开总中断

ES=1;   //打开串口中断

}

/*****************************************************

函数功能:把接收到的数据转换十进制,再转换成对应的段码

******************************************************/

void quduanma()

{

y[k]=smgduan[b/16];

y[k+1]=smgduan[b%16];

y[k+2]=smgduan[10];

}

void main()

{

uint n;

init(); //串口初始化

while(1)

{

for(n=0;n<8;n++)

{

P2=smgwei[n];

P0=y[n];

delayms(1);

P0=0xff;

}

}

}

/*****************************************************

函数功能:串口接收的中断函数

******************************************************/

void TNT_Uart() interrupt 4

{

RI=0; //每接收8位数据RI就自动置1,需软件清零

b=SBUF; //SBUF是数据缓冲寄存器(暂存数据),把数据输出到b

quduanma();

send_char(b);  //传给电脑接收到的数据

k=k+3;

if(k==9)    //装满8位就重装

{

k=0;

}

}


关键字:51单片机  串口通信 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic558472.html

上一篇:51单片机串口通信数码管显示
下一篇:51单片机实验1——串行通信(TX/RX)

推荐阅读

51单片机流水灯控制(5种方法)
实现流程: 1. 新建一个工程(新项目) 2. 查看原理图确定需求(流水灯)对应LED引脚在单片机上的哪个引脚 3. 编写程序(通过查看原理图可以看到我们需要控制整个P2口以控制8个LED灯) 4. 编译程序,下载程序至开发板 5. 查看效果(调试)进制转换表(因为单片机首先处理的是十六进制的数据,所以我们需要将二进制控制需求转换成十六进制去写代码):控制代码:#include <REGX52.H> //头文件#include "Delay.h"#include "intrins.h"/* -----------------------------------------
发表于 2022-09-29
<font color='red'>51单片机</font>流水灯控制(5种方法)
51单片机 定时器时钟
1.main.c注:Sec,Min,Hour可不进行赋值#include <REGX52.H>#include "Delay.h"#include "LCD1602.h"#include "Timer0.h"unsigned char Sec=55,Min=59,Hour=23;void main(){ LCD_Init(); Timer0Init(); LCD_ShowString(1,1,"Clock:"); LCD_ShowString(2,1," : :"); while(1) { LCD_ShowNum(2
发表于 2022-09-28
51单片机 按键控制LED流水灯模式
1.将之前文件中Delay.c.h复制过来,进行添加2.模块化编程3.main.c#include <REGX52.H>#include "Timer0.h"#include "Key.h"#include <INTRINS.H>unsigned char KeyNum,LEDMode;void main(){ P2=0xFE; Timer0Init(); while(1) { KeyNum=Key(); if(KeyNum==1) { LEDMode++; if(LEDMode>=2)LEDMode=0; } } }void Timer0_Routi
发表于 2022-09-28
<font color='red'>51单片机</font> 按键控制LED流水灯模式
51单片机 LCD1602调试工具
本章博客讲述的是关于LCD1602的调试,使用它是为了更加直观的表示出代码所要实现的功能1.首先,需要添加两份驱动文件到新建的工程中来,再插入到新建的工程中来将其复制到新建文件的同一目录下,在进行添加2.写出以下代码进行编译查看效果#include <REGX52.H>#include "LCD1602.h"void main(){ LCD_Init(); LCD_ShowChar(1,1,'A'); LCD_ShowString(1,3,"Hello"); LCD_ShowNum(1,9,123,3); //高位补零,如果最后一位是2则显示23 LCD_
发表于 2022-09-28
<font color='red'>51单片机</font> LCD1602调试工具
51单片机 模块化编程
了解模块化编程1.首先了解一下传统方式编程和模块化编程传统方式编程:所有的函数均放在main.c里,若使用的模块比较多,则一个文件内会有很多的代码,不利于代码的组织和管理,而且很影响编程者的思路 模块化编程:把各个模块的代码放在不同的.c文件里,在.h文件里提供外部可调用函数的声明,其它.c文件想使用其中的代码时,只需要#include "XXX.h"文件即可。使用模块化编程可极大的提高代码的可阅读性、可维护性、可移植性等2. 模块化编程注意事项.c文件:函数、变量的定义.h文件:可被外部调用的函数、变量的声明任何自定义的变量、函数在调用前必须有定义或声明(同一个.c)使用到的自定义函数的.c文件必须添加到工程参
发表于 2022-09-28
<font color='red'>51单片机</font> 模块化编程
51单片机 动态数码管显示
本章博客写的内容主要围绕动态数码管显示,动态数码管显示与静态数码管显示比较稍有变化,主要在添加延时函数这点上1.首先将上一章节使用子函数方法的代码复制过来将Nixie( , )移到下方while循环中(因为要实现效果为动态的)void main(){ while(1) { Nixie(1,1); Nixie(2,2); Nixie(3,3); }}编译下载后效果为:对于这种效果要进行消影的处理因为单片机编译处理顺序是按照:位选 段选 (清零),位选 段选 ,位选 段选由上一段的段选到下一部分的位选需要进行清零处理接下来主要进行:增添延时函数和清零处理2.在STC-ISP中生成相应的延时函数,函数时间为1ms,并对其进行灵活修改,
发表于 2022-09-28
<font color='red'>51单片机</font> 动态数码管显示

推荐帖子

工业以太网交换机在工业自动化控制系统中的应用
工业自动化系统指对工业生产过程及其机电设备、工艺装备进行测量与控制的自动化技术工具(包括自动测量仪表、控制装置)的总称,是一种运用控制理论、仪器仪表、计算机和其他信息技术,对工业生产过程实现检测、控制、优化、调度、管理和决策,达到增加产量、提高质量、降低消耗、确保安全等目的。解决方案 工业自动化控制系统采用MISCOM6026百兆网管型机架式交换机机、MIEN3208E百兆网管型卡轨式交换机以及Mport3102串口以太网服务器组网。Mport3102串口以太网服务器支持1路以太网接口与2路串
hcl@maiwe.com 工控电子
请问一下这个函数是怎么做到按键消抖的
以下是扫描消抖函数: voidkeyscan() { if(s2==0)//S2是一个独立按键 { while(s2==0);//想问的是为什么如果此处的S2一直按着不松手,应该是NUM一直在加,但实际上为什么只是松开时 num++;//才加一次呢?如果在按的过程中有抖动,那么也应该会不规则连加几次啊,他这是怎么做到去抖的呢? } } 望请各位大师解惑!! 请问一下这个函数是怎么做到按键消抖的
16816 51单片机
Keil C51 几类重要库函数(1)
1.1.专用寄存器include文件 例如8031、8051均为REG51.h其中包括了所有8051的SFR及其位定义,一般系统都必须包括本文件。 2.2.绝对地址include文件absacc.h 该文件中实际只定义了几个宏,以确定各存储空间的绝对地址。 3.3.动态内存分配函数,位于stdlib.h中4.4.缓冲区处理函数位于“string.h”中 其中包括拷贝比较移动等函数如: memccpymemchrmemcmpmemcpymemmovememse
tonytong 51单片机
关于蓝牙WSALookupServiceNext()错误10050的问题
各位大侠我最近初学蓝牙,准备在WINCE 5.0 平台下用SOCKET进行蓝牙的开发。 但是在查找设备的时候总是出错。是在WSALookupServiceNext()这一步的时候出现了错误,错误代码为10050好像是没有找到蓝牙设备,用CE里的例子试也是出现错误代码10050。 是不是我还没对蓝牙进行初始化配置,还是在定制的时候没有定制好,我在定制系统的时候加了 BluetoothStackwithlnteqratedUARTDriver和BluetoothStac
ouyangzan 嵌入式系统
ORCAD_CAPTURE_零件库解析
ORCAD_CAPTURE_零件库解析ORCAD_CAPTURE_零件库解析
安_然 模拟电子
如何解决电子墨水屏标签的误唤醒和吵醒问题?
本帖最后由chenjingjing于2022-9-1812:17编辑 电子墨水屏是近些年由台湾eInk公司发展起来的一种超低功耗的数字显示技术,不同于传统的LCD,LED等主动发光的电子屏幕技术,墨水屏是一种被动式发光技术,这种屏幕仅在画面刷新过程中消耗很低的电流,在刷新完成显示内容之后屏幕完全不需要电力供应,可以实现100%的零功耗;基于这个原理,电子价签的整体功耗很低,通常单个价签只需要安装两节CR2032的纽扣电池就可以工作3-5年时间,大大的方便了该系统的安装,运
chenjingjing RF/无线
小广播
设计资源 培训 开发板 精华推荐

何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2022 EEWORLD.com.cn, Inc. All rights reserved