单片机笔记第三篇(串行通信三)"/>
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单片机笔记第三篇(串行通信三)
发布评论