历史上的今天
返回首页

历史上的今天

今天是:2024年09月02日(星期一)

正在发生

2021年09月02日 | 51单片机串口通信(UART)

2021-09-02 来源:eefocus

项目描述:

1.串口工作方式为1(8位UART,波特率可变),无校验位;

2.通信数据格式为:1位起始位 + 8位数据位 + 1位停止位;

3.上电后MCU给上位机发送问候语,之后等待上位机的信息;MCU和上位机的通信为收发交替进行。MCU接收到的信息会实时的显示在LCD上。上位机接收到的信息会在串口助手上显示。


C语言程序如下:


/*-----------------------

FileName: UART.h

Function: 头文件

Author: Zhang Kaizhou

Date: 2019-6-10 11:33:35

------------------------*/

#include "reg52.h"

#include

#define uchar unsigned char

#define uint unsigned int

#define FOSC 11059200L // 系统晶振频率为11.0592MHz

#define BAUD 9600 // 波特率位9600bps

#define MAXSIZE 8


/*LCD1602显示模块端口定义*/

sbit lcdrs = P1^0;

sbit lcdrw = P1^1;

sbit lcden = P2^5;


/*主模块函数声明*/

void timer1Init();

void sendChar(uchar dat);

void sendString(char * str);


/*LCD1602模块函数声明*/

void writeCommand(uchar command);

void writeData(uchar dat);

void delay(uchar xms);

void LCDInit();

void display(uchar * str);


/*--------------------------------------------

FileName: main.c

Function: 实现单片机与上位机的串口异步通信

Description: 上电后MCU给上位机发送问候语,

之后等待上位机的信息;MCU和上位机的通信为收发

交替进行。MCU接收到的信息会实时的显示在LCD上。

上位机接收到的信息会在串口助手上显示。

----------------------------------------------

Author: Zhang Kaizhou

Date: 2019-6-10 11:16:29

--------------------------------------------*/

#include "UART.h"


uchar code table3[] = {"Hello, I am ZKZ!rn"};

uchar code table4[] = {"I get it!rn"};

uchar info[MAXSIZE] = { 0 }; // 通信信息

uchar count = 0; // 接收到的字符个数

uchar temp = 0;

bit busy = 0; // 串口忙标志


/*主函数*/

void main(){

LCDInit();

timer1Init();

sendString(table3);

while(1){

if(count == MAXSIZE){

count = 0;

sendString(table4);

display(info);

}

}

}


/*定时器1用作波特率发生器*/

void timer1Init(){

SM0 = 0; SM1 = 1; // 设置串口为8位UART

REN = 1; // 允许串口接收数据

TMOD = 0x20; // 设置timer1为8位自动重装初值的定时器

PCON = 0x00; // SMOD = 0

TH1 = 0xfd; // 装初值,可通过查表求得

TL1 = 0xfd;

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

ES = 1; // 开串口中断

    EA = 1; // 开全局中断

}


/*串口中断服务程序*/

void uartService() interrupt 4{

    if (RI){ // 串口接收结束

    info[count++] = SBUF; // 将接收到的数据从串口缓存中取出放到info中

RI = 0; // 串口接收标志软件复位

    }

    if (TI){ // 串口发送结束

TI = 0; // 软件复位串口发送中断标志

      busy = 0;

    }

}


/*向串口发送一个字符的函数*/

void sendChar(uchar dat){

    while (busy); // 等待串口空闲

temp = dat;

    busy = 1;

    SBUF = temp;

}


/*向串口发送一个字符串的函数*/

void sendString(char * str){

    while (* str){

        sendChar(*str++);

    }

}


/*-----------------------------

FileName:display.c

Function: LCD1602显示函数

Author: Zhang Kaizhou

Date: 2019-6-7 13:52:11

------------------------------*/

#include "UART.h"


uchar code table0[] = {"Welcome here!"};

uchar code table1[] = {"This is UART!"};

uchar code table2[] = {"Too long!"};

uchar num = 0;


/*初始化LCD1602的设置*/

void LCDInit(){

uchar i;

lcden = 0; // 拉低使能端,准备产生使能高脉冲信号

writeCommand(0x38); // 显示模式设置(16x2, 5x7点阵,8位数据接口)

writeCommand(0x0c); // 开显示,不显示光标

writeCommand(0x06); // 写一个字符后地址指针自动加1

writeCommand(0x01); // 显示清零,数据指针清零

/*LCD上电界面*/

writeCommand(0x80); // 将数据指针定位到第一行首

for(i = 0; i < strlen(table0); i++){

writeData(table0[i]);

delay(5);

}

writeCommand(0x80 + 0x40); // 将数据指针定位到第二行首

for(i = 0; i < strlen(table1); i++){

writeData(table1[i]);

delay(5);

}

}


/*LCD显示函数*/

void display(uchar * str){

uchar i;

writeCommand(0x01); // 清屏

writeCommand(0x80);

for(i = 0; i < MAXSIZE; i++){

writeData(str[i]);

delay(5);

}

}


/*写指令函数*/

void writeCommand(uchar command){

lcdrs = 0; // 命令选择

lcdrw = 0;

P0 = command;

delay(5);

lcden = 1; // 产生一个正脉冲使能信号

delay(5);

lcden = 0;

}


/*写数据函数*/

void writeData(uchar dat){

lcdrs = 1; // 数据选择

lcdrw = 0;

P0 = dat;

delay(5);

lcden = 1;

delay(5);

lcden = 0;

}


/*延时函数*/

void delay(uchar xms){

uint i, j;

for(i = xms; i > 0; i--)

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

}


实现效果:

单片机每接收到一个来自上位机的字符串(规定长度为8个字符),就会向上位机发送一个应答语"I get it!"。


上位机会通过串口助手向单片机循环发送"12345678",“abcdefgh”,"ijklmnop"三个字符串,单片机接收到后会显示在LCD上。

在这里插入图片描述

推荐阅读

史海拾趣

Hpc Technology Inc公司的发展小趣事

HPC Technology Inc公司发展的五个故事

故事一:初创与技术创新

HPC Technology Inc公司成立于2003年,总部位于中国台湾台北县三重市。创立之初,公司便专注于连接器与电缆组件的研发与生产,致力于为客户提供全面解决方案和优质服务。在电子行业快速发展的背景下,HPC Technology Inc公司敏锐捕捉到高性能计算(HPC)市场的潜力,开始逐步涉足该领域。通过不断的技术创新,公司推出了一系列高性能、高可靠性的连接器产品,逐渐在HPC市场中崭露头角。

故事二:市场拓展与品牌建设

随着技术的不断成熟和市场的认可,HPC Technology Inc公司开始积极拓展海外市场。公司参加了多个国际性的电子展会,与全球客户建立了广泛的联系。同时,公司注重品牌建设,通过优质的产品和服务赢得了客户的信赖和好评。在国际市场上,HPC Technology Inc公司的品牌知名度逐渐提升,产品销量也稳步增长。

故事三:技术合作与产业升级

为了进一步提升技术实力和市场竞争力,HPC Technology Inc公司积极寻求与国内外知名企业的技术合作。公司与多家国际知名的电子企业建立了长期合作关系,共同开展技术研发和产品创新。通过技术合作,公司不仅获得了先进的技术支持,还实现了产业升级和产品结构优化。这些合作成果为公司在HPC领域的持续发展奠定了坚实基础。

故事四:绿色环保与可持续发展

随着全球对环保问题的日益关注,HPC Technology Inc公司积极响应号召,致力于绿色环保和可持续发展。公司投入大量资金研发环保型连接器产品,采用环保材料和绿色生产工艺,减少对环境的影响。同时,公司还建立了完善的废弃物回收和处理机制,确保生产过程中的废弃物得到妥善处理。这些举措不仅提升了公司的社会责任感,也为公司的可持续发展注入了新的动力。

故事五:智能制造与数字化转型

面对制造业的数字化转型浪潮,HPC Technology Inc公司紧跟时代步伐,积极推进智能制造和数字化转型。公司引入了先进的智能制造设备和系统,实现了生产过程的自动化、智能化和数字化。通过数字化转型,公司不仅提高了生产效率和质量稳定性,还降低了生产成本和能耗。同时,公司还利用大数据和人工智能技术优化供应链管理、客户服务和产品研发等环节,进一步提升了企业的竞争力和市场响应速度。

Chemtronics公司的发展小趣事

自1958年成立以来,Chemtronics公司在电子维护和维修领域不断进取。最初,公司专注于生产一系列清洁剂产品,以其高效清洁能力获得了市场的认可。随着时间的推移,Chemtronics逐渐将产品线扩展至超纯溶剂、净化室级别擦拭棒和擦拭布等领域,进而又扩展到电子电气和电信工业的精密返工和维修工具。这一转变不仅体现了公司对市场需求的敏锐洞察,也彰显了其不断创新的精神。

Edsun Laboratories Inc公司的发展小趣事

随着公司规模的扩大和产品线的丰富,ECM Electronics Limited.开始积极拓展市场。公司不仅在国内市场取得了良好的销售业绩,还积极开拓国际市场,将产品出口到多个国家和地区。为了更好地服务全球客户,公司还设立了海外办事处和研发中心,加强与国际市场的联系和合作。通过国际化战略的实施,ECM进一步提升了品牌知名度和市场竞争力。

GETEDZ ( HVGT)公司的发展小趣事
在设计电路时要充分考虑电路的安全性,采取必要的保护措施,如设置过载保护、短路保护等。
EAO公司的发展小趣事

面对全球市场的竞争压力,EAO公司坚定实施全球化战略。公司在全球范围内建立了完善的销售网络和售后服务体系,为客户提供及时、高效的服务。同时,EAO公司还积极寻求与国际知名企业的合作机会,共同开拓市场、分享资源。通过全球化战略的实施,EAO公司不断提升品牌影响力和市场竞争力。

American Power Design Inc公司的发展小趣事

随着国内市场的饱和,APDI决定实施国际化战略,以拓展海外市场。公司首先在欧洲设立了研发中心,与当地高校和研究机构合作,共同开发适应欧洲市场的电子产品。随后,APDI又在亚洲建立了生产基地,利用当地的低成本优势和高效的供应链管理,进一步降低了产品成本,提高了市场竞争力。

问答坊 | AI 解惑

谁用74HC245做过s51的下载线......希望大虾们关注一下哈.......(急)

我用74HC245做的S51并行下载线, 怎么用聂忠强写的那软件烧写时,检测不到器件...... 如果有那位大侠用过,希望大虾能把邮箱留下 。。。 哈哈......小弟一点点要求........谢谢.... 希望大虾帮帮忙.....小弟....先谢了..... [ 本帖最后由 wang ...…

查看全部问答>

跟我学模拟电子电路

本帖最后由 paulhyde 于 2014-9-15 09:18 编辑 跟我学模拟电子电路  …

查看全部问答>

Tieto招聘:Senior FPGA-Designer

叠拓(原迪易通)信息技术有限公司 (Tieto),成立于1968年,是一家北欧的从事软件解决方案的全外资集团公司,分别在赫尔辛基和斯德哥尔摩证券交易所挂牌。是综合实力北欧地区第一,欧洲前三的IT业务供应商。 请将简历发送到 xiaoli.yang@tieto.co ...…

查看全部问答>

Intel在嵌入式领域的发展历程

本帖最后由 paulhyde 于 2014-9-15 09:00 编辑  1971:Intel推出了第一款微处理器Intel 4004,由于体积小、重量轻、价格低廉和成功的设计促使Intel把它进一步通用化,推出了4位的4040和8位的8008。   1973:Intel进一步推出了8位微处理器8080 ...…

查看全部问答>

100分查内存泄漏

bool CGPSGuidsDlg::InitMap(const WCHAR* fileName) {         IImagingFactory*        pImagingFactory;         IImage*              &nb ...…

查看全部问答>

求Wince系统定制资料

谁有关于Wince系统定制比较详细的资料?能发给我一份吗?我邮箱:baiminshengbai@126.com给我发了留个言,我给你分 谢谢了…

查看全部问答>

jedec_probe探测SST39vf3201的疑问

CPU:NXP LPC2478 Flash:NOR SST39VF3201:4MB,4k扇区,地址:0x81000000 想在4M的NOR flash上作jffs2根文件系统,自己写了MTD驱动: #define FLASH_BASE_ADDR                0x81000000 #define F ...…

查看全部问答>

04年毕业的本科兄弟们,有兴趣做手机终端研发么?

如题   中兴通讯 西安研究所     月薪:4500-7000,面谈   如有兴趣,   请电话联系:029-88723851   邮件:bi.zehongxa@zte.com.cn      岗位要求:   嵌入式开发。   设备驱动开发。      要求:熟悉c ...…

查看全部问答>

TI MSP-EXP430FR5739实验板套件

来晚了,TI MSP-EXP430FR5739实验板套件团购还来得及吗。。。…

查看全部问答>

关于数码管显示,程序讨论

有8个数码管,每4个为一组,使用动态扫描来实现方法一:使用两个浮点变量作为参数 void show(float digitron1,float digitron0);              在函数里面分别去digitron1、digitron0的各个位的数值,然后通 ...…

查看全部问答>