打印
[学习资料]

串口通信模块C实现

[复制链接]
1986|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
qcliu|  楼主 | 2021-7-6 13:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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


使用特权

评论回复
沙发
qcliu|  楼主 | 2021-7-6 13:36 | 只看该作者
2.串口通讯源/实现文件 usart.c

/******************************************/
/*Author:Shen Chucu  All Rights Reserved!**
/*Tsinghua University
/*2016-11-15
/********************************************/
#include <pic.h>
#include <stdio.h>
#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);
      }   
   }
}  



使用特权

评论回复
板凳
qcliu|  楼主 | 2021-7-6 13:36 | 只看该作者
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  
    }
}



使用特权

评论回复
地板
qcliu|  楼主 | 2021-7-6 13:37 | 只看该作者

void delay(unsigned int x)
{
    unsigned int a,b;  //延时时间110x
    for(a=x;a>1;a--)
       for(b=110;b>1;b--)
          ;
}


使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

62

主题

3308

帖子

4

粉丝