文档库 最新最全的文档下载
当前位置:文档库 › 基于STCSTC15F2K60S2单片机的串口通讯

基于STCSTC15F2K60S2单片机的串口通讯

基于STCSTC15F2K60S2单片机的串口通讯
基于STCSTC15F2K60S2单片机的串口通讯

湖南科技大学

信息与电气工程学院《单片机课程设计报告》

题目:基于STCSTC15F2K60S2单片机的串口通讯

专业:自动化

班级:一班

姓名:罗永恒

学号: 1209010303

指导教师:范小春

2015年 6月 30日

单片机是一种集成在电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计时器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的计算机系统。本文将具体介绍单片机与PC机进行串口通信的实现方法和编程方法,并且在最后给出一个实用的单片机与计算机通过串口通信的程序。

关键词:单片机串口通信

第一章 STCSTC15F2K60S2的简介 (1)

1.1 STCSTC15F2K60S2的内部结构框图 (1)

1.2 STC15F2K60S的DIP封装图 (1)

1.3 STC15F2K60S的各引脚简介 (2)

第二章单片机通过USB与PC机的通信设计 (4)

2.1设计方案选择 (4)

2.1.1 PC机同单片机通信存在的问题 (4)

2.1.2 USB接口同RS-232(DB-9)串口的比较 (4)

2.1.3 USB转接芯片的选择 (4)

2.2 通信功能要求 (5)

第三章硬件电路图的设计 (5)

3.1单片机最小系统 (5)

3.2 USB与单片机连接主电路 (6)

3.3 总电路图 (6)

3.4 PCB图 (6)

第四章程序设计 (7)

4.1 串口初始化 (7)

4.2 主程序 (7)

4.3 中断服务程序 (8)

4.4 总程序 (8)

第五章总结与体会 (10)

第六章参考文献 (11)

第一章 STCSTC15F2K60S2的简介1.1 STCSTC15F2K60S2的内部结构框图

1.2 STC15F2K60S的DIP封装图

1.3 STC15F2K60S 的各引脚简介

(1)电源引脚

Vcc :一般接电源的+5V 。具体的电压幅度应参考单片机的手册。 GND :接电源地。 (2)外接晶体引脚

XTAL2

XTAL1

C2

C1

GND

M

单片机

芯片内部一个反相放大器的输入端和输出端。通常用于连接晶体振荡器。 (3)控制和复位引脚

单片机

RST/VPD

GND

Cr 10uF

Rr 10KΩ

Vcc

功能:当访问外部存储器或者外部扩展的并行I/O 口时,ALE (允许地址锁 存)的输出用于锁存地址的低位字节。

RST (与P5.4复用):当振荡器运行时,在此引脚上出现两个机器周期的 高电平将使单片机复位。如果需要单片机接上电源就可以复位,则需要使 用上电复位电路。 (4)I/O 口的复用功能 P0口:

a.用作数据总线(D7~D0)或者地址总线低8位(A7~A0)。

b.用作普通I/O 。 P1口:

a.用作普通I/O 。

b.复用为ADC 转换输入、捕获/比较/脉宽调制、SPI 通信线、第二串口 或者第二时钟输出,如表所示。

P2口:

a:用作通用I/O。

b:用作地址总线的高8位输出。

c:用于SPI和捕获/比较/脉宽调制的备用切换端口。

P3口:

a:用作通用I/O。

b:可复用为外部中断输入、计数器输入、时钟输出、第一串口和外部总线的读/写控制,如表所示。

P4口:

a:用作通用I/O。

b:某些口线具有复用功能,可配置为SPI通信线、捕捉/比较/脉宽调制、第二串口线等。

P5口:

a:P5.4/RST(复位脚)/MCLKO(内部R/C振荡时钟输出;

b:输出的频率可为MCLK/1或MCLK/2)/SS_3(SPI接口的从机选择信号备用切换引脚)。

c:该引脚默认为I/O口,可以通过ISP编程将其设置为RST(复位)引脚。

第二章单片机通过USB与PC机的通信设计2.1设计方案选择

由于实际应用中单片机在数据处理能力、人机交互等方面往往不能满足要求, 因而通常用PC来弥补单片机的这些不足。例如,在工程应用中,常常由一台PC机和一台单片机构成主从式计算机测控系统。在这样的系统中,以单片机为核心的智能测控仪表(从机)作为现场测控设备,完成数据的采集、处理和控制各种任务,同时将数据传给PC机(主机),PC机将这些数据加工处理后,进行显示、打印报表等。PC机也可以将各种控制命令传送给单片机,干预单片机系统的运行,从而发挥PC机的优势。要实现这样的功能,就涉及到PC机与单片机之间的通信问题。现在的计算机提供了各种各样的串口,他们支持不同的通信协议,有着不同的功能。目前计算机提供的串口有RS-232,RJ45,USB2.0等。

2.1.1 PC机同单片机通信存在的问题

目前,15系列单片机同PC机的通信在大多数情况下仍然是使用RS-232(DB-9)串口作为通信接口实现的。而随着USB接口技术的成熟和使用的普及,由于USB 接口有着一系列RS-232(DB-9)串口无法比拟的优点,RS-232(DB-9)串口正在逐步的为USB接口所替代。而在现在的大多数笔记本电脑中,出于节省物理空间和用处不大等原因,RS-232(DB-9)串口已不再设置,这就约束了基于RS-232(DB-9)串口与PC机联络的单片机设备的使用范围。

2.1.2 USB接口同RS-232(DB-9)串口的比较

通过USB接口和RS-232(DB-9)的比较,不难发现:

(1)USB接口支持即插即用和热插拔,而RS-232(DB-9)串口不支持即插即用和热插拔,设备安装后需重启计算机方可使用。

(2)USB接口的传输速率较快,可达480Mbps(V2.0),而RS-232(DB-9)串口的最高速率仅为19200波特。

(3)USB接口占用体积较小,插拔方便;而RS-232(DB-9)串口的的插拔需要使用改锥,且在机箱后操作,比较麻烦。

综上可知,USB 接口取代RS-232(DB-9)串口的趋势不可逆转。

2.1.3 USB转接芯片的选择

目前常用的USB转接芯片包括PL2303,CH341,CP2101,FT232等。在综合考虑了各方面因素后,CH341成为了本次电路设计的首选芯片。CH341是南京沁恒电子公司生产的USB总线的转接芯片,通过USB总线提供异步串口,打印口,并口及常用的2线和4线等同步串行端口。其特点有:

(1)提供全速USB设备借口,兼容USB2.0,外围设备只需要晶体和电容;

(2)可通过外部的低成本串行EPROM定义厂商ID,产品ID,序列号等;(3)成本低廉,可直接转换原串口外围设备;

(4)采用SOP-28封装,串口应用还提供小型的SSOP-20封装。正是由于在PC机同单片机通信电路中,USB转接芯片CH341 具有以上其他芯片无法比拟的优点,同时价格低廉并且提供中文技术支持,因此它成为了本电路USB转接芯片的最优选择。本电路采用的是SSOP-20封装的CH341T,其引脚图如图所示。

2.2 通信功能要求

(1)PC控制单片机IO口输出,并且通过两个LED灯显示数据发收状态,如果数据处于发送或者接收状态,则相应的LED灯闪亮。

(2)PC控制单片机IO口输出,并且通过两个按键控制PC机是否接收数据。

(3)PC机与单片机之间的通信结果通过串口助手进行调试和显示。

第三章硬件电路图的设计

3.1单片机最小系统

由起振电路,复位电路组成

3.2 USB 与单片机连接主电路

其中,两个按键分别控制是否接收数据,两个LED 灯显示接收数据状态,CH341芯片提供串口。

3.3 总电路图

12

3

4

5

6

A

B

C

D

6

5

4

3

2

1

D C

B

A

Title

N u mb er R ev isio n

Size B D ate:3-Ju l-2015Sh eet o f

File:H \B AY A NW EI\原理图D d b D raw n B y A D0/P 0.01A D1/P 0.12A D2/P 0.23A D3/P 0.34A D4/P 0.45A D5/P 0.56A D6/P 0.67A D7/P 0.78R x D 2/CC P1/A D C0/P 1.09Tx D2/C C P0/A DC 1/P1.110EC I/S S/AD C 2/P1.211MO SI/A D C3/P 1.312MISO /A D C4/P 1.413SL CK /AD C 5/P1.514X TA L2/R x D _3/A DC 6/P1.615X TA L1/Tx D_3/AD C 7/P1.716SS _3/MC LK O/R ST/P5.417V CC 18P5.519G n d 20

P3.0/R x D /IN T4/T 2C LK O 21

P3.1/T x D /T 222P3.2/IN T023P3.3/IN T124P3.4/T 0/T1C LK O /E CI_225P3.5/T 1/T0C LK O /C C P0_226P3.6/IN T2/R x D _2/C CP 1_227P3.7/IN T3/Tx D_2/CC P2/C C P2_228P4.1/MISO _329P4.2/W R 30P4.4/R D 31P2.0/A 8/R STO U T_L OW 32P2.1/A 9/SC LK _233P2.2/A 10/MISO _234P2.3/A 11/MO SI_235P2.4/A 12/E CI_3/S S_236P2.5/A 13/C C P0_337P2.6/A 14/C C P1_338P2.7/A 15/C C P2_339P4.5/A LE 40

PD IP-40

J1

ST C15F2K60S2

Y 1

12MHz

C 2

30p F

+

C 647u F

S2

SW -P B

V CC

V CC 19V 3

5

G ND 8V D-7V D+6X 1

9X 0

10

N OS #

20

Tx D 4R x D 3

U 1

C H341

1234

U 2U SB

V CC

C 3C AP

C 4C AP

Y 2

C RY ST AL

C 5C AP

C 7C AP

V CC

D 3

1N 5817

R 3301R

R 13.3k R 23.3k

D 1

LE D

D 2L

E D

S1SW 17S3SW 18

C 1

C AP

3.4 PCB 图

第四章程序设计

4.1 串口初始化

void UartInit(void) //115200bps@22.1184MHz

{

SCON = 0x50; //8位数据可变波特率

AUXR |= 0x40; //定时器1时钟为Fosc,即1T

AUXR &= 0xFE; //串口1选择定时器1为波特率发射生器

TMOD &= 0x0F; //设置定时器1为16位自动重装方式

TL1 = 0xD0; //设定定时初值

TH1 = 0xFF; //设定定时初值

ET1 = 0; //禁止定时器1中断

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

}

4.2 主程序

void main(void)

{

P0M1 = 0; P0M0 = 0; //设置为准双向口

P1M1 = 0; P1M0 = 0; //设置为准双向口

P2M1 = 0; P2M0 = 0; //设置为准双向口

P3M1 = 0; P3M0 = 0; //设置为准双向口

P4M1 = 0; P4M0 = 0; //设置为准双向口

P5M1 = 0; P5M0 = 0; //设置为准双向口

P6M1 = 0; P6M0 = 0; //设置为准双向口

P7M1 = 0; P7M0 = 0; //设置为准双向口

UartInit() ;

//UART1_config(1); // 选择波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer1做波特率.

EA = 1; //允许总中断

ES=1; //开串口中断

PrintString1("STC15F2K60S2 UART1 Test Prgramme!\r\n"); //SUART1

发送一个字符串

while (1)

{ if(INT0==0) //如果相应按键(默认为sw18)按下,则允许接收 {REN=0;}

if((TX1_Cnt != RX1_Cnt) && (!B_TX1_Busy)) //收到数据, 发送空闲

{

SBUF = RX1_Buffer[TX1_Cnt]; //把收到的数据远样返回

B_TX1_Busy = 1;

if(++TX1_Cnt >= UART1_BUF_LENGTH) TX1_Cnt = 0;

}

else{if(INT1==0) //如果相应按键(默认为sw17)按下,则禁止接收 {REN=1;}}

}

}

4.3 中断服务程序

void UART1_int (void) interrupt 4//中断服务子程序

{

if(RI) //如果产生中断,则把SBUF内容赋值给单片机的数组

{

RI = 0;

RX1_Buffer[RX1_Cnt] = SBUF;

if(++RX1_Cnt >= UART1_BUF_LENGTH)

RX1_Cnt = 0; //防溢出

}

if(TI)

{

TI = 0;

B_TX1_Busy = 0;

}

}

4.4 总程序

/************* 功能说明**************

双串口全双工中断方式收发通讯程序。

通过PC向MCU发送数据, MCU收到后通过串口把收到的数据原样返回.

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

#define MAIN_Fosc 22118400L //定义主时钟

#include "STC15Fxxxx.H"

#define Baudrate1 115200L

#define UART1_BUF_LENGTH 200

u8 TX1_Cnt; //发送计数

u8 RX1_Cnt; //接收计数

bit B_TX1_Busy; //发送忙标志

u8 idata RX1_Buffer[UART1_BUF_LENGTH]; //接收缓冲

void UartInit(void) //115200bps@22.1184MHz

{

SCON = 0x50; //8位数据可变波特率

AUXR |= 0x40; //定时器1时钟为Fosc,即1T

AUXR &= 0xFE; //串口1选择定时器1为波特率发射生器

TMOD &= 0x0F; //设置定时器1为16位自动重装方式

TL1 = 0xD0; //设定定时初值

TH1 = 0xFF; //设定定时初值

ET1 = 0; //禁止定时器1中断

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

}

void main(void)

{

P0M1 = 0; P0M0 = 0; //设置为准双向口

P1M1 = 0; P1M0 = 0; //设置为准双向口

P2M1 = 0; P2M0 = 0; //设置为准双向口

P3M1 = 0; P3M0 = 0; //设置为准双向口

P4M1 = 0; P4M0 = 0; //设置为准双向口

P5M1 = 0; P5M0 = 0; //设置为准双向口

P6M1 = 0; P6M0 = 0; //设置为准双向口

P7M1 = 0; P7M0 = 0; //设置为准双向口

UartInit() ;

//UART1_config(1); // 选择波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer1做波特率.

EA = 1; //允许总中断

ES=1; //开串口中断

PrintString1("STC15F2K60S2 UART1 Test Prgramme!\r\n"); //SUART1

发送一个字符串

while (1)

{ if(INT0==0)

{REN=0;}

if((TX1_Cnt != RX1_Cnt) && (!B_TX1_Busy)) //收到数据, 发送空闲

{

SBUF = RX1_Buffer[TX1_Cnt]; //把收到的数据远样返回

B_TX1_Busy = 1;

if(++TX1_Cnt >= UART1_BUF_LENGTH) TX1_Cnt = 0;

}

else{if(INT1==0)

{REN=1;}}

}

}

void UART1_int (void) interrupt 4//中断服务子程序

{

if(RI)

{

RI = 0;

RX1_Buffer[RX1_Cnt] = SBUF;

if(++RX1_Cnt >= UART1_BUF_LENGTH)

RX1_Cnt = 0; //防溢出

}

if(TI)

{

TI = 0;

B_TX1_Busy = 0;

}

}

第五章总结与体会

串行通信端口在系统控制的范畴中一直占据着及其重要的地位,它不仅没有因为时代的进步而遭淘汰,反而在规格上越来越完善,应用也越来越广泛。作为一种基本而又灵活方便的通信方式,串口通信被广泛应用于PC与PC或者PC与单片机之间的数据交换以及其他工业控制与自动控制中。

随着单片机和微机技术的不断发展,由PC机和多台单片机构成的多机网络监控系统已成为单片机技术发展的一个方向。它结合了单片机在实时数据采集和微机对图形处理、显示的优点。同时,Windows环境下后台微机在数据库管理上具有明显的优势,二者结合,使得单片机的应用已不仅仅局限于传统意义上的自动监测或控制,而形成了向以网络为核心的分布式多点系统发展的趋势。

随着计算机技术尤其是单片微型机技术的发展,人们已越来越多地采用单片机来对一些工业控制系统中如温度、流量和压力等参数进行检测和控制。PC机具有强大的监控和管理功能,而单片机则具有快速及灵活的控制特点,通过PC 机的RS-232串行接口与外部设备进行通信,是许多测控系统中常用的一种通信解决方案。但是USB接口逐步取代RS-232(DB-9)串口已是大势所趋,单片机同计算机的USB通信在实际工作中的应用范围也将越来越广。本文所介绍的单片机和PC机的USB通信方法,具有电路简单,兼容性好,可移植性强等特点,故可作为单片机同计算机的USB通信模块广泛应用于工业和电子产品的开发中。

第六章参考文献

[1]于永.15系列单片机C语言常用模块与综合系统设计.电子工业出版社,2007

[2]丁向荣.单片微机原理与接口技术.电子工业出版社,2010

[3]郭天祥.《新概念51单片机C语言教程》.北京:电子工业出版社

[4]袁新艳.计算机外设与接口技术[M].高等教育出版社,2009.

基于单片机的数据串口通信研究

龙源期刊网 https://www.wendangku.net/doc/9514853799.html, 基于单片机的数据串口通信研究 作者:蒋信 来源:《电子技术与软件工程》2016年第06期 摘要科技的发展日新月异,机电一体化的发展对自动化系统的可靠性提出了更高的要 求,在这样的背景下,单片机在工业控制领域的应用越来越广泛也越来越重要。基于以上,本文从通信过程、显示设计、键盘接口等方面研究了基于单片机的数据串口通信。 【关键词】单片机数据串口通信研究 在计算机控制领域中,计算机与外设数据之间的通信主要依靠单片机来实现,单片机的串口功能能够实现数据的传输以及分析,这就属于串口通信,可以预见的是,单片机的数据串口通信将会得到更广泛的应用,单片机之间的通信也有赖于其数据串口通信功能。基于以上,本文简要研究了基于单片机的数据串口通信。 1 串口通信的实现方式 设备在实现通信的过程中,必须树立一个信息接发双方都认可的通信方式,只有这样才能够保证信息在传送的过程中不发生冲突,才能够实现设备之间的通信,对于串口通信来说,主要有以下两种方式。 1.1 异步通信方式 异步通信方式实现的过程中,数据传输方式为独立字节的形式,不同的字节前端有着不同的起始信号,不同字节的后端则会有不同的终止信号,起始信号只能是一个,而终止信号可以是一个也可以是多个。数据传输过程中,字节进行移动,一个字节的迁移过程表示一个字节的传输过程,传输之前使用起始信号进行传输,传输结束之后使用终止信号将传输线调回标准状态,一个字节传输完毕后进行下一个字节的传输,字节传输有着连续性,这就是异步传输方式。由于没一个字节都要附加起始信号信息和终止信号信息,因此异步传输方式的效率较低,但异步通信方式容许一定程度的频率漂移,有着一定的误差缓冲作用。 1.2 同步通信方式 同步通信方式指的是将所有字符和字节连接在一起进行传输的一种通信方式,多个字符相互连接组成数据块,在数据块前增加同步字符,以同步字符作为传输起始信号,在传输后增加校验字符,以校验字符作为传输终止信号,以此来校验传输过程中的错误和误差,数据块中的各个字符之间没有间隔,相较于异步通信方式来说,其传输效率较高,但其对于信息接收端和信息发送端的同步性要求较高,因此硬件的复杂程度也就更高。 2 基于单片机的数据串口通信

51单片机串口通信,232通信,485通信,程序

51单片机串口通信,232通信,485通信,程序代码1:232通信 #include #define uchar unsigned char #define uint unsigned int uchar flag,a,i; uchar code table[]="i get"; void init() { TMOD=0X20; TH1=0XFD; TH0=0XFD; TR1=1; REN=1; SM0=0; SM1=1; EA=1; ES=1; } void main() { init();

while(1) { if(flag==1) { ES=0; for(i=0;i<6;i++) { SBUF=table[i]; while(!TI); TI=0; } SBUF=a; while(!TI); TI=0; ES=1; flag=0; } } } void ser() interrupt 4 {

RI=0; a=SBUF; flag=1; } 代码2:485通信 #include #include"1602.h" #define uchar unsigned char #define uint unsigned int unsigned char flag,a,i; uchar code table[]="i get "; void init() { TMOD=0X20; TH1=0Xfd; TL1=0Xfd; TR1=1; REN=1; SM0=0; SM1=1; EA=1; ES=1;

} void main() { init_1602(); init(); while(1) { if(flag==1) { display(0,a); } } } void ser() interrupt 4 { RI=0; a=SBUF; flag=1; } Love is not a maybe thing. You know when you love someone.

两个单片机之间的串行通信

两个单片机之间的串行通信 一、设计要求 在某个控制系统中有U1、U2这两个单片机,U1单片机首先将P1端口指拨开关数据载入SBUF,然后经由TXD将数据传送给U2单片机,U2单片机将接收数据存入SBUF,再由SBUF载入累加器,并输出至P1端口,点亮相应端口的LED。 二、实验所需元器件 三、电路原理图: 两个单片机之间的串行通信电路图

四、程序设计 这两个单片机均工作在半工状态,U1将P1端口的状态通过TXD发半空给U2,而U2接收U1的数据,然后控制P1端口的LED显示。因此,需编写两个不同的程序,其程序流程图如下所示:

五、C语言程序: U1的C语言程序: #include "reg51.h" #define uint unsigned int #define uchar unsigned char void send(uchar state) { SBUF=state; while(TI==0); TI=0; } void SCON_init(void) { SCON=0x50; TMOD=0x20; PCON=0x00; TH1=0xfd; TL1=0xfd; TI=0; TR1=1; ES=1; } void main() { P1=0xff; SCON_init(); while(1) { send(P1); } } U2的C语言程序: #include "reg51.h" #define uint unsigned int #define uchar unsigned char uchar state; void receive() { while(RI==0) state=SBUF; RI=0; } void SCON_init(void) { SCON=0x50; TMOD=0x20; PCON=0x00; TH1=0xfd; TL1=0xfd; RI=0; TR1=1; } void main() { SCON_init(); while(1) { receive(); P1=state; } } 六、调试与仿真:

基于单片机的串口通信模块设计

1 绪论 1.1 研究背景 通信是指不同的独立系统利用线路互相交换数据,它的主要目的是将数据从一端传送到另一端,实现数据的交换。在现代工业控制中,通常采用计算机作为上位机与下层的实时控制与监测设备进行通讯。现场数据必须通过一个数据收集器传给上位机,同样上位机向现场设备发命令也必须通过数据收集器。串行通信因其结构简单、执行速度快、抗干扰能力强等优点,已被广泛应用于数据采集和过程控制等领域。 计算机与外界的信息交换称为通信。基本的通信方式有并行通信和串行通信两种。串行通信是指一条信息额各位数据被逐位按顺序传送的通信方式。串行通信的特点是:数据位传送,按位顺序进行,最少只需要一根传输线即可完成,成本低但传送速度快,串行通信的距离可以从几米到几千米。 随着计算机技术尤其是单片微型机技术的发展,人们已越来越多地采用单片机来对一些工业控制系统中如温度、流量和压力等参数进行监测和控制。PC机具有强大的监控和管理能力,而单片机则具有快速及灵和的控制特点,通过PC 机的RS-232串行接口与外部设备进行通信,是许多测控系统中常用的一种通信解决方案。而随着USB接口技术的成熟和使用的普及,由于USB 接口有着 RS-232(DB-9)串口无法比拟的优点,RS-232(DB-9)串口正在逐步地为USB 接口所替代。而在现在的大多数笔记本电脑中,出于节省物理空间和用处不大等原因,RS-232(DB-9)串口已不再设置,这就约束了基于RS-232(DB-9)串口与PC 机联络的单片机设备的使用围。当前USB接口逐步取代RS-232(DB-9)串口已是大势所趋,单片机同计算机的USB通信在实际工作中的应用围也将越来越广。本文所介

单片机串口通信的发送与接收(可编辑修改word版)

51 单片机的串口,是个全双工的串口,发送数据的同时,还可以接收数据。 当串行发送完毕后,将在标志位TI 置1,同样,当收到了数据后,也会在RI 置1。无 论RI 或TI 出现了1,只要串口中断处于开放状态,单片机都会进入串口中断处理程序。在中断程序中,要区分出来究竟是发送引起的中断,还是接收引起的中断,然后分别进行处理。 看到过一些书籍和文章,在串口收、发数据的处理方法上,很多人都有不妥之处。 接收数据时,基本上都是使用“中断方式”,这是正确合理的。 即:每当收到一个新数据,就在中断函数中,把RI 清零,并用一个变量,通知主函数, 收到了新数据。 发送数据时,很多的程序都是使用的“查询方式”,就是执行while(TI ==0); 这样的语句来 等待发送完毕。 这时,处理不好的话,就可能带来问题。 看了一些网友编写的程序,发现有如下几条容易出错: 1.有人在发送数据之前,先关闭了串口中断!等待发送完毕后,再打开串口中断。 这样,在发送数据的等待期间内,如果收到了数据,将不能进入中断函数,也就不会保存的这个新收到的数据。 这种处理方法,就会遗漏收到的数据。 2.有人在发送数据之前,并没有关闭串口中断,当TI = 1 时,是可以进入中断程序的。 但是,却在中断函数中,将TI 清零! 这样,在主函数中的while(TI ==0);,将永远等不到发送结束的标志。 3.还有人在中断程序中,并没有区分中断的来源,反而让发送引起的中断,执行了接收 中断的程序。 对此,做而论道发表自己常用的方法: 接收数据时,使用“中断方式”,清除RI 后,用一个变量通知主函数,收到新数据。 发送数据时,也用“中断方式”,清除TI 后,用另一个变量通知主函数,数据发送完毕。 这样一来,收、发两者基本一致,编写程序也很规范、易懂。 更重要的是,主函数中,不用在那儿死等发送完毕,可以有更多的时间查看其它的标志。 实例: 求一个PC 与单片机串口通信的程序,要求如下: 1、如果在电脑上发送以$开始的字符串,则将整个字符串原样返回(字符串长度不是固定的)。

基于51单片机的双机串行通信

河南机电高等专科学校2015-2016学年第1学期通信实训报告 系别:电子通信工程系 班级:xxxxxx 学号:13xxxxxxxxx 姓名:xxxxxxx 2015年12月

基于51单片机的双机串行通信 摘要:串行通信是单片机的一个重要应用,本次课程设计就是要利用单片机来完成一个系统,实现爽片单片机床航通信,通信的结果使用数码管进行显示,数码管采用查表方式显示,两个单片机之间采用RS-232进行双击通信。在通信过程中,使用通信协议进行通信。 关键字:通信双机 一、总体设计 1设计目的 1.通过设计相关模块充分熟悉51单片机的最小系统的组成和原理; 2.通过软件仿真熟悉keil和proteus的配合使用; 3.通过软件编程熟悉51的C51编程规范; 4.通过实际的硬件电路搭设提高实际动手能力。 2.设计要求: 两片单片机之间进行串行通信,A机将0x06发送给B机,在B机的数码管上静态显示1,B机将0~f动态循环发送到A机,并在其数码管上显示。 3.设计方案: 软件部分,通过通信协议进行发送接收,A机先送0x06(B机数码管显示1)给B机(B机静态显示),当从机接收到后,向B机发送代表0-f的数码管编码数组。B收到0x06后就把数码表TAB[16]中的数据送给从机。 二、硬件设计

1.51单片机串行通信功能 计算机与外界的信息交换称为通信,常用的通信方式有两种:并行通信和串行通信。51单片机用4个接口与外界进行数据输入与数据输出就是并行通信,并行通信的特点是传输信号的速度快,但所用的信号线较多,成本高,传输的距离较近。串行通信的特点是只用两条信号线(一条信号线,再加一条地线作为信号回路)即可完成通信,成本低,传输的距离较远。 51单片机的串行接口是一个全双工的接口,它可以作为UART(通用异步接受和发送器)用,也可以作为同步移位寄存器用。51单片机串行接口的结构如下: 图1.AT89C51(52) (1)数据缓冲器(SBUF) 接受或发送的数据都要先送到SBUF缓存。有两个,一个缓存,另一个接受,

第06章单片机串行通信系统习题解答

第6章单片机串行通信系统习题解答 一、填空题 1.在串行通信中,把每秒中传送的二进制数的位数叫波特率。 2.当SCON中的M0M1=10时,表示串口工作于方式 2 ,波特率为 fosc/32或fosc/64 。 3.SCON中的REN=1表示允许接收。 4.PCON 中的SMOD=1表示波特率翻倍。 5.SCON中的TI=1表示串行口发送中断请求。 6.MCS-51单片机串行通信时,先发送低位,后发送高位。 7.MCS-51单片机方式2串行通信时,一帧信息位数为 11 位。 8.设T1工作于定时方式2,作波特率发生器,时钟频率为,SMOD=0,波特率为时,T1的初值为 FAH 。 9.MCS-51单片机串行通信时,通常用指令 MOV SBUF,A 启动串行发送。 10.MCS-51单片机串行方式0通信时,数据从引脚发送/接收。 二、简答题 1.串行口设有几个控制寄存器它们的作用是什么 答:串行口设有2个控制寄存器,串行控制寄存器SCON和电源控制寄存器PCON。其中PCON中只有的SMOD与串行口的波特率有关。在SCON中各位的作用见下表: 2.MCS-51单片机串行口有几种工作方式各自的特点是什么 答:有4种工作方式。各自的特点为:

3.MCS-51单片机串行口各种工作方式的波特率如何设置,怎样计算定时器的初值 答:串行口各种工作方式的波特率设置: 工作方式O :波特率固定不变,它与系统的振荡频率fosc 的大小有关,其值为fosc/12。 工作方式1和方式3:波特率是可变的,波特率=(2SMOD/32)×定时器T1的溢出率 工作方式2:波特率有两种固定值。 当SM0D=1时,波特率=(2SM0D/64)×fosc=fosc/32 当SM0D=0时,波特率=(2SM0D/64)×fosc=fosc/64 计算定时器的初值计算: 4.若fosc = 6MHz ,波特率为2400波特,设SMOD =1,则定时/计数器T1的计数初值为多少并进行初始化编程。 答:根据公式 N=256-2SMOD ×fosc /(2400×32×12)= ≈243 =F3H TXDA: MOV TMOD,#20H ;置T1定时器工作方式2 MOV TL1,#0F3H ;置T1计数初值. MOV TH1,#0F3H B f B f N OSC SMOD OSC SMOD ??-=???-=384225612322256

单片机串口通信C程序及应用实例

一、程序代码 #include//该头文件可到https://www.wendangku.net/doc/9514853799.html,网站下载#define uint unsigned int #define uchar unsigned char uchar indata[4]; uchar outdata[4]; uchar flag; static uchar temp1,temp2,temp3,temp; static uchar R_counter,T_counter; void system_initial(void); void initial_comm(void); void delay(uchar x); void uart_send(void); void read_Instatus(void); serial_contral(void); void main() { system_initial(); initial_comm(); while(1) { if(flag==1) { ES = 0; serial_contral(); ES = 1; flag = 0; } else read_Instatus(); } } void uart_send(void) { for(T_counter=0;T_counter<4;T_counter++) { SBUF = outdata[T_counter]; while(TI == 0);

TI = 0; } T_counter = 0; } uart_receive(void) interrupt 4 { if(RI) { RI = 0; indata[R_counter] = SBUF; R_counter++; if(R_counter>=4) { R_counter = 0; flag = 1; } } } void system_initial(void) { P1M1 = 0x00; P1M0 = 0xff; P1 = 0xff; //初始化为全部关闭 temp3 = 0x3f;//初始化temp3的值与六路输出的初始值保持一致 temp = 0xf0; R_counter = 0; T_counter = 0; } void initial_comm(void) { SCON = 0x50; //设定串行口工作方式:mode 1 ; 8-bit UART,enable ucvr TMOD = 0x21; //TIMER 1;mode 2 ;8-Bit Reload PCON = 0x80; //波特率不加倍SMOD = 1 TH1 = 0xfa; //baud: 9600;fosc = 11.0596 IE = 0x90; // enable serial interrupt TR1 = 1; // timer 1 RI = 0; TI = 0; ES = 1; EA = 1; }

51单片机实现的485通讯程序

51单片机实现的485通讯程序 #ifndef __485_C__ #define __485_C__ #include #include #define unsigned char uchar #define unsigned int uint /* 通信命令*/ #define __ACTIVE_ 0x01 // 主机询问从机是否存在 #define __GETDATA_ 0x02 // 主机发送读设备请求 #define __OK_ 0x03 // 从机应答 #define __STATUS_ 0x04 // 从机发送设备状态信息 #define __MAXSIZE 0x08 // 缓冲区长度 #define __ERRLEN 12 // 任何通信帧长度超过12则表示出错uchar dbuf[__MAXSIZE]; // 该缓冲区用于保存设备状态信息uchar dev; // 该字节用于保存本机设备号 sbit M_DE = P1^0; // 驱动器使能,1有效 sbit M_RE = P1^1; // 接收器使能,0有效

void get_status(); // 调用该函数获得设备状态信息,函数代码未给出 void send_data(uchar type, uchar len, uchar *buf); // 发送数据帧 bit recv_cmd(uchar *type); // 接收主机命令,主机请求仅包含命令信息 void send_byte(uchar da); // 该函数发送一帧数据中的一个字节,由send_data()函数调用void main() { uchar type; uchar len; /* 系统初始化*/ P1 = 0xff; // 读取本机设备号 dev = (P1>>2); TMOD = 0x20; // 定时器T1使用工作方式2 TH1 = 250; // 设置初值 TL1 = 250; TR1 = 1; // 开始计时 PCON = 0x80; // SMOD = 1 SCON = 0x50; // 工作方式1,波特率9600bps,允许接收 ES = 0; // 关闭串口中断 IT0 = 0; // 外部中断0使用电平触发模式 EX0 = 1; // 开启外部中断0

基于51单片机的双机串行通信课程设计 1000110061

基于AT89C51单片机的双机串行通信设计 姓名:杨应伟 学号:100110061 专业:机械设计制造及其制动化 班级:机电二班

前言 单片机广泛应用于仪器仪表、家用电器、医用设备、航空航天、专用设备的智能化管理及过程控制等领域随着计算机技术的发展及工业自动化水平的提高, 在许多场合采用单机控制已不能满足现场要求,因而必须采用多机控制的形式,而多机控制主要通过多个单片机之间的串行通信实现。串行通信作为单片机之间常用的通信方法之一, 由于其通信编程灵活、硬件简洁并遵循统一的标准, 因此其在工业控制领域得到了广泛的应用。 在测控系统和工程应用中,常遇到多项任务需同时执行的情况,因而主从式多机分布式系统成为现代工业广泛应用的模式。单片机功能强、体积小、价格低廉、开发应用方便,尤其具有全双工串行通讯的特点,在工业控制、数据采集、智能仪器仪表、家用电器方面都有广泛的应用。同时,IBM-PC机正好补充单片机人机对话和外围设备薄弱的缺陷。各单片机独立完成数据采集处理和控制任务,同时通过通信接口将数据传给PC机,PC机将这些数据进行处理、显示或打印,把各种控制命令传给单片机,以实现集中管理和最优控制。串行通信是单片机的一个重要应用,本次课程设计就是要利用单片机来完成一个系统,实现爽片单片机床航通信,通信的结果使用数码管进行显示,数码管采用查表方式显示,两个单片机之间采用RS-232进行双击通信。 在通信过程中,使用通信协议进行通信。在测控系统和工程应用中,常遇到多项任务需同时执行的情况,因而主从式多机分布式系统成为现代工业广泛应用的模式。单片机功能强、体积小、价格低廉、开发应用方便,尤其具有全双工串行通讯的特点,在工业控制、数据采集、智能仪器仪表、家用电器方面都有广泛的应用。同时,IBM-PC机正好补充单片机人机对话和外围设备薄弱的缺陷。各单片机独立完成数据采集处理和控制任务,同时通过通信接口将数据传给PC机,PC机将这些数据进行处理、显示或打印,把各种控制命令传给单片机,以实现集中管理和最优控制。 串行通信是单片机的一个重要应用,本次课程设计就是要利用单片机来完成一个系统,实现爽片单片机床航通信,通信的结果使用数码管进行显示,数码管采用查表方式显示,两个单片机之间采用RS-232进行双击通信。在通信过程中,使用通信协议进行通信。

单片机与PC机串口通信实现正文

毕业设计(论文)课题:单片机与PC机串口通信实现 学生: 孙波系部: 通信工程 班级: 通信1301 学号: 2013120325 指导教师: 童华 装订交卷日期: 2016年x月x日 装订顺序: (1)封面(2)毕业设计(论文)成绩评定记录(3)标题、中文摘要及关键词(4)正文(5)附录(6)参考文献

毕业设计(论文)成绩评定记录表 注:1.此表适用于不参加毕业答辩学生的毕业设计(论文)成绩评定; 2.平时成绩占40%、卷面评阅成绩占60%,在上面的评分表中,可分别按40分、60分来量化评分,二项相加所得总分即为总评成绩,总评成绩请转换为优秀、良好、中等、及格、不及格五等级计分。 教务处制

重庆电子工程职业学院 毕业设计(论文)开题报告 系别通信工程专业通信技术班级通信1301 学生姓名孙波学号2013120325 指导教师童华 一、毕业设计的内容和意义: 目前,随着计算机和微电子技术的高速发展,单片机在国民经济的各个领域的智能化控制中得到了非常广泛的应用。单片机已成为信息处理、物联网络、通信设备、工业控制、家用电器等各个领域不可缺少的智能部件。在一些工业控制中,经常需要以单片机作为下位机执行对被控对象的直接控制,以PC机为上位机完成复杂的数据处理,组成主从式控制系统。 为了提高系统管理的先进性,计算机工业自动控制和监测系统越来越多的采用主从式系统。较为常见的形式是由一台做管理用的上位机计算机(主机)和一台直接参与控制检测的下位机单片机(从机)构成的主从式系统,主机和从机之间以通讯的方式来协调工作。主机的作用一是向从机发送各种命令及参数;二是要及时收集、整理和分析从机发回的数据,供进一步的决策。从机被动的接收、执行主机发

基于51单片机的双机串行通信

机电高等专科学校2015-2016学年第1学期通信实训报告 系别:电子通信工程系 班级: xxxxxx 学号: 13xxxxxxxxx : xxxxxxx 2015年12月

基于51单片机的双机串行通信 摘要:串行通信是单片机的一个重要应用,本次课程设计就是要利用单片机来完成一个系统,实现爽片单片机床航通信,通信的结果使用数码管进行显示,数码管采用查表方式显示,两个单片机之间采用RS-232进行双击通信。在通信过程中,使用通信协议进行通信。 关键字:通信双机 一、总体设计 1设计目的 1.通过设计相关模块充分熟悉51单片机的最小系统的组成和原理; 2.通过软件仿真熟悉keil和proteus的配合使用; 3.通过软件编程熟悉51的C51编程规; 4.通过实际的硬件电路搭设提高实际动手能力。 2.设计要求: 两片单片机之间进行串行通信,A机将0x06发送给B机,在B机的数码管上静态显示1,B机将0~f动态循环发送到A机,并在其数码管上显示。 3.设计方案: 软件部分,通过通信协议进行发送接收,A机先送0x06(B机数码管显示1)给B机(B机静态显示),当从机接收到后,向B机发送代表0-f的数码管编码数组。B收到0x06后就把数码表TAB[16]中的数据送给从机。 二、硬件设计 1.51单片机串行通信功能 计算机与外界的信息交换称为通信,常用的通信方式有两种:并行通信和串行通信。51单片机用4个接口与外界进行数据输入与数据输出就是并行通信,并行通信的特点是传输信号的速度快,但所用的信号线较多,成本高,传输的距离较近。串行通信的特点是只用两条信号线(一条信号线,再加一条地线作为信号回路)即可完成通信,成本低,传输的距离较远。 51单片机的串行接口是一个全双工的接口,它可以作为UART(通用异步接受和发送器)用,也可以作为同步移位寄存器用。51单片机串行接口的结构如下:

基于单片机C#串口通信

基于C#与单片机串口通信的投票器 李浩东20093101004 周守悦20093101012 一.作品的设计概述 我们知道每年每个班都需要班委换届,有很多同学积极参加竞选,然而每一次竞选投票都是大家拿出一张纸,然后再纸上写上自己心目中班委的名字,然后交给监票读票记票,这个过程不仅大大浪费了大家的宝贵时间,还有可能出现漏票等情况,体现不了公平公正公开。 本设计是通过按钮给班委竞选人投票,每个候选人都对应一个按钮,投票人如果想投票给某个人可以按下其对应按钮,每按下一次改竞选人的票数就会自动增加1,每个人只能按下一次,电脑显示屏将通过柱形图动态的呈现每个候选人获得票数竞争的情况以及通过框图显示总票数,不仅使得投票结果更加公开公正,而且也大大节省了大家的时间。本设计的创新点是通过柱形图动态显示整个投票过程,而不是直接显示到最后投票结果,更加体现公正公开。 二.作品的设计与分析 1.主要功能与分析 主要使用单片机和PC机之间的串口通信,在单片机硬件上设置七个按键,其中四个键是用来给A,B,C,D四个人投票的,这四个按键每按下一次就自动增1,记录这四个按键按下的总次数num1,num2,num3,num4,并把四个数按顺序不断循环通过串口发给PC机,PC 机通过串口把这些数据存储下来,并读出来,通过C#编程,把这四个人所获得的总票数在picturebox控件上面的柱形图动态呈现出来,通过time控件,不断更新这个人所获得的票数,让投票人通过柱形图更加形象直观的看出每个被投票人的竞争情况,同时在柱形图下方有着这四个人获得总票数的真实数目。还有一个按键是票数清零,如果这次投票已经完成或者无效可以按下这个按键,此时A,B,C,D四个人的总票数将变成零。还有一个按键作用是停止投票,如果需要停止这次投票可以按下此键,这时候那四个投票的按键将不可用。最后一个按键的作用是继续投票,如需继续投票,可按此键。其系统设计图如下: 2.串口通信规则 单片机与PC机为了可以进行通信,必须要遵守一定的通信规则,这个共同的规则就是通信端口的初始化。通信端口的初始化有以下几项必须设置: (1)数据的传输速率 传输双方通过传输线的电压改变来交换数据,但传输线的电压改变的速度必须和接收端的接收速度保持一致,RS-232通常用于异步传输,即双方并没有一个可参考的同步时钟作为基准。由于没有一个参考时钟,双方所发送的高低电位到底代表几个位就不得而知了,

51单片机与串口通信代码

51单片机与串口通信代码 2011年04月22日 17:18 本站整理作者:佚名用户评论(0) 关键字:串口通信(35) 串口调试 1. 发送:向总线上发命令 2. 接收:从总线接收命令,并分析是地址还是数据。 3. 定时发送:从内存中取数并向主机发送. 经过调试,以上功能基本实现,目前可以通过上位机对单片机进行实时控制。 程序如下: //这是一个单片机C51串口接收(中断)和发送例程,可以用来测试51单片机的中断接收 //和查询发送,另外我觉得发送没有必要用中断,因为程序的开销是一样的 #i nclude #i nclude #i nclude #define INBUF_LEN 4 //数据长度 unsigned char inbuf1[INBUF_LEN]; unsigned char checksum,count3 , flag,temp,ch; bit read_flag=0; sbit cp=P1^1; sbit DIR=P1^2; int i; unsigned int xdata *RAMDATA; /*定义RAM地址指针*/ unsigned char a[6] ={0x11,0x22,0x33,0x44,0x55,0x66} ; void init_serialcomm(void) { SCON=0x50; //在11.0592MHz下,设置串行口波特率为9600,方式1,并允许接收

PCON=0x00; ES=1; TMOD=0x21; //定时器工作于方式2,自动装载方式 TH0=(65536-1000)%256; TL0=(65536-1000)/256; TL1=0xfd; TH1=0xfd; ET0=1; TR0=1; TR1=1; // TI=0; EA=1; // TI=1; RAMDATA=0x1F45; } void serial () interrupt 4 using 3 { if(RI) { RI=0; ch=SBUF; TI=1; //置SBUF空 switch(ch) { case 0x01 :printf("A"); TI=0;break; case 0x02 :printf("B"); TI=0;break; case 0x03 :printf("C"); TI=0;break;

51单片机串口通信

一、串口通信原理 串口通讯对单片机而言意义重大,不但可以实现将单片机的数据传输到计算机端,而且也能实现计算机对单片机的控制。由于其所需电缆线少,接线简单,所以在较远距离传输中,得到了广泛的运用。串口通信的工作原理请同学们参看教科书。 以下对串口通信中一些需要同学们注意的地方作一点说明: 1、波特率选择 波特率(Boud Rate)就是在串口通信中每秒能够发送的位数(bits/second)。MSC-51串行端口在四种工作模式下有不同的波特率计算方法。其中,模式0和模式2波特率计算很简单,请同学们参看教科书;模式1和模式3的波特率选择相同,故在此仅以工作模式1为例来说明串口通信波特率的选择。 在串行端口工作于模式1,其波特率将由计时/计数器1来产生,通常设置定时器工作于模式2(自动再加模式)。在此模式下波特率计算公式为:波特率=(1+SMOD)*晶振频率/(384*(256-TH1)) 其中,SMOD——寄存器PCON的第7位,称为波特率倍增位; TH1——定时器的重载值。 在选择波特率的时候需要考虑两点:首先,系统需要的通信速率。这要根据系统的运作特点,确定通信的频率范围。然后考虑通信时钟误差。使用同一晶振频率在选择不同的通信速率时通信时钟误差会有很大差别。为了通信的稳定,我们应该尽量选择时钟误差最小的频率进行通信。 下面举例说明波特率选择过程:假设系统要求的通信频率在20000bit/s以下,晶振频率为12MHz,设置SMOD=1(即波特率倍增)。则TH1=256-62500/波特率 根据波特率取值表,我们知道可以选取的波特率有:1200,2400,4800,9600,19200。列计数器重载值,通信误差如下表: 因此,在通信中,最好选用波特率为1200,2400,4800中的一个。 2、通信协议的使用 通信协议是通信设备在通信前的约定。单片机、计算机有了协议这种约定,通信双方才能明白对方的意图,以进行下一步动作。假定我们需要在PC机与单片机之间进行通信,在双方程式设计过程中,有如下约定:0xA1:单片机读取P0端口数据,并将读取数据返回PC机;0xA2:单片机从PC机接收一段控制数据;0xA3:单片机操作成功信息。 在系统工作过程中,单片机接收到PC机数据信息后,便查找协议,完成相应的操作。当单片机接收到0xA1时,读取P0端口数据,并将读取数据返回PC机;当单片机接收到0xA2时,单片机等待从PC机接收一段控制数据;当PC机接收到0xA3时,就表明单片机操作已经成功。 3、硬件连接 51单片机有一个全双工的串行通讯口,所以单片机和计算机之间可以方便地进行串口通讯。进行串行通讯时要满足一定的条件,比如计算机的串口是RS232电平的,而单片机的串口是TTL电平的,两者之间必须有一个电平转换电路,我们采用了专用芯片MAX232进行转换,虽然也可以用几个三极管进行模拟转换,但是还是用专用芯片更简单可靠。我们采用了三线制连接串口,也就是说和计算机的9针串口只连接其中的3根线:第5脚的GND、第2脚的RXD、第3脚的TXD。这是最简单的连接方法,但是对我们来说已经足够使用了,电路如下图所示,MAX232的第10脚和单片机的11脚连接,第9脚和单片机的10脚连接,第15脚和单片机的20脚连接。

51单片机串口通信讲解

51系列单片机串口通信实例教程 单片机的串口通信看起来是很复杂的,主要是因为他用到了更多的寄存器,与前面的知识相比他更具综合能力,写起来考虑的问题自然也变多了.而前面学习过的定时器与中断将是单片机通信的基础. 单片机的中断系统中第4个中断就是串口中断,要进行串口通信首先就要打开CPU总中断EA,还要打开串口通信中断ES,这是串口通信的前堤,而串口通信也跟计时器一样有很多的模式,因此我们还要设置SCON寄存器来指定采用哪一种方式进行通信,而在通信的过程中,我们还要设定通信的波特率,不然的话,单片机是没办法进行采样的,这样也不会得到正确的结果了.我在实验过程中用到的是1号定时器来设定的波特率,用到了计时器方式2,也就是8位自动重装,这样可以简化编程,她的实现思想就是将常数放入TH,而TL中则是初始化参数,当溢出时,单片机会自动将TH中的常数装入TL中. 再来说说波特率,我们为什么要设定波特率,因为单片机会以16倍波特率的速度进行采样,而在实验中我们用的是10位异步收发方式,因此要将SM0置0,SM1置1.而其中的10位

有8位数据位,第一位和最后一位是发送数据的起始与结束.采用高的皮特率就不会出错啦.而波特率是有一个公式的: 方式0的波特率 = fosc/12 方式2的波特率 =(2SMOD/64)· fosc 方式1的波特率 =(2SMOD/32)·(T1溢出率) 方式3的波特率 =(2SMOD/32)·(T1溢出率) T1 溢出率= fosc /{12×[256 -(TH1)]} 根据公式我们很容易就算出当晶振为110592HZ时,要达到9600的波特率,我们只需要将TL1置FDH即可,如下图: 除此之外,你还要将SCON中的REN位置1,不然的话,单片机是不会接收数据的. 还有不要忘了选择定时器的工作方式,设置TMOD为0x20既是工作方式2,8位自动重装定时器. 这样一来,初始批工作算是差不多了.而串口通信分为中断方式,和查询方式,如果你想用查询方式你也不用设置IE寄存器了. 在串口通信中,还有一个很重要的寄存器SBUF,其实也不是一个,是两个,只是它们共用同一个地址,再热气表达式的不同,单片机会自动选择使用哪一个SBUF. 下面是我写的一个例子程序,产生的效果是:向单片机发送任一个0~255之间的数,将会被显示到数码管上.并且单片机还会自动把刚才传过去的数又发送回来 ,实验过程中用到了几个工具如下:

单片机串行通信

45 甲机通过串口控制乙机LED /* 名称:甲机发送控制命令字符 说明:甲单片机负责向外发送控制命令字符“A”、“B”、“C”,或者停止发送,乙机根据所接收到的字符完成LED1闪烁、LED2闪烁、双闪烁、或停止闪烁。 */ #include<> #define uchar unsigned char #define uint unsigned int sbit LED1=P0^0; sbit LED2=P0^3; sbit K1=P1^0; 3f4f7f6f.\r\n"); Puts_to_SerialPort("-------------------------------\r\n"); DelayMS(50); while(1) { Putc_to_SerialPort(c+'A'); DelayMS(100); Putc_to_SerialPort(' '); DelayMS(100); if(c==25) //每输出一遍后加横线 { Puts_to_SerialPort("\r\n-------------------------------\r\n"); DelayMS(100); } c=(c+1)%26; if(c%10==0) //每输出10个字符后换行

{ Puts_to_SerialPort("\r\n"); DelayMS(100); } } } 48 单片机与PC通信 /* 名称:单片机与PC通信 说明:单片机可接收PC发送的数字字符,按下单片机的K1键后,单片机可向PC发送字符串。在Proteus环境下完成本实验时,需要安装Virtual Serial Port Driver和串口调试助手。本例缓冲100个数字字符,缓冲满后新数字从前面开始存放(环形缓冲)。 */ #include<> #define uchar unsigned char #define uint unsigned int uchar Receive_Buffer[101]; //接收缓冲 uchar Buf_Index=0; //缓冲空间索引 //数码管编码 uchar code DSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00}; //延时 void DelayMS(uint ms) { uchar i; while(ms--) for(i=0;i<120;i++); } //主程序 void main() { uchar i; P0=0x00; Receive_Buffer[0]=-1; SCON=0x50; //串口模式1,允许接收 TMOD=0x20; //T1工作模式2 TH1=0xfd; //波特率9600 TL1=0xfd; PCON=0x00; //波特率不倍增 EA=1;EX0=1;IT0=1; ES=1;IP=0x01; TR1=1;

51单片机串口通信(相关例程)

51单片机串口通信 1./*打开串口调试程序,将波特率设置为9600,无奇偶校验 晶振11.0592MHz,发送和接收使用的格式相同,如都使用 字符型格式,在发送框输入hello,I Love MCU ,在接 收框中同样可以看到相同字符,说明设置和通信正确*/ #include /*主程序*/ void main (void) { SCON = 0x50; /* SCON: 模式1, 8-bit UART, 使能接收*/ TMOD |= 0x20; /* TMOD: timer 1, mode 2, 8-bit reload*/ TH1 = 0xFD; /* TH1: reload value for 9600 baud @ 11.0592MHz */ TR1 = 1; /* TR1: timer 1 run */ EA = 1; /*打开总中断*/ ES = 1; /*打开串口中断*/ while (1) /*主循环不做任何动作*/ { } } void UART_SER (void) interrupt 4 //串行中断服务程序 { unsigned char Temp; //定义临时变量 if(RI) //判断是接收中断产生 { RI=0; //标志位清零 Temp=SBUF; //读入缓冲区的值 P1=Temp; //把值输出到P1口,用于观察 SBUF=Temp; //把接收到的值再发回电脑端 } if(TI) //如果是发送标志位,清零 TI=0; } 2.51单片机与电脑串口通信的C程序,最好是中断方式的 #include #include unsigned char ch; bit read_flag= 0 ; void init_serialcom( void ) //串口通信初始设定 { SCON = 0x50 ; //UART为模式1,8位数据, 允许接收 TMOD |= 0x20 ; //定时器1为模式2,8位自动重装 PCON |= 0x80 ; //SMOD=1; TH1 = 0xFD ; //Baud:19200 fosc="11".0592MHz IE |= 0x90 ; //Enable Serial Interrupt TR1 = 1 ; // timer 1 run

双单片机串口通信原理+程序

一、实验目的 掌握单片机串口通信的设计方法,了解双单片机通信的原理。 二、实验内容(含程序) 编写发送方和接受方单片机程序,让发送方单片机向接受方单片机循环发送几个两位十六进制数,并将发送的数显示在发送方和接受方的数码管上,要求串行口采用方式1进行通信,选用定时器T1作为波特率发生器,T1工作方式2,通信的波特率位9600。 硬件连接: 发送发程序:

#include #define uint unsigned int uchar table[]={0xaa,0xB5,0xdd,0xa8,0xba,0xcc,0xf4,0xb0}; //要发送的数据void delay(uint x) { uint i,j; for(i=x;i>0;i--) for(j=110;j>0;j--); } void main() { uchar i=0; TMOD=0x20; TH1=0xfd; TL1=0xfd; SM0=0; SM1=1; TR1=1; EA=1; ES=1; while(1) { SBUF=table[i]; P1=table[i]; while(!TI); TI=0; i++; if(i==8) i=0; delay(800);

} } 接收方程序: #include #define uchar unsigned char uchar a; void main() { TMOD=0x20; TH1=0xfd; TL1=0xfd; REN=1; TR1=1; SM0=0; SM1=1; EA=1; ES=1; while(1); } void ser() interrupt 4 { RI=0; a=SBUF; P1=a; } 三、实验结果及分析 本实验需要完成两个程序,发送方和接受方的,但是并没有要求

相关文档
相关文档 最新文档