PIC单片机精通_串口通信模块C实现
2018-07-30 来源:eefocus
1.串口通讯头/定义文件 usart.h
#ifndef _SERIAL_H_
#define _SERIAL_H_
#define BAUD 9600
#define FOSC 9216000L
#define NINE 0 /* Use 9bit communication? FALSE=8bit */
#define DIVIDER ((int)(FOSC/(16UL * BAUD) -1))
#define HIGH_SPEED 1
#if NINE == 1
#define NINE_BITS 0x40
#else
#define NINE_BITS 0
#endif
#if HIGH_SPEED == 1
#define SPEED 0x4
#else
#define SPEED 0
#endif
#if defined(_16F87) || defined(_16F88)
#define RX_PIN TRISB2
#define TX_PIN TRISB5
#else
#define RX_PIN TRISC7
#define TX_PIN TRISC6
#endif
/* Serial initialization */
//'\'是对函数内属性的定义 不可缺少
#define init_comms()\
RX_PIN = 1; \
TX_PIN = 1; \
SPBRG = DIVIDER; \
RCSTA = (NINE_BITS|0x90); \
TXSTA = (SPEED|NINE_BITS|0x20)
void putch(unsigned char);
unsigned char getch(void);
unsigned char getche(void);
#endif
2.串口通讯源/实现文件 usart.c
/******************************************/
/*Author:Shen Chucu All Rights Reserved!**
/*Tsinghua University
/*2016-11-15
/********************************************/
#include
#include
#include 'usart.h'
__CONFIG(0x3ffa);
void delay(unsigned int x);
static int label=0; //不做事件响应
void main()
{
INTCON=0x00;
GIE=1;
PEIE=1;
RCIE=1;
init_comms();
CREN=1;
SPEN=1;
while(1)
{//等待中断 并进行事件响应设定
if(label==1)
{
printf('OK');
label = 0; //发送一个回馈信号即可
delay(50);
}
if(label==2)
{
printf('ERROR');
label = 0; //发送一个回馈信号即可
delay(50);
}
}
}
void interrupt IsReceive()
{
if(RCIE&&RCIF==1) //接受中断使能位 + 接收中断标志位
{
unsigned char temp=RCREG; //把上位机发送的数据保存下来
if(temp=='S')
{
label=1; //发送数据标志 1
}
else if(temp=='E')
{
label=0; //发送数据标志 0
}
else
label=2; //发送数据标志 2
}
}
void delay(unsigned int x)
{
unsigned int a,b; //延时时间110x
for(a=x;a>1;a--)
for(b=110;b>1;b--)
;
}