51单片机笔记第三篇(串行通信三)

编程入门 行业动态 更新时间:2024-10-24 20:21:10

51<a href=https://www.elefans.com/category/jswz/34/1769836.html style=单片机笔记第三篇(串行通信三)"/>

51单片机笔记第三篇(串行通信三)

1、串口通信示例代码

(1)mian.c
#include "reg51.h"
#include "intrins.h"
#include "uart.h"//延时函数
void Delay(U16 j)  //约1ms
{      U8 i;for(;j>0;j--){ 	for(i=0;i<27;i++);}
}//----------------------------------------------
//main()功能描述:  AT89C51  11.0592MHz 	串口发 
//----------------------------------------------
void main()
{Uart_Init(); //串口初始化SendString("hello 51 uart");Delay(1);         //延时100US(12M晶振)while(1){  SendString("hello 51 uart");Delay(20000);}
}
(2)uart.c
#define UART_H_SELF
#include "reg51.h"
#include "intrins.h"
#include "uart.h"
//串口初始化函数
void Uart_Init() 
{#if (PARITYBIT == NONE_PARITY)SCON = 0x50;            //8-bit variable UART
#elif (PARITYBIT == ODD_PARITY) || (PARITYBIT == EVEN_PARITY) || (PARITYBIT == MARK_PARITY)SCON = 0xda;            //9-bit variable UART, parity bit initial to 1
#elif (PARITYBIT == SPACE_PARITY)SCON = 0xd2;            //9-bit variable UART, parity bit initial to 0
#endifTMOD = 0x20;            //Set Timer1 as 8-bit auto reload modeTH1 = TL1 = -(FOSC/12/32/BAUD); //Set auto-reload vauleTR1 = 1;                //Timer1 start runES = 1;                 //Enable UART interrupt 使能串口中断EA = 1;                 //Open master interrupt switch
}/*----------------------------
Send a byte data to UART
Input: dat (data to be sent)
Output:None
----------------------------*/
void SendData(U8 dat)
{while (busy);           //Wait for the completion of the previous data is sentACC = dat;              //Calculate the even parity bit P (PSW.0)if (P)                  //Set the parity bit according to P{
#if (PARITYBIT == ODD_PARITY)TB8 = 0;            //Set parity bit to 0
#elif (PARITYBIT == EVEN_PARITY)TB8 = 1;            //Set parity bit to 1
#endif}else{
#if (PARITYBIT == ODD_PARITY)TB8 = 1;            //Set parity bit to 1
#elif (PARITYBIT == EVEN_PARITY)TB8 = 0;            //Set parity bit to 0
#endif} busy = 1;SBUF = ACC;             //Send data to UART buffer
}/*----------------------------
Send a string to UART
Input: s (address of string)
Output:None
----------------------------*/
void SendString(U8 *s)
{while (*s)              //Check the end of the string{SendData(*s++);     //Send current char and increment string ptr}
}
(3)uart.hc
#ifndef __UART_H__
#define __UART_H__#ifdef 	UART_H_SELF#define UART_H_EXE
#else#define UART_H_EXE extern
#endif//=========================================================================================================
#define U8 unsigned char       /* defined for unsigned 8-bits integer variable 	  无符号8位整型变量  */
#define S8 signed   char       /* defined for signed 8-bits integer variable		  有符号8位整型变量  */
#define U16 unsigned int       /* defined for unsigned 16-bits integer variable 	  无符号16位整型变量 */
#define S16 signed   int       /* defined for signed 16-bits integer variable 	  有符号16位整型变量 */
#define U32 unsigned long      /* defined for unsigned 32-bits integer variable 	  无符号32位整型变量 */
#define S32 signed   long      /* defined for signed 32-bits integer variable 	  有符号32位整型变量 */
#define F32 float              /* single precision floating point variable (32bits) 单精度浮点数(32位长度) */
#define F64 double             /* double precision floating point variable (64bits) 双精度浮点数(64位长度) */
//=========================================================================================================//串口工作宏定义===========================================================================================
#define FOSC 11059200L      //System frequency 	系统晶振频率
#define BAUD 9600           //UART baudrate	 串口波特率/*Define UART parity mode UART奇偶校验模式*/
#define NONE_PARITY     0   //None parity  无奇偶校验
#define ODD_PARITY      1   //Odd parity 奇校验
#define EVEN_PARITY     2   //Even parity  偶校验
#define MARK_PARITY     3   //Mark parity
#define SPACE_PARITY    4   //Space parity#define PARITYBIT NONE_PARITY   //Testing even parity
//=========================================================================================================UART_H_EXE bit busy;
sbit bit9 = P2^2;           //P2.2 show UART data bit9void Uart_Init(); //初始化串口
void SendData(U8 dat);  //发送一个字节
void SendString(U8 *s); //发送字符串#endif
(4)interrupts.c
 #include "reg51.h"
#include "uart.h"
//串口中断入口
void Uart_Isr() interrupt 4 using 1
{if (RI){RI = 0;             //Clear receive interrupt flag 清除接收中断标志P0 = SBUF;          //P0 show UART data	   用P0口的把位的高低电平来展示接收的数据bit9 = RB8;         //P2.2 show parity bit	 用P2.2口的高低电平展示校验位SBUF=P0;         //将接收到的数据放入到发送寄存器while(!TI);      //等待发送数据完成TI=0;}if (TI){TI = 0;             //Clear transmit interrupt flag	  清除传输中断标志busy = 0;           //Clear transmit busy flag	 清除传输忙标志}
}

2、特别提示

  • 本人新手一枚,以上代码是我从网上整理加修改得到的代码,已编译调试成功,感谢代码的原创者。欢迎大家批评指正,共同进步。

更多推荐

51单片机笔记第三篇(串行通信三)

本文发布于:2024-02-26 17:12:38,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1703278.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:单片机   第三篇   通信   笔记

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!