演示STC89xx系列单片机串行口功能 (8-bit/9-bit)

  1 /*------------------------------------------------------------------------------------*/
  2 /* --- STC MCU Limited ---------------- ---------------------------------------*/
  3 /* ---演示STC89xx系列单片机串行口功能  (8-bit/9-bit) ----------------*/
  4 /* --- Mobile: (86)13922809991 -----------------------------------------------*/
  5 /* --- Fax: 86-755-82905966 ---------------------------------------------------*/
  6 /* --- Tel: 86-755-82948412 ----------------------------------------------------*/
  7 /* --- Web: www.STCMCU.com -----------------------------------------------*/
  8 /*如果要在程序中使用?在文章中引用该程序,   -----------------------*/
  9 /*请在程序中?文章中注明使用了STC的资料及程序   -----------*/
 10 /*-------------------------------------------------------------------------------------*/
 11 #include "reg51.h"
 12 #include "intrins.h"
 13
 14 typedef unsigned char    BYTE;
 15 typedef unsigned int    WORD;
 16
 17 #define FOSC    18432000L       /* System frequency 系统频率 */
 18 #define BAUD    9600            /* UART baudrate 波特率 */
 19
 20
 21 /*Define UART parity mode*/
 22 #define NONE_PARITY    0       /* None parity 奇偶*/
 23 #define ODD_PARITY    1       /* Odd parity 奇*/
 24 #define EVEN_PARITY    2       /* Even parity 偶*/
 25 #define MARK_PARITY    3       /* Mark parity */
 26 #define SPACE_PARITY 4       /* Space parity */
 27
 28
 29 #define PARITYBIT EVEN_PARITY   /* Testing even parity 测试*/
 30
 31 sbit    bit9 = P2 ^ 2;          /* P2.2 show UART data bit9 */
 32 bit    busy;
 33
 34 void SendData( BYTE dat );
 35
 36
 37 void SendString( char *s );
 38
 39
 40 void main()
 41 {
 42 #if (PARITYBIT == NONE_PARITY)
 43     SCON = 0x50;                                    /* 8-bit variable UART */
 44
 45 #elif (PARITYBIT == ODD_PARITY) || (PARITYBIT == EVEN_PARITY) || (PARITYBIT == MARK_PARITY)
 46     SCON = 0xda;                                    /* 9-bit variable UART, parity bit initial to 1 */
 47 #elif (PARITYBIT == SPACE_PARITY)
 48     SCON = 0xd2;                                    /* 9-bit variable UART, parity bit initial to 0 */
 49
 50
 51 #endif
 52
 53     TMOD    = 0x20;                                 /* Set Timer1 as 8-bit auto reload mode */
 54     //TH1    = TL1 = -(FOSC/12/32/BAUD);       /* Set auto-reload vaule */
 55     TH1    = 0xfd;
 56     TL1    = 0xfd;
 57     TR1    = 1;                                    /* Timer1 start run */
 58     ES    = 1;                                    /* Enable UART interrupt */
 59     EA    = 1;                                    /* Open master interrupt switch */
 60
 61     SendString( "STC89-90xx\r\nUart Test !\r\n" );
 62     while ( 1 );
 63 }
 64
 65
 66 /*----------------------------
 67 *  UART interrupt service routine
 68 *  ----------------------------*/
 69 void Uart_Isr() interrupt 4 using 1
 70 {
 71     if ( RI )
 72     {
 73         RI    = 0;    /* Clear receive interrupt flag */
 74         P0    = SBUF; /* P0 show UART data */
 75         bit9    = RB8;  /* P2.2 show parity bit */
 76     }
 77
 78
 79     if ( TI )
 80     {
 81         TI    = 0;    /* Clear transmit interrupt flag */
 82         busy    = 0;    /* Clear transmit busy flag */
 83     }
 84 }
 85
 86
 87 /*----------------------------
 88 *  Send a byte data to UART
 89 *  Input: dat (data to be sent)
 90 *  Output:None
 91 *  ----------------------------*/
 92 void SendData( BYTE dat )
 93 {
 94     while ( busy );               /* Wait for the completion of the previous data is sent */
 95     ACC = dat;              /* Calculate the even parity bit P (PSW.0) */
 96     if ( P )                /* Set the parity bit according to P */
 97
 98
 99     {
100 #if (PARITYBIT == ODD_PARITY)
101         TB8 = 0;        /* Set parity bit to 0 */
102 #elif (PARITYBIT == EVEN_PARITY)
103         TB8 = 1;        /* Set parity bit to 1 */
104
105
106 #endif
107     }else  {
108 #if (PARITYBIT == ODD_PARITY)
109         TB8 = 1;        /* Set parity bit to 1 */
110 #elif (PARITYBIT == EVEN_PARITY)
111         TB8 = 0;        /* Set parity bit to 0 */
112 #endif
113     }
114     busy    = 1;
115     SBUF    = ACC;          /* Send data to UART buffer */
116 }
117
118
119 /*----------------------------
120 *  Send a string to UART
121 *  Input: s (address of string)
122 *  Output:None
123 *  ----------------------------*/
124 void SendString( char *s )
125 {
126     while ( *s )                    /* Check the end of the string */
127
128     {
129         SendData( *s++ );       /* Send current char and increment string ptr */
130     }
131 }

原文地址:https://www.cnblogs.com/hulianxingkong/p/9097046.html

时间: 2024-11-03 03:45:53

演示STC89xx系列单片机串行口功能 (8-bit/9-bit)的相关文章

单片机串行口介绍

介绍 串行口是单片机与外界进行信息交换的工具,8051单片机的通信方式有两种: 并行通信:数据的各位同时发送或接收.       串行通信:数据一位一位次序发送或接收. 串行通信的方式 异步通信 用一个起始位0表示字符的开始,用停止位1表示字符的结束,中间夹着8个数据位,字符能一个接一个传送 CPU与外设之间必须有字符格式和波特率两项规定 字符格式规定能使双方把0和1串理解成同一种意义,原则上自由制定,通用角度使用标准如ASCII 波特率即数据传输速率,每秒传送的二进制位数,如120字符/s,每

十天学会单片机Day4串行口通信

并行与串行基本通信方式 1.并行通信方式 通常是将数据字节的各位用多条数据线同时进行传送. 并行通信控制简单.传输速度快:由于传输线较多,长距离传送时成本高且接收方的各位同时接收存在困难. 2.串行通信方式 是将数据字节分成一位一位的形式在一条传输线上逐个地传送. 串行通信传输线少,长距离传送时成本低,且可以利用电话网等现成的设备,但数据的传送控制比并行通信复杂. 3.异步串行通信方式 异步通信是指通信的发送与接收设备使用各自的时钟控制数据的发送和接收过程.为使双方的收发协调,要求发送和接收设备

5.USART异步串行口输入输出(轮询模式)

学习是一个简单的过程,只要有善于发掘的眼睛,总能学到新知识,然而如何坚持不懈的学习却很困难,对我亦如此,生活中有太多的诱惑,最后只想说一句勿忘初心.闲话不多扯,本篇讲诉的是异步串行口的输入输出,串口在外设中属于比较简单的通讯模式,但是在大型项目调试中又十分重要,理解该外设模块对于以后的通讯协议学习以及软件调试都有重要意义. 通讯协议是指双方实体完成通信或服务所必须遵循的规则和约定,对于串口来说,包含波特率,数据位长度,停止位和数据校验位,当stm32芯片和客户端具有相同的协议约定时即能够正确的接

使用CreateFile()打开COM10及以上串行口

程序调试时发现,使用CreateFile()打开COM4时正常,打开COM10时却总是失败.这两个端口均为虚拟COM口,通过蓝牙仿真串口完成数据收发,除了命名不同外,本质上并无任何不同. 而MSDN上对使用CreateFile()打开设备函数却失败返回并无详细解释,百思不得其解.上网百度一下找到了相关资料,原来是: Win32 API函数CreateFile()除了可打开普通文件外,还可以打开设备,比如可用于打开串口,获得串口句柄. 使用CreateFile()函数打开串口时文件共享模式应设置为

(九)串行口方式0 拓展并行输出端口 02 74LS164芯片

1.先讲解74LS164 移位芯片: 74HC164.74HCT164 是 8 位边沿触发式移位寄存器,串行输入数据,然后并行输出. 数据通过两个输入端(DSA 或 DSB)之一串行输入:任一输入端可以用作高电平使能端,控制另一输入端的数据输入.两个输入端或者连接在一起,或者把不用的输入端接高电平,一定不要悬空. 时钟 (CP) 每次由低变高时,数据右移一位,输入到 Q0, Q0 是两个数据输入端(DSA和 DSB)的逻辑与,它将上升时钟沿之前保持一个建立时间的长度. 主复位 (MR) 输入端上

串行口应用

方式2和方式3 方式2 和方式3都是为11位数据的异步通信口,他们的惟一区别是传输速率不同.TXD为数据发送引脚,RXD为数据接收引脚.用这两种方式传输数据时,起始位1位,数据位9位(含1位附加的第9位,发送时为SCON中的TB8,接收时为RB8),停止位1位,一贞数据为11位.方式2的波特率固定为晶振的1/64或1/32,方式3的波特率有定时器T1的溢出率决定.一贞数据传输格式 发送起始时,先把起始位0输出到TXD引脚,然后发送移位寄存器的输出位(D0)到TXD引脚.每一个移位脉冲都使输出移位

COM口,串行通讯端口,RS-232接口 基础知识

COM口即串行通讯端口. COM口的接口标准规范和总线标准规范是RS-232,有时候也叫做RS-232口.电脑上的com口多为9针,最大速率115200bps.通常用于连接鼠标(串口)及通讯设备(如连接外置式MODEM进行数据通讯)等.但目前主流的主板一般都只带1个串口,甚至不带,慢慢会被USB 取代. 以前用于连接老式的COM口鼠标键盘,还有链接路由器,外置调制解调器等.现在很少使用. 什么是串口,串行通讯端口?-----------------------------------------

单片微机原理P4:80C51串口与串行总线拓展

0. 串口通讯 0. 串口通讯的数据传输方式:单工(单向传输数据),半双工(非同时双向传输),全双工(同时,双向传输) 1. 根据通信方式的不同又分为同步通讯和异步通讯. 同步通讯:所有设备都使用同一个时钟,称为同步时钟.在数据传送时,以若干个数据字符(称为数据块)为单位进行传输,每个数据块包括同步字符.数据块和校验字符CRC. 异步通信是指在串行通信中,接收设备和发送设备有各自的时钟信号,异步通信以字符为单位进行数据传送,不过通信中这些时钟频率必须保持一致. 2. 波特率和比特率 波特率是每秒

串行工作模式之同步移位寄存器的输入输出方式

主要用于扩展并行输入或输出口.数据有RXD(P3.0)引脚输入或输出,同步移位脉冲由TXD(P3.1)引脚输出.发送和接受均为8位数据.低位在前,高位在后. //串行口工作模式0 #include <reg52.h> #define uchar unsigned char #define uint unsigned int void delayms(uint xms) { uint i,j; for(i=xms;i>0;i--) for(j=110;j>0;j--); } void